2010-11-29 1 views
1

OpenGL ES 1.0으로 게임을 시작했고 몇 가지 (초보자) 문제가 발생했습니다. 삼각형으로 설명 된 큐브에 정사각형 텍스처를 매핑하려고했습니다. 이제 사각형 텍스쳐를 삼각형으로 매핑하기

// Turn necessary features on 
    glEnable(GL_TEXTURE_2D); 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_ONE, GL_SRC_COLOR); 
    glEnable(GL_CULL_FACE); 
    //glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); 

    // Bind the number of textures we need, in this case one. 
    glGenTextures(1, &texture[0]); 
    glBindTexture(GL_TEXTURE_2D, texture[0]); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

//Drawing code 
static GLfloat rot = 0.0; 

static const Vertex3D vertices[] = { 
    -1.0f,-1.0f,-1.0f, //0 00 
    1.0f,-1.0f,-1.0f, //1 10 
    1.0f, 1.0f,-1.0f, //2 11 
    -1.0f, 1.0f,-1.0f, //3 01  
}; 


static const int vertexCnt = 3 * 2; 

static const GLubyte cube[] = { 
    3,0,2, 
    1,2,0, 
}; 

static const GLfloat texCoords[] = { 
    0,1, 
    0,0, 
    1,1, 
    1,0, 
    1,1, 
    0,0, 
}; 


glClearColor(0.0, 0.0, 0.0, 1.0); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

glLoadIdentity(); 

glTranslatef(0.0f, 0.0f, -3.0f); 

glBindTexture(GL_TEXTURE_2D, texture[0]); 

glEnableClientState(GL_VERTEX_ARRAY); 
//glEnableClientState(GL_COLOR_ARRAY); 
glEnableClientState(GL_NORMAL_ARRAY); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glEnable(GL_COLOR_MATERIAL); 


glTexCoordPointer(2, GL_FLOAT, 0, texCoords); 
glVertexPointer(3, GL_FLOAT, 0, vertices); 

//glColorPointer(4, GL_FLOAT, 0, colors); 
glNormalPointer(GL_FLOAT, 0, normals); 



glDrawElements(GL_TRIANGLES, vertexCnt, GL_UNSIGNED_BYTE, cube); 


glDisableClientState(GL_VERTEX_ARRAY); 
//glDisableClientState(GL_COLOR_ARRAY); 
glDisableClientState(GL_NORMAL_ARRAY); 
glDisableClientState(GL_TEXTURE_COORD_ARRAY); 

, 엄청나게 많은 시도 후, 난 그냥 이 삼각형 평방 텍스처를 매핑하는 경우에 대해 엄지 손가락의 몇 가지 규칙이 있나요 ... 그것은 다른 측면 작동 얻을 수 없다?

편집 : 매핑을 어떻게 수행해야하는지 생각합니다. 그러나이 예 (한 얼굴)에서는 작동하지 않습니다. 누군가가 코드를 올바르게 작성했는지 확인할 수 있습니까? (나머지 코드는 작동한다고 가정)

많은 감사

는 는
+0

: 여기

큐브를 표시하도록 업데이트 코드입니다 (I 장애인 얼굴이 확실하게 컬링 있도록 약간의 감기에 문제가있을 수 있습니다) 동일한 정점 데이터를 재사용하면서 큐브를 만듭니다. 큐브를 6 개의 개별 쿼드 = 8 개의 정점으로 재 작업합니다. –

+0

'normals' 배열이 잘못되었다고 생각합니다. 정상적인 포인터의 내용은 무엇입니까? 얼굴마다 법선을 바꾸고 있습니까? –

+0

노멀은 다소 잘못되었지만 텍스처 맵핑에 영향을 준다는 것을 몰랐습니다 ... 나는 조명에만 영향을 미쳤다고 생각합니다 ... 체크 아웃 할 것입니다.감사합니다 – sinek

답변

1

다른 사람들과 마찬가지로 쿼드 텍스처를 삼각형에 매핑하는 트릭이 있다고 생각하지 않습니다.

발생하는 주된 문제는 각 구석의 텍스처 좌표가 불연속이기 때문입니다. 하나의 모서리가 한면에 대해 일부 UV 코드 {u, v}로 있으면 꼭지점을 공유하는 다른 두면에 대해 동일한 값을 갖게된다는 것을 의미하지는 않습니다. 입방체의 각 모서리에서 UV가 고유하고 (3면으로 공유 됨) 4 개의 UV 값 ({0,0}, {1,0}, {1,1} 및}}이 모두 매핑되도록 매핑을 찾을 수 있습니다. {0,1})은 각면에 존재하지만 일부 텍스처는 완전히 왜곡됩니다. 종이에 이것을 확인해보십시오. {1,1}이 항상 {0,0}의 반대가되는 것은 아닙니다.

가장 쉬운 방법은 명시 적으로 6 개의 쿼드를 선언하는 것입니다. 각 쿼드는 2 개의 삼각형으로 구성됩니다. 그러면 총 24 개의 정점 (24 위치와 24 개의 텍스 코드, 인터리브 또는 비어 있음)과 36 개의 인덱스 (6 개의 2 개의 삼각형으로 구성된 6 개의 쿼드, 6 * 2 * 3 = 36)가 생성됩니다. 나는 깔끔하게에 사각형을지도 할 수있는 방법이 있다고 생각하지 않습니다

