2014-12-18 4 views
-1

간단한 쿼드에 32 비트 부동 텍스처를 표시하는 작은 프로그램을 작성했습니다. 쿼드를 표시 할 때 텍스처 색상은 항상 검은 색입니다. 나는 많은 것을 실험했지만, 제대로 작동시키지 못했습니다. 나는 정말로 그 문제가 무엇인지를 놓치고있다.내 GLSL/OpenGL 코드로 문제를 발견 할 수 없습니다

는 OpenGL 텍스처를 생성하는 코드는 이러한 호출 중 하나에 오류가 없습니다, 디버거를 사용하여이

glEnable(GL_TEXTURE_2D); 
glGenTextures(1, &textureID); 
glBindTexture(GL_TEXTURE_2D, textureID); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, width, height, 0, GL_RGBA, GL_FLOAT, textureData); 

처럼 간다. 또한 textureData 포인터를 검사하여 예상되는 결과를 얻었습니다 (단순화 된 프로그램에서는 그라디언트 텍스처).

#version 400 
in vec4 vertexPosition; 
out vec2 uv; 
void main() { 
    gl_Position = vertexPosition; 
    uv.x = (vertexPosition.x + 1.0)/2; 
    uv.y = (vertexPosition.y + 1.0)/2; 
} 

그것은 UV의 간단한 세대의 종류의 정점 속성으로 그들을 복용하지 않고 좌표 :

이 GLSL에서 버텍스 쉐이더 코드입니다. 해당 버텍스 버퍼 객체는 실제로 간단합니다 :

GLfloat vertices[4][4] = { 
    { -1.0, 1.0, 0.0, 1.0 }, 
    { -1.0, -1.0, 0.0, 1.0 }, 
    { 1.0, 1.0, 0.0, 1.0 }, 
    { 1.0, -1.0, 0.0, 1.0 }, 
}; 

나는 솔루션을 테스트했고, 원하는대로 전체 창을 덮는 쿼드를 표시합니다. 프래그먼트 쉐이더에서 UV 좌표를 표시하면 얻을 것으로 예상되는 그라디언트가 재생됩니다. 이제 조각 쉐이더가 있습니다 :

#version 400 
uniform sampler2D myTex; 
in vec2 uv; 
out vec4 fragColor; 

void main() { 
    fragColor = texture(myTex, uv); 
    // fragColor += vec4(uv.x, uv.y, 0, 1); 
} 

주석 처리 된 행은 디버깅 목적으로 UV 좌표를 색상으로 표시합니다. 여기서 내가 뭘 잘못 했니? 왜 texture() 호출이 0을 반환하는지 텍스처가 완벽하게 보이고 uv 좌표가 적절한 이유를 알 수 없습니다. gl-view.c

편집 : 내가 잘못 할 다른 일이 있다면 나는 여기에 전체 코드 링크

glEnable(GL_TEXTURE_2D); 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, textureID); 
glUniform1i(glGetUniformLocation(shaderProgram, "myTex"), 0); 

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

편집 : 정점 셰이더 코드를 지워짐이 내가 myTex 샘플러를 설정하는 방법입니다.

+0

버텍스 쉐이더 GLSL 코드에서 그 야생 '\'은 무엇입니까? – bitcell

+0

@UniCell 줄의 마지막 문자이면 유효합니다 (C에서 줄 바꿈 문자를 이스케이프하는 것과 같습니다) –

+0

@ratchetfreak하지만 다소 이상하게 보입니다. D – bitcell

답변

0

나는 텍스처에서 MAG 또는 MIN 필터를 설정하지 않았다는 문제점을 발견했습니다. MIN 필터를 GL_NEAREST로 설정하면 문제가 해결되었습니다.