顶点着色器中的属性参数

时间:2011-06-29 08:06:52

标签: opengl-es glsl opengl-es-2.0

我正在使用pvrsdk在ubuntu 10.10中使用Opengl-es 2.0。 在我的代码中,我采用三角形的顶点进行渲染,但是当我必须在顶点着色器中使用Attribute参数时。它是如何改变的

我在示例中看到他们正在使用myVertex。是什么意思。

像这样:

const char* pszVertShader = "\
    attribute highp vec4    myVertex;\
    uniform mediump mat4    projmatrix;\
    invariant gl_Position;\
    void main(void)\
    {\
        gl_Position = projmatrix * myVertex;\
    }";


===============================render======================
glBindAttribLocation(uiProgramObject, VERTEX_ARRAY, "myVertex");

所以我只想知道我从文本文件中获取顶点会影响myVertex属性。

如果您需要我可以提供给您的其他信息,我已将我的整个代码发布在上一个问题here

1 个答案:

答案 0 :(得分:2)

OpenGL 3 / OpenGL-ES 2放弃了预定义顶点属性“position”,“normal”,“texcoord”,......的概念,它们通过glVertexPointer,glNormalPointer,glTexCoordPointer,...提供......

而是在着色器中引入自定义varyings / in属性标识符。这些标识符由所谓的属性位置(数字索引)引用。 glBindAttribLocation允许用户将属性标识符分配给特定位置。在上面的代码片段的情况下,似乎存在一个全局常量VERTEX_ARRAY - 由程序代码(!)引入,即不是由OpenGL预定义或类似的东西 - 这是普遍用于myVertex着色器中的vary / in属性。

这样,特定的顶点属性可以通过glVertexAttribPointer通过公共标记VERTEX_ARRAY在类似的语句中提供数据:

glVertexAttribPointer(VERTEX_ARRAY, 3, GL_FLOAT, false, 0, isVBO ? (char*)vertex.offset : (char*)vertex.data + vertex.offset);

当然glVertexAttribPointer调用的确切语义取决于执行它们的特定程序。

您可以使用变量VERTEX_ARRAY代替(全局)常量shader.attrib.vertex,您可以使用

为每个着色器设置
shader.attrib.vertex = glGetAttribLocation(shader.program_object, "myVertex");

并在调用glVertexAttribPointer

时使用该变量
glVertexAttribPointer(shader.attrib.vertex, …)