2016-06-08 6 views
1

OpenGL에서 기하학 그늘을 사용하여 단일 패스로 큐브 맵에 그리려하고 있습니다. 큐브 맵의 내용을 다른 큐브 맵으로 복사하려면 기본적으로이 작업이 필요하며 해상도와 픽셀 레이아웃이 동일하지 않을 수 있습니다.단일 패스로 큐브 맵 그리기 OpenGL

저는 꼭지점 셰이더에 단일 점을 넣고 그 다음에, 형상 셰이더에서 각 레이어 (큐브 맵의면)를 선택하고 쿼드 및 텍스처 좌표를 내 보내야합니다.

지금까지는이 방법이 큐브 맵의 두면 (양수 및 음수 X) 만 방출하여 작동 하는지를 확인했지만 시도하지 않았습니다.

NSight를 사용하면 잘못된 것이 있음을 알 수 있습니다.

는 소스 큐브 맵입니다 : enter image description here

그리고이 결과 큐브 맵입니다 : 양의 X이고 여전히 정확하지의에 그려지는 것 enter image description here

유일한 얼굴.

이 내 지오메트리 쉐이더이다

#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 얼굴을 렌더링 할 수 있지만, 부정적인 내가 바로 색상 것을 볼도 조각 쉐이더를 디버깅 할 경우, 여전히 잘못 선택하고 적용했지만 검은 색으로 변합니다.

답변

3
gl_Layer = 0; 

이것은 Geometry Shader output입니다. EmitVertex을 호출하면 모든 출력 변수의 값이 정의되지 않게됩니다. 따라서 항상 출력이 적용되는 각 정점에 대해 각 출력을 설정해야합니다.

+0

양의 X면에 대해 각각 'EmitVertex()'앞에 그리고 음의 X면에 대해'EmitVertex() '앞에'gl_Layer = 1;'을 추가하기 만하면됩니다. 긍정적 인 X 얼굴 작업 (전에했던 것처럼)은 부정적인 X 얼굴을 여전히 색을받지 않습니다. 0을 제외한 모든 레이어가 작동하지 않기 때문에 양수의 X 면만 바인딩 된 것처럼 보이지만 텍스처 타겟에'GL_TEXTURE_CUBE_MAP'을 사용하고 프레임 버퍼에 첨부하기 위해'glFramebufferTexture'를 사용하여 대상 큐브 맵에 대한 프레임 버퍼를 작성했습니다 . glTexImage2D에 대해서만'GL_TEXTURE_CUBE_MAP_POSITIVE_X + ...'를 사용합니다 – zeb

+0

프레임 버퍼를 드로 버퍼로 바인딩 할 때 내 'glViewport()'호출로 인한 문제라고 생각합니다. 왜냐하면 어리석은 테스트를 수행하기 때문에' glViewport()'를 호출하고'glBindFramebuffer' 다음에 음수의 X가 보이지만 틀린 뷰포트를가집니다. 이 시점에서 렌더링을 위해 큐브 맵의 te 뷰포트를 어떻게 설정해야합니까? – zeb

+0

크기가 256x256 픽셀 인 내 큐브 맵을 만들었고 렌더링 대상으로 해당 텍스처를 바인딩하고 181x181 픽셀보다 큰 차원에 대한 뷰포트를 설정할 때 음수 X면은 렌더러가 아닙니다. 181x181까지 모두 작동하지만 181x181 이상에서는 더 이상 작동하지 않으며 이유를 이해할 수 없습니다. – zeb