2011-09-02 7 views
4

버텍스 배열을 사용하여 많은 수의 버텍스가 포함 된 비교적 큰 메쉬를 그려 봅니다. 텍스쳐는이 결정되었으며, 그것은의 라인을 따라 직접 모드에서 그리 쉽게 충분 :OpenGL에서 텍스처로 버텍스 배열 결합하기

glBegin(GL_TRIANGLES) { 
    for (int faceIdx = 0; faceIdx < nFaces; ++faceIdx) 
    glVertex3fv(&vertexArray[vIdx]); 
    glTexCoord2fv(&texCoord[vIdx++]); 
    glVertex3fv(&vertexArray[vIdx]); 
    glTexCoord2fv(&texCoord[vIdx++]);  
    glVertex3fv(&vertexArray[vIdx]); 
    glTexCoord2fv(&texCoord[vIdx++]); 
    } 
} 
glEnd(); 

그러나 가독성, 속도, VBOs로 이동하는 내가 볼 수있는 정점 배열을 (사용하려는 나머지). 단일 버텍스를 배열에 여러 번 넣는 방법이 있습니까?

순간적으로 이해할 수 있듯이 각 꼭지점이 여러 텍스처 좌표를 식별하므로 메시의 각 꼭지점을 메시의면에 나타나는 횟수만큼 지정해야합니다. 메쉬가 근사하는 객체의 월드 이미지), 즉 내 정점/텍셀 좌표 배열은 마치 직접 모드로 채운 것처럼 읽습니다.

반복적 인 정점을 사용하지 않고 텍스처 좌표를 지정하는 동안 정점 배열을 사용할 방법이 있습니까?

+0

며칠 전 (원격으로) 유사한 질문을했습니다. http://stackoverflow.com/questions/7232915/fewer-colors-than-vertices –

+1

위의 코드에서 문제가 보이지 않습니다. Vertex Positions와 Texture Coordinates는 인덱스를 공유 할 수 있지만 각 정점으로 인덱스를 전진시키고 있습니다. BTW, 나는 당신이 전화가 망가 졌다고 명령을 받았다고 생각한다. 다른 모든 속성이 설정되면 glVertex를 호출한다. glBegin ... glEnd 블록에서 마지막 OpenGL 명령은 glVertex 여야합니다. – datenwolf

답변

5

단일 정점은이 단일 정점을 구성하는 모든 속성으로 구성됩니다. 따라서 동일한 위치를 공유하지만 텍스처 좌표가 다른 두 개의 꼭지점은 개념적으로 다른 꼭지점입니다. 그래서 다른 texCoord에 대한 정점 위치를 반복하는 간단한 방법은 없습니다.

그러나 일반적으로 이러한 정점 복제는 일부 희소 영역 (예 : 다른 법선 또는 날카로운 모서리와 같이 텍스처 이음새)에서만 필요합니다. 그럼 네 얼굴의 모퉁이에는 정말 다른 texCoords가 있는가? 데이터를 사전 처리하여 위치 texCoords를 공유하는 인접한 얼굴을 찾아서 정점을 공유 할 수 있습니다. 많은 정점들에서 그렇게되지 않는다면 나는 놀라실 것입니다. 그리고 여러분은 극소수의 중복 정점들로 끝납니다.

+0

고맙습니다 - 그 중 하나는 대답을 기쁘게하지만 다른 상황 이었으면 좋겠습니다. 그러나 전적으로 의미가 있습니다 - 반복을 제한하기 위해 텍스처 파일을 마사지해야합니다. – northerncodemonkey

-1

내가 올바른 질문을 이해한다면 실제로 정점 버퍼에 같은 정점을 여러 번 넣지 않아도되는 방법이 있습니다. 인덱스 버퍼를 사용하고 인덱스를 사용하여 동일한 정점을 지정할 수 있습니다. 이렇게하면 렌더링 속도를 크게 높일 수 있습니다.

+0

신속한 답변을 주셔서 감사합니다.하지만 문제는 메쉬의 단일 정점이 여러 (예 : 3) 개의 텍스처 좌표에 해당 할 수 있다는 것입니다. 텍스처를 방정식에서 벗어나 인덱스 된 드로잉을 실제로 사용할 수는 있지만 정점 A가 2 개의면에서 발생하면 2 (s, t) 쌍에 해당하는 텍스처 구성표에서 인덱싱 된 드로잉을 사용하여이를 수행 할 방법이없는 것처럼 보입니다 우리는 필요한 다중 (s, t) 쌍을 지정할 수 없으므로. – northerncodemonkey

관련 문제