가장 실용적인 방법은 가장 단순한 방법입니다. 선 및 삼각형 렌더링에 별도의 인덱스 배열을 사용하십시오. 확실히 정점 속성을 복제 할 필요는 없지만 같은 인덱스를 사용하여 완전히 다른 기본 유형을 그리는 것은 매우 문제가 있습니다.
이렇게 구현하려면 두 개의 다른 인덱스 (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.
두 개의 인덱스 배열을 사용할 수 있습니까? 실제 꼭지점 데이터를 복제 할 필요는 없지만 선 또는 삼각형을 그릴 지 여부에 따라 사용하는 별도의 인덱스 배열을 가질 수 있습니다. –
전혀 해결책이없는 것보다 나은 해결책입니다. – Caustic
사용하지 않는 기능을 사용하지 않으려는 경우 [가장자리 플래그] (http://www.felixgers.de/teaching/jogl/polygonEdgeRemoval.html)를 제공 할 수 있습니다. – genpfault