2013-02-16 2 views
1

저는 OpenGL에서 초보자이며 2 개의 텍스처간에 색상 차이를 얻으려고합니다. 그것은 내 init 함수입니다 :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

설명해 주셔서 감사합니다. 이제 예상대로 작동합니다. –

관련 문제