2011-02-13 8 views
3

나는 큐브과 같이 정의 있습니다OpenGL에서 큐브의 텍스처 좌표는 무엇입니까?

float vertices[] = { -width, -height, -depth, // 0 
           width, -height, -depth, // 1 
           width, height, -depth, // 2 
          -width, height, -depth, // 3 
          -width, -height, depth, // 4 
           width, -height, depth, // 5 
           width, height, depth, // 6 
          -width, height, depth // 7 
     }; 

와 나는 간단하게 원하는 이미지가 128x128 큐브와 아무것도의 6 개 각면에 그려진해야합니다. 그렇다면 텍스처는 무엇입니까? 나는 실제 가치가 필요하다.

short indices[] = { 0, 2, 1, 
       0, 3, 2, 

       1,2,6, 
       6,5,1, 

       4,5,6, 
       6,7,4, 

       2,3,6, 
       6,3,7, 

       0,7,3, 
       0,4,7, 

       0,1,5, 
       0,5,4 


       }; 

내가 인덱스 배열 텍스 좌표를 찾기 위해 필요한 경우 확실하지 않다 :

// Counter-clockwise winding. 
     gl.glFrontFace(GL10.GL_CCW); 
     // Enable face culling. 
     gl.glEnable(GL10.GL_CULL_FACE); 
     // What faces to remove with the face culling. 
     gl.glCullFace(GL10.GL_BACK); 
     // Enabled the vertices buffer for writing and to be used during 
     // rendering. 
     gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 

     // Specifies the location and data format of an array of vertex 
     // coordinates to use when rendering. 
     gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mVerticesBuffer); 


      // Bind the texture according to the set texture filter 
      gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[filter]); 
      gl.glEnable(GL10.GL_TEXTURE_2D); 



      // Enable the texture state 
      gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 

      // Point to our buffers 
      gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, mTextureBuffer); 



     // Set flat color 
     gl.glColor4f(red, green, blue, alpha); 


     gl.glDrawElements(GL10.GL_TRIANGLES, mNumOfIndices, 
       GL10.GL_UNSIGNED_SHORT, mIndicesBuffer); 

     // ALL the DRAWING IS DONE NOW 

     // Disable the vertices buffer. 
     gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 


      gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 


     // Disable face culling. 
     gl.glDisable(GL10.GL_CULL_FACE); 

이 인덱스 배열 :

그리기 코드입니다. 내가 준 큐브 버텍스 배열은 인덱스 배열을 사용하는 큐브를 가장 효율적으로 표현한 것입니다. 큐브는 완벽하게 그려 지지만 텍스처는 그려지지 않습니다. 한 쪽만 올바른 그림을 보여 주지만 다른면은 엉망입니다. 텍스처에 대한 다양한 온라인 자습서에 설명 된 방법을 사용했지만 작동하지 않습니다.

+1

당신은 아마 ... 너무 – ltjax

+0

을 그리기 코드를 게시해야 위의 정보에서 기술적으로 올바른 tex 좌표는 몇 개입니까? tex 좌표로 말하면, tex 좌표 배열에서 1,0과 같은 2 차원 점을 의미합니다. – ace

답변

3
  1. 는 각면에 당신이하고자하는 방향을 정의 할 필요가있다 (그리고 각 정점에 넣어되는 텍스처 좌표 변경됩니다) 같은 큐브 코너 서로 다른 질감을해야합니다으로 정점 위치를 복제 할 필요가
  2. 각면에 전체 텍스처를 원할 경우
  3. 의면에 따라 좌표가 지정되고 텍스처 좌표는 (0, 0) (1,1) (1, 1) (1, 0)입니다. 특정 정점 (24 개,면 당 4 개)에 맵핑하는 방법은 원하는 방향에 따라 다릅니다.
2

나를 위해, 당신의 폭을 width = x, height = y 및 depth = z로 생각하는 것이 더 쉽습니다. 다음은 6 개의 얼굴을 얻는 간단한 문제입니다. 큐브의 전면이 양의 깊이를해야합니다 예를 들어

