2016-12-22 7 views
1

OpenGL 4.0에서 날씨 시뮬레이션을 만들고 백그라운드에서 전체 화면 쿼드를 만들어 하늘을 만들려고합니다. 나는 꼭지점 셰이더가 4 개의 꼭지점을 생성하고 삼각형 줄무늬를 그려서 그렇게하려고합니다. 모든 것이 잘 컴파일되고 이전에 만든 모든 다른 객체를 볼 수 있지만 하늘은 볼 수 없습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?OpenGL에서 3D에서 2D로 전환

MAIN.CPP

GLint stage = glGetUniformLocation(myShader.Program, "stage"); 
//... 
glBindVertexArray(FS); //has four coordinates (-1,-1,1) to (1,1,1) in buffer object 
glUniform1i(stage, 1); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 
glBindVertexArray(0); 

버텍스 쉐이더

uniform int stage; 
void main() 
{ 
    if (stage==1) 
    { 
     gl_Position = vec4(position, 1.0f); 
    } 
    else 
    { 
     //... 
    }  
} 

조각 쉐이더

uniform int stage; 
void main() 
{ 
    if (stage==1) 
    { //placeholder gray colour so I can see the sky 
     color = vec4(0.5f, 0.5f, 0.5f, 1.0f); 
    } 
    else 
    { 
     //... 
    } 
} 

나는 나 또한해야 OpenGL에서 초보자이며 실제로 이되어야하며 OpenGL 4.0 이상이어야합니다.

편집 : 문제가 무엇인지 알아 냈지만 해결 방법을 아직 모릅니다. 사각형이 존재하지만보기 및 투영 행렬을 곱하면 표시됩니다 (그러나 화면에 붙어 있지 않고 나머지 장면과 함께 회전합니다. 원하지 않습니다). 본질적으로, 필자는 어떻게 든 2D 또는 화면 공간으로 전환해야하지만 그렇지 않으면 사각형을 그리고 3D로 다시 전환하여 다른 모든 객체가 올바르게 작동하도록해야합니다. 방법?

+1

정점 배열에서 'z'좌표를 '0'으로 설정해보십시오. 그 '1'은 원거리 클리핑 플레인에 정확히 나타나며 문제 일 수 있습니다. 또한 얼굴 도려 기능이 활성화 된 경우 평면 점이 반 시계 방향인지 확인하십시오. (깊이 버퍼 쓰기를 비활성화하고 * first *를 그릴 수도 있습니다!). –

+0

쉐이더가 유니폼을 기반으로 두 가지 완전히 다른 작업을 한 번 수행하면, 실제로 가지고있는 것은 두 개의 쉐이더입니다. Ubershaders는 훌륭하지만 모든 종류의 렌더링 작업을 위해 극단적으로 갈 이유가 없습니다. –

+0

@ NicolBolas 이미 'if'를 완전히 없애는 방법에 대한 아이디어가 이미 있지만, 작동시킬 때까지 추적하기가 쉽습니다. – Gweddry

답변

1

문제는 z 좌표로 1을 넣는 것이 었습니다. 대신 0.999f를 쓰면 문제가 해결되었습니다.

+0

심도 테스트를'gl.LEQUAL'로 설정하거나 심도 테스트를 꺼버릴 수도 있습니다. 기본값은'gl.LESS'이고 보통 1.0까지의 깊이를 지우고 1.0으로 Z를 설정하면 쿼드가 작아서 시험에 실패하지 않았다는 것을 의미합니다. 또한 [스카이 팀 쿼드 그리기 및 큐브 맵 사용] (http://twgljs.org/examples/no-box-skybox.html)을 사용하여 간단한 스카이 박스를 만들 수 있습니다. – gman