【问题标题】:When using glVertexAttribPointer, what index should I use for the gl_Normal attribute?使用 glVertexAttribPointer 时,我应该为 gl_Normal 属性使用什么索引?
【发布时间】:2016-07-14 23:43:10
【问题描述】:

我将普通数据缓冲到一个 VBO,然后使用 glVertexAttribPointer 指向它:

glVertexAttribPointer(<INDEX?>, 3, GL_FLOAT, GL_FALSE, 0, NULL);

但是,如果我希望将数据绑定到着色器中的 gl_Normal 属性,我应该为第一个参数(索引)使用什么值?

我使用的是 NVidia 卡,我在这里读到 https://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/attributes.php 对于这些类型的卡,gl_Normal 始终位于索引 2。但是我怎么知道 gl_Normal 在其他卡的这个索引处呢?

另外,使用 2 的索引似乎不起作用,并且着色器中的 gl_Normal 数据都是 (0,0,0)。

我知道 glGetAttribLocation 和 glBindAttribLocation,但是文档明确指出,如果尝试使用以“gl_”开头的内置顶点属性之一,该函数将引发错误。

编辑: 将 OpenGL 3.0 与 GLSL 130 结合使用。

【问题讨论】:

    标签: c++ opengl


    【解决方案1】:

    你没有。使用核心配置文件和 VAO 时,不存在任何固定功能顶点属性。

    在着色器中为法线定义自己的顶点属性:

    in vec3 myVertexNormal;
    

    获取属性位置(或bind it to a location of your choice):

    normalsLocation = glGetAttribLocation(program, "myVertexNormal");
    

    然后将glVertexAttribPointer 与位置一起使用:

    glVertexAttribPointer(normalsLocation, 3, GL_FLOAT, GL_FALSE, 0, NULL);
    

    在核心配置文件中,您还必须对位置、纹理坐标等执行此操作。 OpenGL 实际上并不关心数据是什么,只要您的顶点着色器为 gl_Position 分配了一些东西,而您的片段着色器为其输出分配了一些东西。

    如果您坚持使用已弃用的固定功能属性和gl_Normal,请改用glNormalPointer。

    【讨论】:

    • 嘿。我正在使用 glsl 130,我可能应该提到,所有的 'in' 和 'out' 关键字都不存在(我的错!)它仍然是一个类似的过程吗?
    • @ipe369 在顶点着色器中将in 替换为attribute。
    • @ipe369: "嘿。我使用的是 glsl 130,我可能应该提到,所有的 'in' 和 'out' 关键字都不存在"它们确实存在于 1.30 中。它们在 1.30 中引入。它是 1.20(GL 2.1 使用的 GLSL 版本),它们不存在。
    • 真的吗?那么 1.3 和 3.3 到底有什么区别呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多