gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:17:37 25 4
gpt4 key购买 nike

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

2012-12-01 14:21:56.707 medicare[6414:14303] Program link log:
WARNING: Could not find vertex shader attribute 'color' to match BindAttributeLocation request.
WARNING: Output of vertex shader 'colorVarying' not read by fragment shader
[Switching to process 6414 thread 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;
}

很简单。非常感谢!

最佳答案

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

And I use glBindAttibLocation to pass position and normal data like this:

不,你不知道。 glBindAttribLocation “将通用顶点属性索引与命名属性变量相关联”。它不传递数据。它将索引(闪烁)与变量相关联。您稍后可以通过以下方式传递内容:glVertexAttribPointer。

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

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

关于ios - 片段着色器未读取顶点着色器 'colorVarying' 的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13657076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com