OpenGL에서 기하학 그늘을 사용하여 단일 패스로 큐브 맵에 그리려하고 있습니다. 큐브 맵의 내용을 다른 큐브 맵으로 복사하려면 기본적으로이 작업이 필요하며 해상도와 픽셀 레이아웃이 동일하지 않을 수 있습니다.단일 패스로 큐브 맵 그리기 OpenGL
저는 꼭지점 셰이더에 단일 점을 넣고 그 다음에, 형상 셰이더에서 각 레이어 (큐브 맵의면)를 선택하고 쿼드 및 텍스처 좌표를 내 보내야합니다.
지금까지는이 방법이 큐브 맵의 두면 (양수 및 음수 X) 만 방출하여 작동 하는지를 확인했지만 시도하지 않았습니다.
NSight를 사용하면 잘못된 것이 있음을 알 수 있습니다.
이
는 소스 큐브 맵입니다 :그리고이 결과 큐브 맵입니다 : 양의 X이고 여전히 정확하지의에 그려지는 것
유일한 얼굴.
이 내 지오메트리 쉐이더이다
#version 330 core
layout(points) in;
layout(triangle_strip, max_vertices = 8) out;
in vec3 pos[];
out vec3 frag_textureCoord;
void main()
{
const vec4 positions[4] = vec4[4] (vec4(-1.0, -1.0, 0.0, 0.0),
vec4(1.0, -1.0, 0.0, 0.0),
vec4(-1.0, 1.0, 0.0, 0.0),
vec4(1.0, 1.0, 0.0, 0.0));
// Positive X
gl_Layer = 0;
gl_Position = positions[0];
frag_textureCoord = vec3(1.0, -1.0, -1.0);
EmitVertex();
gl_Position = positions[1];
frag_textureCoord = vec3(1.0, -1.0, 1.0);
EmitVertex();
gl_Position = positions[2];
frag_textureCoord = vec3(1.0, 1.0, -1.0);
EmitVertex();
gl_Position = positions[3];
frag_textureCoord = vec3(1.0, 1.0, 1.0);
EmitVertex();
EndPrimitive();
// Negative X
gl_Layer = 1;
gl_Position = positions[0];
frag_textureCoord = vec3(-1.0, -1.0, 1.0);
EmitVertex();
gl_Position = positions[1];
frag_textureCoord = vec3(-1.0, -1.0, -1.0);
EmitVertex();
gl_Position = positions[2];
frag_textureCoord = vec3(-1.0, 1.0, 1.0);
EmitVertex();
gl_Position = positions[3];
frag_textureCoord = vec3(-1.0, 1.0, -1.0);
EmitVertex();
EndPrimitive();
}
그리고이 제 단편 쉐이더이다
#version 150 core
uniform samplerCube AtmosphereMap;
in vec3 frag_textureCoord;
out vec4 FragColor;
void main()
{
FragColor = texture(AtmosphereMap, frag_textureCoord) * 1.0f;
}
UPDATE NSight와 또한 디버깅 양의 X 단면마다 단편 가도록 도시 frag_textureCoord
의 값이 vec3(~1.0, ~0.0, ~0.0)
인데 (정확하게는 값이 아니기 때문에 ~
을 사용했습니다. 그러나 approxi 메이트). 대신 음수 x면은 단편 셰이더 단계에 도달하지 않습니다.
vec4(x, y, z, 0.0)
에서
vec4(x, y, z, 1.0)
내 정점 위치의 정의를 변경 는
UPDATE 내 쉐이더가 올바르게 양의 X 얼굴을 렌더링 할 수 있지만, 부정적인 내가 바로 색상 것을 볼도 조각 쉐이더를 디버깅 할 경우, 여전히 잘못 선택하고 적용했지만 검은 색으로 변합니다.
양의 X면에 대해 각각 'EmitVertex()'앞에 그리고 음의 X면에 대해'EmitVertex() '앞에'gl_Layer = 1;'을 추가하기 만하면됩니다. 긍정적 인 X 얼굴 작업 (전에했던 것처럼)은 부정적인 X 얼굴을 여전히 색을받지 않습니다. 0을 제외한 모든 레이어가 작동하지 않기 때문에 양수의 X 면만 바인딩 된 것처럼 보이지만 텍스처 타겟에'GL_TEXTURE_CUBE_MAP'을 사용하고 프레임 버퍼에 첨부하기 위해'glFramebufferTexture'를 사용하여 대상 큐브 맵에 대한 프레임 버퍼를 작성했습니다 . glTexImage2D에 대해서만'GL_TEXTURE_CUBE_MAP_POSITIVE_X + ...'를 사용합니다 – zeb
프레임 버퍼를 드로 버퍼로 바인딩 할 때 내 'glViewport()'호출로 인한 문제라고 생각합니다. 왜냐하면 어리석은 테스트를 수행하기 때문에' glViewport()'를 호출하고'glBindFramebuffer' 다음에 음수의 X가 보이지만 틀린 뷰포트를가집니다. 이 시점에서 렌더링을 위해 큐브 맵의 te 뷰포트를 어떻게 설정해야합니까? – zeb
크기가 256x256 픽셀 인 내 큐브 맵을 만들었고 렌더링 대상으로 해당 텍스처를 바인딩하고 181x181 픽셀보다 큰 차원에 대한 뷰포트를 설정할 때 음수 X면은 렌더러가 아닙니다. 181x181까지 모두 작동하지만 181x181 이상에서는 더 이상 작동하지 않으며 이유를 이해할 수 없습니다. – zeb