2010-11-02 132 views
1

我正在嘗試將我的固定管線代碼(OpenGL ES 1.1)轉換爲使用着色器管線(OpenGL ES 2.0)的代碼。但是隻有一個紋理似乎工作,我得到的錯誤:GLSL紋理多個片段

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。

任何有關爲何發生這種情況的任何想法?

回答

5

採樣器的glUniform1i參數在[0:MAX[範圍內,而不是[GL_TEXTURE0:GL_TEXTURE0+MAX[

所以更改您的代碼:

glUniform1i(..., 0); 
+0

這種固定的錯誤,只有一個紋理會顯示的原因是,我的其他紋理有α和我沒有啓用混合,所以他們顯示爲白色矩形。 – 2010-11-03 11:48:44