저는 현재 "glDrawArrays (GL_TRIANGLES, ...);"로 그리는 텍스처 좌표, 법선 및 (3DS) 모델의 정점에 VBO를 사용하고 있습니다. " 디버깅을 위해 모델을 그릴 때 법선을 (일시적으로) 표시하려고합니다. 즉각적인 모드를 사용하여 각 선을 vert에서 vert + normal로 그리거나, 또는 다른 VBO를 vert와 vert + normal로 채우고 모든 법선을 그려야합니다 ... 아니면 vertex shader가 정점을 사용하는 방법이 있습니까? 법선을 그리는 데 사용되는 V + N을 계산하기 위해 모델을 그릴 때 이미 전달 된 일반 데이터?버텍스 쉐이더를 사용하여 모델 법선을 표시 할 수 있습니까?
답변
아니요, 버텍스 쉐이더에서 추가 선을 그릴 수 없습니다.
버텍스 쉐이더는 지오메트리를 만드는 것이 아니라 버텍스 계산 당입니다. 버텍스 쉐이더를 사용하면 glDrawArrays(GL_TRIANGLES,0,3)
이라고 할 때 정확히 무엇을 그리는 지, 즉 1 개의 삼각형을 지정합니다. 처리가 정점 셰이더에 도달하면 해당 삼각형의 정점 의 속성 만 변경할 수 있으며 모양, 형태 또는 형상의 토폴로지 및/또는 개수는 수정하지 마십시오.
당신이 찾고있는 것은 무엇입니까 OpenGL 3.2는 셰이더 밖으로 임의의 지오메트리 수/토폴로지를 출력 할 수있는 geometry 셰이더으로 정의합니다. 그러나 OpenGL 3.2를 통해서만 지원된다는 점에 유의하십시오. 현재 많은 카드/드라이버가 지원되지 않습니다 (지금은 몇 달 동안 사용되지 않았습니다).
그러나 어떤 종류의 디버깅을 지원하는 대부분의 엔진에서 법선을 표시하는 것은 보통 적절한 라인 위치로 채워지는 추가적인 버텍스 버퍼를 사용하여 전통적인 라인 렌더링으로 수행됩니다 (P, P + C * N). 여기서 C는 법선을 표시하는 데 사용할 길이를 나타내는 상수입니다. 쓰는 것이 그렇게 복잡하지는 않습니다 ...
영리한 버텍스 쉐이더로 올바른 효과를 얻는 것이 가능할 수도 있지만 많은 작업이 필요합니다. 어쨌든 이것은 디버깅을 목적으로하기 때문에 몇 줄을 그리는 것이 좋습니다. 성능 저하는 심각하지 않습니다.
모든 textcoors, 법선 및 verts를 VBO에 넣기 위해 모든 작업을 수행 한 후에는 법선을보기 위해 모든 작업을 다시 수행해야하는 것처럼 보입니다 ... 몇 줄의 말은 아닙니다 ... 더 좋아합니다. 10K +. 더 쉬운 (일시적인) 해결책을 원합니다 ... 응답에 감사드립니다. ;-) – geowar
@geowar : 10k 줄의 소스? 많은 코드가 필요한 모델로 무엇을하고 있습니까? 어쨌든, 나는 그것이 왜 중요한지 알지 못한다. glDrawArrays()에 전달할 배열에서 꼭지점과 법선을 꺼내고, 줄 모드를 입력하고, 여러 줄을 그립니다. –
10K 라인의 소스가 아닙니다. 이미 VBO에 10K + 데이터 포인트가 있습니다.기하학 셰이더를 사용하면 VBO 데이터를 재사용하여 법선을 그릴 수 있습니다 (디버깅 용). – geowar
기하학을 두 번 그리면 대략적으로 나타납니다. 평소처럼 그리십시오. 두 번째로는 GL_POINTS로 도형을 그리고 각 꼭지점 위치를 꼭지점 법선으로 오프셋하는 꼭지점 셰이더를 연결합니다.
이렇게하면 표면에 점 집합이 떠있는 모델이됩니다. 각 점은 해당 꼭지점에서 법선의 방향을 나타냅니다.
이것은 완벽하지는 않지만 사용하고자하는 바에 따라 충분할 수 있습니다.
업데이트 : AHA! 그리고 정점 셰이더에 일정한 스케일링 요소를 전달하고 시간이 지남에 따라 애플리케이션이 0과 1 사이의 요소를 보간하도록하면, 정점 셰이더에 의해 렌더 된 포인트는 적용되는 정점에서 시작하여 시간이 지남에 따라 애니메이션을 적용하고, 그 다음 정상 방향으로 부풀어 오른다.
geometry shader : 그게 내가 찾고있는 ... 고마워! – geowar