顶点着色器'colorVarying'的输出未被片段着色器读取

时间:2012-12-01 06:33:56

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

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

  

2012-12-01 14:21:56.707 medicalare [6414:14303]节目链接日志:
   警告:找不到顶点着色器属性'color'以匹配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;
}

很简单。非常感谢!

1 个答案:

答案 0 :(得分: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的二维int数组来保存我的所有属性索引。但你可以像现在一样使用闪光。

错误消息告诉您哪里出错了。在您的顶点着色器中,您说:

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的错误令人困惑,因为它甚至不适用于此版本的顶点着色器。重新发布当前版本的着色器以及从中获取的错误消息,这将更容易为您提供帮助。