2012-04-07 3 views
5

GeForce 330m에서 실행중인 Geometry 쉐이더에서 정수 텍스처를 샘플링하려고합니다. 텍스처에로드하는 것보다 다른 값을 반환하는 것 같습니다. 나는 질감을 생성하고로드하기 위해이 코드를 (기본적으로) 사용OpenGL Geometry 쉐이더 정수 텍스처 가져 오기가 실패합니다.

glGenTextures(1, &textureId); 
glBindTexture(GL_TEXTURE_2D, textureId); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32I, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 
glBindTexture(GL_TEXTURE_2D, 0); 
glBindTexture(GL_TEXTURE_2D, textureId); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32I, w, h, 0, GL_RGBA, GL_INT, <some 0-initialized large enough buffer>); 
glBindTexture(GL_TEXTURE_2D, 0); 
glBindTexture(GL_TEXTURE_2D, textureId); 
    int data[] = { 3, 0, 36, 400 }; 
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 3, 1, 1, GL_RGBA, GL_INT, data); 
glBindTexture(GL_TEXTURE_2D, 0); 

아이디어는 특정의 한 픽셀이 그때 내 지오메트리 쉐이더에서 이것을 사용 (400)의 w 값이 설정되어 있다는 것입니다 :

#version 330 
#extension GL_EXT_gpu_shader4 : require 
uniform isampler2D models; 

void main() 
{ 
    ivec4 modelstats4 = texelFetch2D(models, ivec2(0, 3), 0); 
// ivec4 modelstats4 = ivec4(3, 0, 36, 400); 
    if (modelstats4.w > height) { 
     // emit something 
    } 
} 

평등해야하는 주석 처리 된 고정 값을 사용하면 뭔가가 방출됩니다 (IE, 1 점). 실제 텍셀 가져 오기를 사용하면 아무 것도 반환하지 않습니다. 내가 아는 모든 값은 영향을 미칠 수 있으므로 현재 하드 코딩되어 있으므로 이것이 작동하지 않는 이유를 알 수 없습니다. 이것은 전체 코드 (OO 설정, 살펴볼 많은 것들)가 아니지만, 이것들은 관련 데이터가있는 관련 OpenGL 호출입니다.

+0

질문에 답하거나 삭제해야합니다. 답이없는 질문 목록에있는 장소 만 유지하기 때문에 :) – kravemir

+0

감사 Miro, 그건 몰랐습니다. – dascandy

답변

4

glGetErrors의 자유로운 뿌리를 통해 해결책을 찾았습니다. 이 코드 예제의 모든 glTexImage에서 오류가 발생했습니다. 정수 텍스처의 경우 GL_RGBA가 아니라 GL_RGBA_INTEGER를 사용해야합니다.

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32I, w, h, 0, GL_RGBA_INTEGER, GL_INT, data); 

이제 작동합니다. 텍스처 가져 오기도 OK입니다.

관련 문제