float vertices[] = { -x, -y, -z, // 0 
           x, -y, -z, // 1 
           x, y, -z, // 2 
          -x, y, -z, // 3 
          -x, -y, z, // 4 
           x, -y, z, // 5 
           x, y, z, // 6 
          -x, y, z// 7 
     }; 

(이 큐브의 중심은 당신이 제공 한 verticies에서 0,0,0에있다), 지금은 8 점 4 긍정적으로 있기 때문에 깊이는 앞면이 4,5,6,7이고 시계 반대 방향으로 -x, -y, -x, y가됩니다.

좋아, 당신의 뒷면은 모두 음수 깊이 또는 -z이므로 0,1,2,3입니다.

그림보기? 당신의 왼쪽 얼굴은 모두 음의 너비 또는 -x이므로 0,3,4,7이고 오른쪽 얼굴은 양수 x이므로 1,2,5,6입니다.

큐브의 위쪽과 아래쪽을 알아낼 수 있도록하겠습니다.

+0

이 텍스쳐 좌표 또는 꼭지점의 인덱스입니까? – sdasdadas

+0

이것들은 꼭지점 좌표이며, 그의 방대한 편집 후에 질문을 업데이트하지 않았습니다. 텍사스 코드는 각 얼굴마다 128x128 이미지를 사용하기 때문에 매우 간단합니다. 각 얼굴에 대해 각 얼굴 텍스쳐 좌표 (0,0), (0,128), (128,128), (128), 128 , 0) – Joe

2

당신의 정점 배열은 큐브의 두 측면을 설명하지만, 인수를 위해서, 정점 [0] 말 - 정점 [3] 1 개면 다음 설명 텍스쳐의 좌표가 될 수있다 :

float texCoords[] = { 0.0, 0.0, //bottom left of texture 
         1.0, 0.0, //bottom right " " 
         1.0, 1.0, //top right " " 
         0.0, 1.0 //top left  " " 
        }; 

당신은 사용할 수 있습니다 각각의 후속면을 전체 텍스처로 텍스처링하기위한 좌표.

6

당신이 찾고있는 것은 cube map입니다. OpenGL에서는 한 번에 여섯 개의 텍스처를 정의하고 (큐브의 크기면을 나타냄) 일반적인 2D 텍스처 좌표 대신 3D 텍스처 좌표를 사용하여 매핑 할 수 있습니다. 간단한 큐브의 경우 텍스처 좌표는 정점의 각 법선과 동일합니다. (이러한 방식으로 평면 큐브를 텍스처링하는 경우, 꼭지점 셰이더에서 법선과 텍스처 좌표를 통합 할 수 있습니다!큐브 맵은 쿼드 반복에 동일한 텍스처를 적용하는 것보다 훨씬 간단합니다 (불필요한 드로잉 단계).

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); 

은 텍스처 좌표를 지정하는 경우, 당신은 다음 3 세트 간단한 큐브에서 대신 2 세트의 좌표를 사용합니다, 당신은 정규화 된 벡터를 사용하여 8 개 개의 모서리를 가리 킵니다. N = 1.0/sqrt (3.0)이면 한 모퉁이는 N, N, N이됩니다. 다른 하나는 N, N, -N이 될 것이다. 등

0

스카이 박스 (큐브 맵)을 렌더링하려면, 아래의 쉐이더는 나를 위해 작동 :

Cubemap vertexshader:: 
     attribute vec4 a_position;    
     varying vec3 v_cubemapTexture;   
     vec3 texture_pos;       
     uniform vec3 u_cubeCenterPt;    
     uniform mat4 mvp;      
     void main(void)      
     {          
     gl_Position = mvp * a_position;   
     texture_pos = vec3(a_position.x - u_cubeCenterPt.x, a_position.y - u_cubeCenterPt.y, a_position.z - u_cubeCenterPt.z); 
     v_cubemapTexture = normalize(texture_pos.xyz); 
     }          

Cubemap fragmentshader:: 
     precision highp float;            
     varying vec3 v_cubemapTexture;          
     uniform samplerCube cubeMapTextureSample;       
     void main(void)             
     {                 
      gl_FragColor = textureCube(cubeMapTextureSample, v_cubemapTexture); 
     } 

이 유용 희망 ...

관련 문제