glEnable(GL_TEXTURE_2D); 
glEnable(GL_BLEND); 
glEnable(GL_DEPTH_TEST); 
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 
glDisable(GL_CULL_FACE); 

static const float vertices[] = { 
     0.0f, 1.0f, 0.0f, 
     1.0f, 1.0f, 0.0f, 
     0.0f, 0.0f, 0.0f, 
     1.0f, 0.0f, 0.0f, 

     0.0f, 1.0f, 1.0f, 
     0.0f, 0.0f, 1.0f, 
     1.0f, 1.0f, 1.0f, 
     1.0f, 0.0f, 1.0f, 

     0.0f, 1.0f, 1.0f, 
     1.0f, 1.0f, 1.0f, 
     0.0f, 1.0f, 0.0f, 
     1.0f, 1.0f, 0.0f, 

     0.0f, 0.0f, 1.0f, 
     0.0f, 0.0f, 0.0f, 
     1.0f, 0.0f, 1.0f, 
     1.0f, 0.0f, 0.0f, 

     1.0f, 1.0f, 0.0f, 
     1.0f, 1.0f, 1.0f, 
     1.0f, 0.0f, 0.0f, 
     1.0f, 0.0f, 1.0f, 

     0.0f, 1.0f, 0.0f, 
     0.0f, 0.0f, 0.0f, 
     0.0f, 1.0f, 1.0f, 
     0.0f, 0.0f, 1.0f 
     }; 


static const int vertexCnt = 6 * 4; 

static const GLubyte cube[] = { 
    0, 1, 2, 1, 2, 3, 
    4, 5, 6, 5, 6, 7, 
    8, 9, 10, 9, 10, 11, 
    12, 13, 14, 13, 14, 15, 
    16, 17, 18, 17, 18, 19, 
    20, 21, 22, 21, 22, 23 
}; 

static const GLfloat texCoords[] = { 
    0.0f, 0.0f, 
    1.0f, 0.0f, 
    0.0f, 1.0f, 
    1.0f, 1.0f, 

    1.0f, 0.0f, 
    1.0f, 1.0f, 
    0.0f, 0.0f, 
    0.0f, 1.0f, 

    0.0f, 0.0f, 
    1.0f, 0.0f, 
    0.0f, 1.0f, 
    1.0f, 1.0f, 

    0.0f, 1.0f, 
    0.0f, 0.0f, 
    1.0f, 1.0f, 
    1.0f, 0.0f, 

    0.0f, 0.0f, 
    1.0f, 0.0f, 
    0.0f, 1.0f, 
    1.0f, 1.0f, 

    1.0f, 0.0f, 
    1.0f, 1.0f, 
    0.0f, 0.0f, 
    0.0f, 1.0f 
    }; 

glClearColor(0.0, 0.0, 0.0, 1.0); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

//glLoadIdentity(); 

//glTranslatef(0.0f, 0.0f, -3.0f); 
glRotatef(3.1415927f, 1.0f, 1.0f, 0.0f); 

glBindTexture(GL_TEXTURE_2D, spriteTexture); 

glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

glTexCoordPointer(2, GL_FLOAT, 0, texCoords); 
glVertexPointer(3, GL_FLOAT, 0, vertices); 

glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_BYTE, cube); 
+0

위의 예에서 좌표를 올바르게 매핑했는지 확인할 수 있습니까? BTW. 정보 주셔서 감사합니다! – sinek

+0

그는 지금은 하나의 얼굴을 그리려하고 있습니다. 불연속은 문제가되지 않습니다. –

+1

예, 질문이 수정되었습니다 (큐브 용으로 사용됨) ;-) 매핑이 올바르게 된 것처럼 보이므로 화면에 아무 것도 나타나지 않으면 얼굴 도려와 GL_COLOR_MATERIAL을 비활성화하여 시작합니다. – Ozirus

1

나는 정점리스트를 조각 시도하지 않은,하지만 내 추측는 좌표 전적으로 및 매핑 잘못된 엉망, 당신은 잘못 인덱스 버퍼 형식을 지정한, 또는이다 당신은 뒷면 컬링 (back-face culling)을 켜 놓았고, 당신의 정점 중 일부는 잘못된 순서로 있습니다.

텍스처 좌표 자체는 쿼드와 비교하여 삼각형에 매핑하는 트릭이 없어야합니다. 6 개의 정점 (한 면당 두 개의 복제본)이 있기 때문에 이전에 네 개가 있었던 곳에서는 6 개의 텍스처 좌표를 가져야합니다. 큐브와 마찬가지로 인덱스 버퍼를 사용하여 중복을 피할 수 있습니다.

잠재적 인 후면면 제거 문제는 매번 동일한 순서로 정점을 정의해야합니다. 시계 방향으로, 텍스처가 향하게 될 방향 또는 모든 시계 반대 방향으로.

OpenGL 파이프 라인을 설정하는 데 사용하는 명령과 그 정점 그리기에 사용하는 명령은 무엇입니까? 해당 코드를 질문에 추가하십시오.