간단한 쿼드에 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 샘플러를 설정하는 방법입니다.
버텍스 쉐이더 GLSL 코드에서 그 야생 '\'은 무엇입니까? – bitcell
@UniCell 줄의 마지막 문자이면 유효합니다 (C에서 줄 바꿈 문자를 이스케이프하는 것과 같습니다) –
@ratchetfreak하지만 다소 이상하게 보입니다. D – bitcell