2013-03-07 2 views
2

제 프로그램에서는 2 개의 텍스처를 사용합니다 : t0와 t1. T1은 일부 경우에 필요한 추가입니다 : 드로잉OpenGL에서 제로 텍스처 바인딩하기

..... 
glActiveTexture (GL_TEXTURE1); 
if (mDisplayMode == EDM_DEFAULT){ 
    glBindTexture(GL_TEXTURE_2D, 0); // In this case I don't need t1 
}else{ 
    glBindTexture(GL_TEXTURE_2D, mglDegreeTexture); // In this case t1 will overlap t0 
} 
shader->setUniformValue("textureId1", 1); 

쉐이더 : 그것은

..... 
vec4 c1 = texture(textureId0, uv); 
vec4 c2 = texture(textureId1, gridUV); 
float a = c2.a; 
gl_FragColor = (1.0 - a)*c1 + a*c2; 

잘 작동 : 두 번째 텍스처 중복이 먼저 필요할 때. glBindTexture (.., 0)를 사용하면 0 텍스처 (0,0,0,0)를 반환한다고 가정하지만, NVidia 드라이버를 314.07로 업데이트 한 후 glBindTexture (.., 0)와 같은 검은 화면이 생깁니다. return (0,0 , 0, 1) 텍스처.

나는 몇 가지 테스트를 수행합니다 쉐이더

.... 
vec4 c1 = texture(textureId0, uv); 
vec4 c2 = texture(textureId1, gridUV); 
float a = c2.a; 
if (a == 1){ 
    gl_FragColor = vec4(1,0,0,0); 
    return; 
} 
if (a == 0){ 
    gl_FragColor = vec4(0,1,0,0); 
    return; 
} 
gl_FragColor = (1.0 - a)*c1 + a*c2; 

으로 나는 새에 이전 드라이버 (296, 306), 빨간색 녹색 화면을 얻을. 필자는 Win 7 (GeForce 210) 및 XP (GTX 260)로 2 대의 컴퓨터에서 테스트했습니다.

내 질문은 : 두 번째 매개 변수로 0 glBindTexture 사용하고 올바른 결과 (0000 질감) 새 드라이버를 어떻게 얻을 수 있습니까?

답변

6

다음은 핵심 프로파일 3.2를 나타내지 만 일반적으로 모든 버전의 GL에 적용됩니다.

이름 0은 기본 텍스처 개체 (텍스처 대상 당 하나 : 1d, 2d, ... 3.8.14, 마지막 단락 참조)에 해당합니다.

그래서 glBindtexture(2D, 0);은 기본 텍스처 개체를 가져옵니다. 이 아님은 텍스처 사용 안 함을 의미합니다. 이제 기본 객체의 텍스쳐링은 평상시의 작업으로 귀결되지 않습니다. 초기 텍스처 오브젝트는 처음에는 불완전하므로, 수정하지 않으면 "불완전한"규칙에 따라 동작합니다.

이제 사양에서는 (3.9.2, 질감 액세스 단락) 불완전한 질감에서 샘플링하면 (0,0,0,1)이 반환됩니다.

그래서 이전 드라이버는 사양에 따라 작동하지 않았습니다.

+0

좋아요! "0"텍스처로 (0,0,0,0)을 사용하는 것은 매우 논리적이었습니다 (기본 텍스처를 정의하는 방법이 있는지 알 수 없었습니다). – Jeka

+1

@Jeka : 다른 텍스처와 비슷하므로 예를 들어 1x1 RGBA 텍스처로 설정하면 0,0,0,0을 가진 단일 텍셀로 그 내용을 처리 할 수 ​​있습니다. 그렇게하면 사용하게 될 것입니다. 그런 식으로 사용하는 것이 일반적이지 않으므로 혼동 할 수 있습니다 아무도 당신의 코드를 읽고 (오, 그리고 잠재적으로 더 많은 드라이버 버그를 찾는다) – Bahbar

+0

재미 있네;) 1x1 RGBA 텍스처가 현재 해결책이지만, 0으로 바인딩하려고하지 않는다. – Jeka

관련 문제