2

如下图,错误很奇怪。我在 iPad 程序中使用 OpenGLES 2.0 和着色器,但代码或项目配置似乎有问题。模型完全没有颜色(黑色)绘制。

2012-12-01 14:21:56.707 医疗保险 [6414:14303] 程序链接日志:
警告:找不到与 BindAttributeLocation 请求匹配的顶点着色器属性“颜色”。
警告:片段着色器未读取顶点着色器“colorVarying”的输出
[切换到进程 6414 线程 0x1ad0f]

glBindAttibLocation用来传递位置和正常数据,如下所示:

// This needs to be done prior to linking.
glBindAttribLocation(_program, INDEX_POSITION, "position");
glBindAttribLocation(_program, INDEX_NORMAL, "normal");

glBindAttribLocation(_program, INDEX_COLOR, "color"); //pass color to shader

我的项目中有两个着色器。那么对于这个奇怪的错误有什么好的解决方案吗?非常感谢!

我的顶点着色器:

uniform mat4 modelViewProjectionMatrix;
uniform mat3 normalMatrix;

attribute vec4 position;
attribute vec3 normal;
attribute vec4 color;

varying lowp vec4 DestinationColor;
void main()
{
    //vec4 a_Color = vec4(0.9, 0.4, 0.4, 1.0);
    vec4 a_Color = color;
    vec3 u_LightPos = vec3(1.0, 1.0, 2.0);

    float distance = 2.4;
    vec3 eyeNormal=normalize(normalMatrix * normal);

    float diffuse = max(dot(eyeNormal, u_LightPos), 0.0); // remove approx ambient light
    diffuse = diffuse * (1.0 / (1.0 + (0.25 * distance * distance)));
    DestinationColor = a_Color * diffuse; // average between ambient and diffuse   a_Color * (diffuse + 0.3)/2.0;

    gl_Position = modelViewProjectionMatrix * position;
}

我的片段着色器是:

varying lowp vec4 DestinationColor;

void main()
{
  gl_FragColor = DestinationColor;
}

很简单。非常感谢!

4

1 回答 1

2

我认为这里有一些问题。首先,您对属性的使用可能不正确。属性就像一个元素,每个顶点都会发生变化。你有颜色作为数据结构中的元素吗?因为如果不是,着色器将无法正常工作。

我使用 glBindAttibLocation 来传递位置和正常数据,如下所示:

不,你没有。glBindAttribLocation “将通用顶点属性索引与命名属性变量相关联”。它不传递数据。它将索引(闪烁)与变量相关联。您稍后使用:glVertexAttribPointer 传递内容。

我什至不使用绑定..我这样做 - 设置属性:

glAttributes[PROGNAME][A_vec3_vertexPosition] = glGetAttribLocation(glPrograms[PROGNAME],   "a_vertexPosition");
glEnableVertexAttribArray(glAttributes[PROGNAME][A_vec3_vertexPosition]);

然后在调用 glDrawElemetns 之前将您的指针传递给它,以便它可以获取数据:

glVertexAttribPointer(glAttributes[PROGNAME][A_vec3_vertexPosition], 3, GL_FLOAT, GL_FALSE, stride, (void *) 0);

在那里,我使用了一个名为 glAttributes 的二维整数数组来保存我的所有属性索引。但是你可以像现在一样使用闪烁。

错误消息告诉您出了什么问题。在您的顶点着色器中,您说:

attribute vec4 color;

但是在下面你也有一个a_Color:

DestinationColor = a_Color * diffuse;

与您的变量名称保持一致。我现在把 a_ v_ 和 u_ 放在我所有的前面,以试图弄清楚它是什么类型的变量。你所说的 a_ 确实有变化。

我还怀疑错误消息不是来自您发布的相同版本的着色器和代码,因为错误:

WARNING: Output of vertex shader 'colorVarying' not read by fragment shader

即使在这个版本的顶点着色器中,关于 colorVarying 的错误也会令人困惑。重新发布当前版本的着色器以及您从中获得的错误消息,这样会更容易为您提供帮助。

于 2013-03-14T03:37:30.140 回答