我有一個正常運行的OpenGL ES 3程序(iOS),但我很難理解OpenGL紋理。我試圖在屏幕上渲染幾個四邊形,所有這些都具有不同的紋理。這些紋理都是256色的彩色圖像,並帶有特殊調色板。OpenGL ES 3(iOS)紋理奇怪 - 想知道爲什麼
這是C++代碼,發送紋理着色器
// THIS CODE WORKS, BUT I'M NOT SURE WHY
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, _renderQueue[idx]->TextureId);
glUniform1i(_glShaderTexture, 1); // what does the 1 mean here
glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, _renderQueue[idx]->PaletteId);
glUniform1i(_glShaderPalette, 2); // what does the 2 mean here?
glDrawElements(GL_TRIANGLES, sizeof(Indices)/sizeof(Indices[0]), GL_UNSIGNED_BYTE, 0);
這是片段着色器
uniform sampler2D texture; // New
uniform sampler2D palette; // A palette of 256 colors
varying highp vec2 texCoordOut;
void main()
{
highp vec4 palIndex = texture2D(texture, texCoordOut);
gl_FragColor = texture2D(palette, palIndex.xy);
}
正如我所說的,代碼工作,但我不確定它爲什麼起作用。幾個看似微小的變化打破了它。例如,在C++代碼中使用GL_TEXTURE0
和GL_TEXTURE1
將其分解。將glUniform1i
中的數字更改爲0,並將其分解爲1。我猜我不明白OpenGL 3+中的紋理(可能是紋理單元???),但需要一些指導來弄清楚什麼。
@sevensevens ...並且'GL_TEXTURE0'是第一個紋理單元,而不是'GL_TEXTURE1';此外,枚舉'GL_TEXTUREn'保證爲'GL_TEXTURE0 + n'。所以如果你想將'2'分解爲一個單獨的變量或常量,你的代碼可以表示爲'glActiveTexture(GL_TEXTURE0 + 2)... glUniform1i(_glShaderPalette,2)'。但Mobile Ben的回答涵蓋了重要的一點。 – Tommy 2014-12-03 02:46:28