2017-01-20 5 views
0

나는 버텍스 쉐이더가 실행될 때마다 기본적으로 그려지는 버퍼 (VBO)의 일부에 접근한다는 것을 알고있다. 예를 들어 버텍스 번호 7을 그리면 기본적으로 버텍스 애트리뷰트를 기반으로 VBO에 7 개의 버텍스를 인덱싱한다.OpenGL에서 버텍스 쉐이더에서 드로잉하는 버퍼에 액세스 할 수 있습니까?

layout (location = 0) in vec3 position; 
layout (location = 1) in vec3 normal; 
layout (location = 2) in vec3 texCoords;  // This may be running on the 7th vertex for example. 

는 내가 뭘 원하는 예를 들어, VBO의 이전 부분에 액세스 할 수 있습니다, 그래서 7 정점을 그리기 때 나는 보간 할 수 있도록, 예를 들어 정점 번호 1에 대한 액세스 권한을 가지고 싶습니다 그것으로.

이미 셰이더를 실행할 때 이미 VBO에 인덱싱되어있는 것을 볼 때 이것이 가능하다고 생각하지만 어떻게해야할지 모르겠다.

감사합니다.

+0

vbo를 ssbo로 바인딩하고 쉐이더에서 액세스 할 수는 있지만 이것은 실제적인 것이 아닙니다. 질문의 범위가 더 넓습니까? 달성하고자하는 것은 무엇입니까? – pleluron

+0

@pleluron 지형을 나타내는 커다란 정점 격자를 가지고 있고, 많은 정점은 모서리 타겟으로 그리드에 다른 정점을 가지고있어서 보간되는 모프 타겟으로 디테일 전환 레벨이 매끄 럽습니다. 현재 vertex 속성 레이아웃을 위치, morphTargPosition, normal, morphTargNormal, texCoords, morphTargCoords - 기본적으로 두 배로 늘 렸습니다. 실제로 생각보다 잘 작동하지만 분명히 이런 공간 낭비입니다. – Zebrafish

답변

0

문서에서 알 수 있듯이, 버텍스 속성은 모든 셰이더가 실행될 때마다 변경 될 것으로 예상됩니다. 따라서 아니요, 정점 셰이더의 다른 정점에 정의 된 속성에 액세스 할 수 없습니다.

아마도 다음을 수행 할 수 있습니다. 균일 한 배열을 정의하고 필요한 값을 전달하십시오. 그러나이 방법으로 더 많은 메모리를 사용하고 있음을 명심하십시오. 더 많은 데이터를 전달해야합니다.

+0

VBO가 이미 GPU 메모리에있는 경우 셰이더의 버퍼 개체처럼 VBO에 액세스 할 수 있습니까? 예를 들어 유니폼처럼 셰이더에서 바인딩하는 것이 가능하다는 것을 알고 있습니다.하지만 각 드로잉에서 유니폼을 업데이트해야한다는 것을 의미합니다. 버퍼가 이미 GPU 메모리에 있기 때문에 이것은 실제로 이해가되지 않습니다. – Zebrafish

+0

@Titone Maurice 아니, 나는 그렇게 생각하지 않는다. VBO/로컬 배열 모두에서 동일한 쉐이더를 사용할 수 있지만 쉐이더에서 이들을 구별 할 수는 없기 때문에 OpenGL은 같은 것을 많이 취급하지만 데이터는 다른 위치에 있습니다. – Reaper

0

@Reaper에 따르면 균일 한 버퍼를 사용할 수 있으므로 자유롭게 액세스 할 수 있습니다. 그러나 GPU는 랜덤 액세스를 좋아하지 않으므로 일반적으로 데이터를 스트리밍하는 것이 더 효율적입니다.

C++에서는 모든 정점을 처리 할 수 ​​있기 때문에 이후/이전 정점의 데이터를 배열에 추가하여이를 해결할 수도 있습니다. 어떤 데이터를 전달할 수있는 사실

{ 
    vertex1_x, vertex1_y, vertex1_z, normal1_x, normal1_y, normal1_z, texCoord1_x, texCoord1_y, vertex2_x, vertex2_y, vertex2_z, normal2_x, normal2_y, normal2_z, texCoord2_x, texCoord2_y, 
    ... 
} 

:과 다른 정점으로 보간하는

{ 
    vertex1_x, vertex1_y, vertex1_z, normal1_x, normal1_y, normal1_z, texCoord1_x, texCoord1_y, 
    ... 
} 

는 그런 다음 데이터로 확장 할 수있다 : 이것은 "정상"배열 인 경우

버텍스마다. 스트라이드 크기와 기타 매개 변수가 glVertexAttribPointer 매개 변수에서 조정되었는지 확인하십시오.

+0

그래, 그 순간에 내가하고있는 일이지만, 모든 것이 두 배로 커지게된다. 표준 pos, norm, texCoords 외에도 나는 접선과 다른 UV 채널 등을 원할 수 있습니다. 무승부 콜이 버퍼를 드로잉하고 있지만 정점 또는 프리미티브를 제외하고는 아무 것도 액세스 할 수 없습니다.다른 버퍼를 만들고 유니폼으로 묶는 경우에도 버퍼가 이미 GPU에로드 된 경우 왜 다른 버퍼를 만들어야합니까? – Zebrafish

+0

@TitoneMaurice : 예, 유니폼 버퍼가있는 경우 셰이더가 현재 버텍스인지 알 수 있도록 버텍스의 "ID"(인덱스 번호)가 포함 된 다른 버퍼를 "그릴"필요가 있습니다. 지형이 큰 경우 문제가 발생할 수 있습니다. 오늘날의 GPU에서는 최대 균일 버퍼 크기가 약 64KB이기 때문입니다. –

+0

사실 나는 다른 아이디어가 있습니다. 중복 데이터를 스트리밍하지 말고 대신 셰이더 내부의 로컬 배열을 정의하십시오. 그릴 때 현재의 정점을 저장하지만 최근 10 개의 정점에 대한 데이터 만 유지합니다. 이 작업을하려면 서로 모핑 할 수있는 꼭지점을 닫아야합니다. (고정 된 거리에 두십시오) 이런 방식으로 최소한의 로컬 메모리를 사용하게됩니다. –