2011-02-07 3 views
1

각면마다 서로 다른 텍스처로 하나의 큐브를 그리려하고 있습니다. display() 루틴에서 glDrawElements()을 호출하기 전에 모든 텍스처 유닛을 활성화해야한다고 설명하는 많은 자습서를 보았습니다. 나는이 부름을한다.OpenGL의 텍스처 유닛과 버텍스 배열

gl.glClientActiveTexture(GL.GL_TEXTURE0); 
gl.glBindTexture(GL.GL_TEXTURE_2D, textureId); 
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, getTexCoordBufferObject()); 
gl.glTexCoordPointer(2, GL.GL_FLOAT, 0, 0); 

gl.glClientActiveTexture(GL.GL_TEXTURE1); 
gl.glBindTexture(GL.GL_TEXTURE_2D, textureId+1); 
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, getTexCoordBufferObject()); 
gl.glTexCoordPointer(2, GL.GL_FLOAT, 0, 0); 

... 

gl.glClientActiveTexture(GL.GL_TEXTURE5); 
gl.glBindTexture(GL.GL_TEXTURE_2D, textureId+5); 
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, getTexCoordBufferObject()); 
gl.glTexCoordPointer(2, GL.GL_FLOAT, 0, 0); 

이 모든 것이 나에게 의미가있다. 그러나 버퍼를 채울 때 (예 : 모델 데이터를로드 할 때) 참조 할 텍스처를 결정하는 방법은 없습니다. 감사 크리스

답변

2

당신이 찾고있는 것은 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); 

휴! 그것은 많은 것이었다. 나는 아무것도 남기지 않았 니?

+0

더 알고 싶습니다. – Mark

+0

그래, 다른 질문에 업데이트를 게시하고있는 것 같아 ...? 나는 그것을 여기에 게시 할 것이다. – TheBuzzSaw

+0

응답 해 주셔서 감사합니다. 지금은 좀 더 의미가 있습니다. 그러나, 나는 단순함을 위해 큐브의 예를 사용하고 있었고 실제로로드하려고하는 모델에는 30 개 이상의 텍스처가 있습니다. 더 많은 텍스처를 허용하도록 솔루션 확장을 제안 할 수 있습니까? –

1

하지 그러나 않습니다 나는 내가 버퍼를 채울 때 참조하고있는 질감을 결정하는 방법은 무엇 (예를 들어, 내 모델 데이터를로드).

가장 최근의 ActiveTexture 호출에서 마지막으로 지정한 텍스처를 언급합니다.이 호출은 실제로 아무 것도하지 않으며, 텍스처와 관련된 모든 후속 호출에 영향을주는 숨겨진 상태를 설정합니다.

0

얼굴별로 텍스처를 선택하는 것은 일반적으로 OpenGL에서 어렵습니다 (예 : EXT_texture_array를 사용하여 텍스처 배열을 인덱싱 할 수있는 최근 카드 제외). 문제는 대개 this처럼 모든 텍스처를 하나로 묶어서 피할 수 있습니다.

매우 구체적인 경우 큐브 맵이 완벽합니다. 큐브 만 있으면되고 다른 것은 없을 것입니다.

관련 문제