【问题标题】:GLSL Texturing Multiple FragmentsGLSL 纹理多个片段
【发布时间】:2014-12-15 10:09:57
【问题描述】:

我正在尝试使用着色器管道 (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。

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

【问题讨论】:

    标签: objective-c opengl-es glsl


    【解决方案1】:

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

    所以把你的代码改成:

    glUniform1i(..., 0);
    

    【讨论】:

    • 这修复了错误,只有一个纹理会显示的原因是我的其他纹理有 alpha 并且我没有启用混合,所以它们显示为白色矩形。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多