2016-07-27 4 views
1

내 버텍스 쉐이더에 정보를 제공하기 위해 쉐이더 저장 버퍼 객체를 만들었습니다. 단일 구조체를 포함하는 버퍼에 바인딩됩니다. 그러나 문제가 있습니다. 이 구조에서 유지하는 데이터는 간단한 배열이 아니며 std::vector입니다. 여기 OpenGL에 C++ 컨테이너를 제공 하시겠습니까?

의 구조 :

typedef struct { 
    glm::mat4 modelMatrix; 
} entityInfo; 

typedef struct { 
    std::vector<entityInfo> entityInfoBuffer; 
} shaderData; 

mat4는 단순한 4 × 4 플로트 행렬이다.

이것을 OpenGL에 제공하면 GPU로 전송되는 데이터는 행렬/벡터에 대한 포인터 및 정보 일 뿐이며 데이터는 아닙니다.

typedef struct { 
    float* modelMatrix; 
} SSBOentityInfo; 

typedef struct { 
    SSBOentityInfo* entityInfoBuffer; 
} SSBOshaderData; 

하지만 컨테이너의 데이터에 해당하는 eeeeevery 포인터를 복사 할 것 :

하나 개의 솔루션은 OpenGL을위한 단지 구조를 생성하는 것입니다.

더 좋은 방법이 있습니까?

+0

'entityInfoBuffer'의 내용을 GPU에 보내지 않으시겠습니까? CPU 포인터를 GPU에 복사하고 싶지는 않습니다. GPU에 아무런 의미가 없습니다 (임의의 숫자를 복사하는 것일 수도 있습니다). – immibis

+0

나는 셰이더 저장 버퍼 객체를 사용할 때 구조체를 사용해야한다고 생각하니? 나는 틀린가? 그것은'entityInfoBuffer.data()'를 SSBOshaderData'entityInfoBuffer'에 설정해야한다는 것을 의미할까요? 또한 OpenGL은'& mat4 [0] [0]'만 읽을 수 있습니다. – Talesseed

+0

@ Talesseed : "구조체를 사용해야합니까? *"이유가 무엇입니까? 데이터는 데이터이고 메모리는 메모리이며 버퍼 객체는 버퍼 객체입니다. –

답변

4

glm::mat4은 모든 의미와 목적으로 16 float의 배열입니다. 포인터 ~ 16 수레, 실제 float[16] 배열. 16 float s, 하나씩.

따라서 vector<glm::mat4>은 연속적인 요소 배열을 관리합니다. 각 요소는 16 개의 부동 소수점입니다. 버퍼 객체에 저장하려는 데이터입니다. 그래서 ... 그렇게해라.

vector은 연속적인 데이터 배열을 관리하므로이 배열에 대한 포인터를 얻는 것이 매우 적합합니다. 그것은 vector.data()을위한 것입니다. 그래서 그것은 여러분이 glBufferSubData 또는 무엇이든 소스 포인터입니다. 크기는 배열의 요소 수 (vector.size())에 각 요소의 크기와 sizeof으로 계산 된 길이가 곱해집니다.

+0

감사합니다, mat4는 배열이 아니지만. 그러나 나중에 요소를 추가 할 수 있도록 구조체를 사용하려면 어떻게해야합니까? – Talesseed

+0

@ Talesseed : 그게 무슨 뜻인지는 분명치 않지만, 여기서 물어 본 질문과는 다른 질문이라고 확신합니다. –

+0

shaderData에 더 많은 멤버를 추가하고 싶습니다. 그러나 그렇습니다, 나는 이것이 또 다른 질문이라고 생각합니다. – Talesseed