당신이 찾고있는 것은 cube map입니다. OpenGL에서는 한 번에 여섯 개의 텍스처를 정의하고 (큐브의 크기면을 나타냄) 일반적인 2D 텍스처 좌표 대신 3D 텍스처 좌표를 사용하여 매핑 할 수 있습니다. 간단한 큐브의 경우 텍스처 좌표는 정점의 각 법선과 동일합니다. (이러한 방식으로 평면 큐브를 텍스처링하는 경우 꼭지점 셰이더에서 법선과 텍스처 좌표를 통합 할 수 있습니다!) 큐브 맵은 현재 수행중인 방식과 동시에 6 개의 텍스처를 동시에 바인딩하는 것보다 훨씬 간단합니다. 쉐이더를 수행 할 때
GLuint mHandle;
glGenTextures(1, &mHandle); // create your texture normally
// Note the target being used instead of GL_TEXTURE_2D!
glTextParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTextParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
glTextParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTextParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glBindTexture(GL_TEXTURE_CUBE_MAP, mHandle);
// Now, load in your six distinct images. They need to be the same dimensions!
// Notice the targets being specified: the six sides of the cube map.
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGBA, width, height, 0,
format, GL_UNSIGNED_BYTE, data1);
glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGBA, width, height, 0,
format, GL_UNSIGNED_BYTE, data2);
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGBA, width, height, 0,
format, GL_UNSIGNED_BYTE, data3);
glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGBA, width, height, 0,
format, GL_UNSIGNED_BYTE, data4);
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGBA, width, height, 0,
format, GL_UNSIGNED_BYTE, data5);
glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGBA, width, height, 0,
format, GL_UNSIGNED_BYTE, data6);
glGenerateMipmap(GL_TEXTURE_CUBE_MAP);
glTextParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
// And of course, after you are all done using the textures...
glDeleteTextures(1, &mHandle);
지금, 당신은 동의 및/또는 3D 좌표 (VEC3) 대신 2 차원 좌표 (VEC2)을 통과 버텍스 쉐이더가 필요합니다.
// old GLSL style
attribute vec3 inTextureCoordinate;
varying vec3 vTextureCoordinate;
// more recent GLSL
in vec3 inTextureCoordinate;
out vec3 vTextureCoordinate;
이 예에서, 정점 셰이더는 단순히 vTextureCoordinate = inTextureCoordinate을 할당합니다. 조각 쉐이더는 그 텍스쳐 좌표를 받아들이고 큐브 맵 유니폼을 샘플링해야합니다.
uniform samplerCube cubeMap;
...
gl_FragColor = textureCube(cubeMap, vTextureCoordinate);
휴! 그것은 많은 것이었다. 나는 아무것도 남기지 않았 니?
더 알고 싶습니다. – Mark
그래, 다른 질문에 업데이트를 게시하고있는 것 같아 ...? 나는 그것을 여기에 게시 할 것이다. – TheBuzzSaw
응답 해 주셔서 감사합니다. 지금은 좀 더 의미가 있습니다. 그러나, 나는 단순함을 위해 큐브의 예를 사용하고 있었고 실제로로드하려고하는 모델에는 30 개 이상의 텍스처가 있습니다. 더 많은 텍스처를 허용하도록 솔루션 확장을 제안 할 수 있습니까? –