2014-10-20 8 views
1

Open GL (셰이더 버전)을 배울 때까지는 오브젝트 좌표를 텍스처 좌표에 UV 맵핑하여 큐브를 텍스처링했습니다. 따라서 버텍스 버퍼와 UV 버퍼를 셰이더 코드에 전달합니다.OpenGL : 큐브 맵 텍스쳐, UV 맵핑 없음

하지만 지금은 다양한 튜토리얼에서 스카이 박스를 읽을 때 그 과정이 매우 다르고 매우 혼란 스럽습니다. 첫째, 큐브 맵 텍스처링을 사용하고 있습니다. 큐브 맵 텍스처링이하는 일을 이해했지만 자습서가 어떻게 구현하는지 이해하지 못했습니다. 예를 들어, 대부분의 튜토리얼은 Skybox를위한 별도의 조각 셰이더를 작성합니다. 다른 모든 큐브 개체에 사용하는 것과 동일한 조각 셰이더를 사용할 수없는 이유는 무엇입니까? 그리고 명시적인 UV 매핑이 수행되지 않습니다.

큐브 맵 텍스처가 어떻게 구현되는지에 대한 좋은 설명이 있습니까?

답변

4

자습서가있는 한 this one을 권장합니다. 이에

  • 은 질감이 UV 위치 에서 현재 픽셀의 컬러를 UV 좌표를 통과하고 얻어서 단순히 작동2D 텍스처 샘플링.
  • 동안 큐브 맵 큐브의 중심에서 시작하여 그것이 특정 텍스처 그 측면으로부터 화소를 샘플링 할 수 있도록 측면 중 하나에 도달 할 때까지 따라 이동 차원 방향 벡터를 사용한다.

스카이 박스 용으로 별도의 셰이더를 사용해야하는 이유는 아마도 편리 할 것입니다. 앞으로도 특별한 수정을 원할 수 있습니다. 그러나 깊이 버퍼에 쓰는 것을 무시하기 위해 이것을 할 수 있다는 사실 또한 pos.xyww;입니다.

버텍스 쉐이더에서 텍스처 방향 벡터 (texDirection)을 현재 버텍스의 위치와 동일하게 설정했습니다. 조각 쉐이더에 도달하면 모든 벡터가 보간되므로, texDirection은 큐브의 한면에서 다른면으로 자신을 보간하여 주위를 둘러 볼 것입니다.

버텍스 쉐이더 : 우리는 우리의 사랑의 방향으로 촬영하여 스카이 박스에서 픽셀을 샘플링 조각 쉐이더 내부

in vec3 position; 
out vec3 texDirection; 

uniform mat4 projection; 
uniform mat4 view; 


void main() { 
    vec4 pos = projection * view * vec4(position, 1.0); 
    gl_Position = pos.xyww; // We ignore the depth buffer here 
    texDirection = position; // Let it interpolate 
} 

texDirection 보간. 변 중 하나에 도달하여 출력 변수 에 저장하는 색상을 반환합니다.

조각 쉐이더 :

in vec3 texDirection; 
out vec4 color; 

uniform samplerCube skybox; // The cubemap is a uniform! 

void main() {  
    color = texture(skybox, texDirection); // Get the pixel in direction of texDirection! 
}