2014-09-05 1 views
0

큐브의 꼭지점 데이터가 주로 GL_TRIANGLES와 함께 사용되도록 구성 될 때 GL_LINE, GL_LINE_STRIP 또는 GL_LINE_LOOP로 드로잉 모드를 전환하려고하면 흥미로운 결과가 있지만 큐브의 와이어 프레임 표현을 제공하는 것은 아닙니다.삼각형 모드에서 올바르게 렌더링 할뿐만 아니라 선 그리기 모드로 잘 표현할 수있는 큐브의 verts/indes를 만드는 방법이 있습니까?

큐브의 정점 및 인덱스 데이터를 구성하여 GL_LINES/GL_LINE_STRIP/GL_LINE_LOOP와 GL_TRIANGLES 사이의 그리기 모드를 전환하면 좋은 결과를 얻을 수 있습니까? 또는 라인 모드 중 하나와 함께 사용할 꼭지점을 다시 만들기 위해 좋은 와이어 프레임을 얻는 유일한 방법은 무엇입니까?

+1

두 개의 인덱스 배열을 사용할 수 있습니까? 실제 꼭지점 데이터를 복제 할 필요는 없지만 선 또는 삼각형을 그릴 지 여부에 따라 사용하는 별도의 인덱스 배열을 가질 수 있습니다. –

+0

전혀 해결책이없는 것보다 나은 해결책입니다. – Caustic

+0

사용하지 않는 기능을 사용하지 않으려는 경우 [가장자리 플래그] (http://www.felixgers.de/teaching/jogl/polygonEdgeRemoval.html)를 제공 할 수 있습니다. – genpfault

답변

1

가장 실용적인 방법은 가장 단순한 방법입니다. 선 및 삼각형 렌더링에 별도의 인덱스 배열을 사용하십시오. 확실히 정점 속성을 복제 할 필요는 없지만 같은 인덱스를 사용하여 완전히 다른 기본 유형을 그리는 것은 매우 문제가 있습니다.

이렇게 구현하려면 두 개의 다른 인덱스 (GL_ELEMENT_ARRAY_BUFFER) 버퍼를 사용할 수 있습니다. 또는 더 우아하게 IMHO, 단일 버퍼를 사용하고 두 세트의 인덱스를 저장합니다. 삼각형 렌더링에 triIdxCount 색인이 필요하고 라인 렌더링에 lineIdxCount 색인이 필요합니다. 그런 다음 당신 인덱스 버퍼를 설정할 수 있습니다

다음
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuf); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 
      (triIdxCount + lineIdxCount) * sizeof(GLushort), 0, 
      GL_STATIC_DRAW); 
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 
       0, triIdxCount * sizeof(GLushort), triIdxArray); 
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 
       triIdxCount * sizeof(GLushort), lineIdxCount * sizeof(GLushort), 
       lineIdxArray); 

, 그릴 준비가되면, (이상적 상태 설정의 모두를위한 VAO 사용) 결합 인덱스 버퍼를 포함하여 모든 상태를 설정 다음 조건에 렌더링 : 인덱스의 두 세트를 가진보기의 메모리 사용 관점에서

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuf); 
if (renderTri) { 
    glDrawElements(GL_TRIANGLES, triIndexCount, GL_UNSIGNED_SHORT, 0); 
} else { 
    glDrawElements(GL_LINES, lineIdxCount, GL_UNSIGNED_SHORT, 
        triIndexCount * sizeof(GLushort)); 
} 

가 오버 헤드의 적당한 양이다. 실제 정점 속성 데이터는 일반적으로 인덱스 데이터보다 훨씬 크며 여기에서 중요한 점은 속성 데이터가 복제되지 않는다는 것입니다.

선을 엄격하게 렌더링하지 않고 와이어 프레임 유형의 렌더링을 요구하는 경우에는 다른 옵션이 있습니다. 예를 들어 우아한 방식 (절대로 직접 구현하지는 않으나 영리하게 보임)에서는 다각형 경계 가까이에서 픽셀 만 그릴 수 있으며 다각형 가장자리까지의 거리를 기반으로 조각 쉐이더에서 내부 픽셀을 삭제할 수 있습니다. 이 질문 (내가 답변에 기여한 곳)은 접근 방식을 자세히 설명합니다 : Wireframe shader - Issue with Barycentric coordinates when using shared vertices.

+0

훌륭한 포괄적 인 대답입니다. 고맙습니다. – Caustic

관련 문제