2013-02-16 114 views
1

我是OpenGL中的新手,並試圖獲得2個紋理之間的顏色差異。 這是我的初始化函數:如何正確綁定2個紋理

glGenTextures(1, &TEX0); 
glBindTexture(GL_TEXTURE_2D, TEX0); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); 


glGenTextures(1, &TEX1); 
glBindTexture(GL_TEXTURE_2D, TEX1); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); 

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, MODE, GL_UNSIGNED_BYTE, BUFFER0); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, MODE, GL_UNSIGNED_BYTE, BUFFER1); 

這是我的顯示FUNC:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glLoadIdentity(); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glColor3f(1.0f, 1.0f, 1.0f); 
glEnable(GL_TEXTURE_2D); 

glUseProgram(shader); 

glActiveTexture(GL_TEXTURE0 + 0); 
glBindTexture(GL_TEXTURE_2D, TEX0); 
glActiveTexture(GL_TEXTURE0 + 1); 
glBindTexture(GL_TEXTURE_2D, TEX1); 

glUniform1i(glGetUniformLocation(shader, "tex0"), 0); 
glUniform1i(glGetUniformLocation(shader, "tex1"), 1); 

glBegin(GL_QUADS); 
glTexCoord2f(0,0); glVertex2f(-1,-1); 
glTexCoord2f(0,1); glVertex2f(-1,+1); 
glTexCoord2f(1,1); glVertex2f(+1,+1); 
glTexCoord2f(1,0); glVertex2f(+1,-1); 
glEnd(); 

glDisable(GL_TEXTURE_2D); 
glUseProgram(0); 
glFlush(); 
glutSwapBuffers(); 

而且這是我的片段着色器:

uniform sampler2D tex0; 
uniform sampler2D tex1; 

void main() 
{ 
    vec4 otex = texture2D(oframe, gl_TexCoord[0].st); 
    vec4 ntex = texture2D(nframe, gl_TexCoord[0].st); 
    gl_FragColor = vec4(abs(otex.rgb - ntex.rgb), 1.0); 
} 

所以問題是第一個啓動的紋理總是黑色。如何解決這個問題? 有很多類似的話題,但他們都沒有幫助我。謝謝。

回答

5

第一個錯誤:OpenGL是一個狀態機。調用glTexImage對當前選擇的紋理單元中的當前綁定紋理進行效果。

glGenTextures(1, &tex0); 
glBindTexture(GL_TEXTURE_2D, tex0); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, MODE, GL_UNSIGNED_BYTE, BUFFER0); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

glGenTextures(1, &tex1); 
glBindTexture(GL_TEXTURE_2D, tex1); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, MODE, GL_UNSIGNED_BYTE, BUFFER1); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

,如果glTexImage到來之前或glTexEnv的glTexParameter後其實並不重要,它仍然可以正常工作:你必須這樣寫。既然你正在使用片段着色器glTexEnv是沒有用的。 glTexEnv可以設置的所有內容已被片段着色器中表達式的多功能性所取代。

+0

感謝您的解釋。現在它按預期工作。 – 2013-02-16 20:43:35