【问题标题】:OpenGL ES 2.0 - Can't find Attribute in Vertex ShaderOpenGL ES 2.0 - 在顶点着色器中找不到属性
【发布时间】:2011-08-26 10:17:01
【问题描述】:

我已经为此寻找了一段时间的答案 - 但我运气不佳。 我要做的就是将我的正常数据传递到我的顶点着色器中。位置正确传递,但是在尝试加载着色器时收到“未找到正常属性”错误。

我的 ATTRIB 值是枚举。

我在 OpenGL ES 2.0 中为 Iphone 开发创建了一个立方体。

我的 Shader.vsh 看起来像这样:

attribute vec4 normal;
attribute vec4 position;

varying vec4 colorVarying;

uniform mat4 mvp_matrix;

void main()
{
    //Trasform the vertex
    gl_Position = mvp_matrix * position;

    colorVarying = vec4(1.0, 1.0, 0.0, 0.0);
}

我在并条框中更新属性值的部分如下所示:

// Update attribute values.
glVertexAttribPointer(ATTRIB_VERTEX, 3, GL_FLOAT, 0, 0, cubeVerticesStrip);
glEnableVertexAttribArray(ATTRIB_VERTEX);
glVertexAttribPointer(ATTRIB_NORMAL, 3, GL_FLOAT, 0, 0, cubeNormalsStrip);
glEnableVertexAttribArray(ATTRIB_NORMAL);

我在 LoadShader 函数中绑定这些的部分是这样的:

glBindAttribLocation(program, ATTRIB_VERTEX, "position");
glBindAttribLocation(program, ATTRIB_NORMAL, "normal");

同样,这个职位有效。但是找不到“正常”。有什么想法吗?

【问题讨论】:

  • 我希望您在链接之前进行这些glBindAttribLocation 调用,否则它们不会有任何效果。

标签: iphone opengl-es shader vertex


【解决方案1】:

normal 找不到,因为您的 GLSL 编译器很智能。它发现你实际上并没有 normal,所以它假装它不存在以节省资源。

此外,您的法线和位置应该是vec3,因为您只传递了 3 个值。这不是严格要求,但最好是让您的输入和属性匹配。

【讨论】:

  • 我根据您的建议更改了着色器,但仍然收到错误消息。我使用 normal.x 作为我的颜色变量之一。程序链接失败。
  • @Ben:你从来没有说过这是一个 linker 错误;你刚才说“找不到‘正常’”。究竟是什么错误?
  • @Ben 链接器错误可能是由于不同名称不匹配造成的。你的片段着色器是什么样的?
  • 谢谢尼可波拉斯!我花了大约两个小时试图理解为什么我不能传递一个属性顶点数组。你拯救了我的睡眠;)
猜你喜欢
  • 1970-01-01
  • 2016-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多