GLSL纹理化多个片段

时间:2010-11-02 17:05:45

标签: objective-c opengl-es glsl

我正在尝试使用着色器管道(OpenGL ES 2.0)将我的固定管道代码(OpenGL ES 1.1)转换为一个。然而,只有一个纹理似乎工作,我得到错误:

Validation Failed: Sampler error:
Samplers of different types use the same texture image unit.
- or -
A sampler's texture unit is out of range (greater than max allowed or negative).

在我的片段着色器中,我有一个统一的纹理ID和从我的顶点着色器中传来的纹理坐标:

varying lowp vec4 colorVarying;
varying lowp vec2 texCoordsVarying;

uniform sampler2D texID;

void main()
{
    lowp vec4 colour = texture2D(texID, texCoordsVarying);
    gl_FragColor = colour * colorVarying;
}

据我所知,因为我只使用一个纹理,所以我只需要一个活动纹理单元。因此,在我的管道中,我通过激活适当的纹理单元,绑定当前纹理并将纹理ID的统一值设置为纹理单元来设置纹理。然后我继续绘制顶点。

这是我管道的纹理部分:

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, ((MNTexturedRect*)object).texID);
glUniform1i(uniforms[UNIFORM_TEXTURE], GL_TEXTURE0);

glVertexAttribPointer(ATTRIB_TEXTURE_COORDS, 2, GL_FLOAT, GL_FALSE, object.dataPerPoint*sizeof(GLfloat), &points[((MNTexturedRect*)object).texCoordOffset]);
glEnableVertexAttribArray(ATTRIB_TEXTURE_COORDS);

我认为纹理ID一致的事实导致问题,但不确定如何解决它。我有几个对象,看起来只有第一个纹理加载实际上似乎工作。我只有取样器并且不太确定它为什么会抱怨使用相同的纹理单元,而且我的纹理单位在范围内,因为它只是GL_TEXTURE0。

有人想知道为什么会这样吗?

1 个答案:

答案 0 :(得分:5)

采样器的glUniform1i参数在[0:MAX[范围内,而不是[GL_TEXTURE0:GL_TEXTURE0+MAX[

所以请将您的代码更改为:

glUniform1i(..., 0);