-1

我正在通过一本在 Premake 4 平台中使用 OpenGL 3.3 版的好书来学习 OpenGL,但我实际上想学习适用于 Android 的 OpenGL,它支持 OpenGL 2.0 版。它几乎相同,因为概念是相同的,但我在使用着色器语言代码时遇到了一些问题。

例如,在书中,autor 使用以下代码实现了一个顶点着色器:

#version 330

layout(location = 0) in vec4 position;

void main(){
  gl_Position = position;
}

经过大量研究,我能够使用以下代码在 Android 中实现这个完全顶点着色器代码:

String vertexShaderCode =
        "attribute vec4 vPosition;" +
        "void main() {" +
        "  gl_Position = vPosition;" +
        "}";

但我不知道如何在下面实现这个顶点着色器:

#version 330

layout (location = 0) in vec4 position;
layout (location = 1) in vec4 color;

smooth out vec4 theColor;

void main() {
  gl_Position = position;
  theColor = color;
}

这本书是http://arcsynthesis.org/gltut/Basics/Tut02%20Vertex%20Attributes.html

4

1 回答 1

3

您无法实现着色器,因为它是用 OpenGL ES 2.0 编写的。此着色器是针对 OpenGL 3.3 GLSL 规范编写的,OpenGL ES 2.0 使用的语法大致相当于 GLSL 120 (OpenGL 2.1)。

  • 限定符用于控制着色器阶段之间的smooth插值,GLSL ES 不支持这一点,所有顶点着色器输出都在 GLSL ES 中平滑插值。

  • layout (...)GLSL ES 不支持,您必须使用glBindAttribLocation (...)来设置位置。

  • in并且out不受 GLSL ES 支持,您必须attribute用于顶点着色器输入以及varying顶点着色器输出和片段着色器输入。

最后,#version 330无效。在 OpenGL ES 2.0 中,只有一个 GLSL ES 规范,版本 1.0(因此兼容的 OpenGL ES 2.0 着色器应该以 开头#version 100)。

要回答有关实现该特定顶点着色器的问题:

#version 100

attribute vec4 position;
attribute vec4 color;

varying   vec4 theColor;

void main() {
  gl_Position = position;
  theColor    = color;
}

这当然只是等式的一半,您需要将它与也使用符合 OpenGL ES 2.0 的语法的片段着色器配对。

可以与此顶点着色器一起使用的最小片段着色器:

#version 100

varying vec4 theColor; // In GLSL 330 this would be written as: in vec4 theColor;

void main (void) {
  gl_FragColor = theColor;
}
于 2013-11-06T01:05:07.323 回答