2016-11-01 1 views
-1

저는 vec4 colorA와 colorB로 2+ 간단한 UBO를 만듭니다. std140을 사용하여 불필요하게 복잡한 UBO 생성/바인딩 프로세스를 사용하는 검정 화면 만 표시합니다. 어떻게 glCreate를 사용하면서 어떤 인덱스를 지정하고이 엉망이 작동하도록 할 수있어서 colorA 또는 colorB를 선택할 수 있습니까?바인드없는 UBO 바인딩을 지정하는 방법은 무엇입니까?

//GLSL 
layout(std140, binding = 0) uniform sceneBuffer 
{ 
    vec4 colorA; 
}; 

layout(std140, binding = 1) uniform objectBuffer 
{ 
    vec4 colorB; 
}; 

그리고이 C++ 버퍼 초기화 코드 :이 쉐이더을 감안할 때

//APP 
glCreateBuffers(1, &testUBO); 
glNamedBufferData(testUBO, sizeof(glm::vec4), 0, GL_DYNAMIC_DRAW); 
glGetNamedBufferParameterui64vNV(testUBO, GL_BUFFER_GPU_ADDRESS_NV, &uboScene_64); 
glMakeNamedBufferResidentNV(testUBO, GL_READ_ONLY); 


glm::vec4 myVec4 = glm::vec4(0.f, 1.f, 0.f, 1.f); //add to structs.h 
glNamedBufferSubData(testUBO, 0, sizeof(glm::vec4), &myVec4 

//SHARED HEADER 
typedef glm::vec4 vec4; 

layout(std140, binding = 0) uniform sceneBuffer 
{ 
    vec4 colorA; 
}; 

layout(std140, binding = 1) uniform objectBuffer 
{ 
    vec4 colorB; 
}; 

//SHADER PROGRAM 
void main() 
{ 
    Ci = colorA; 
    Ci = colorB; 
} 

답변

0

여기

//Create scene buffer. 
glCreateBuffers(1, &sceneUbo); 
glNamedBufferStorage(sceneUbo, sizeof(glm::vec4), 0, GL_DYNAMIC_STORAGE_BIT); 

glm::vec4 myVec4 = glm::vec4(0.f, 1.f, 0.f, 1.f); 
glNamedBufferSubData(sceneUbo, 0, sizeof(glm::vec4), &myVec4); 

//Create object buffer 
glCreateBuffers(1, &objectUbo); 
glNamedBufferStorage(objectUbo, sizeof(glm::vec4), 0, GL_DYNAMIC_STORAGE_BIT); 

glm::vec4 myVec4 = glm::vec4(0.f, 1.f, 0.f, 1.f); 
glNamedBufferSubData(objectUbo, 0, sizeof(glm::vec4), &myVec4); 

은 무엇인지하여 NV_uniform_buffer_unified_memory "bindless"코드가 보이는 같은 :

//Get addresses 
GLuint64 sceneUboAddr; 
glGetNamedBufferParameterui64vNV(sceneUbo, GL_BUFFER_GPU_ADDRESS_NV, &sceneUboAddr); 
glMakeNamedBufferResidentNV(sceneUbo, GL_READ_ONLY); 

GLuint64 objectUboAddr; 
glGetNamedBufferParameterui64vNV(objectUbo, GL_BUFFER_GPU_ADDRESS_NV, &objectUboAddr); 
glMakeNamedBufferResidentNV(objectUbo, GL_READ_ONLY); 

//You have to call this to turn on bindless buffers. 
glEnableClientState(UNIFORM_BUFFER_UNIFIED_NV); 

//0 represents the scene UBO's `binding` from GLSL: 
glBufferAddressRangeNV(UNIFORM_BUFFER_ADDRESS_NV, 0, sceneUboAddr, sizeof(glm::vec4)); 
//1 represents the object UBO's `binding` from GLSL: 
glBufferAddressRangeNV(UNIFORM_BUFFER_ADDRESS_NV, 1, objectUboAddr, sizeof(glm::vec4)); 

이 확장은 실질적으로 glEnable/DisableClientState을 필요로하는데 이는 이 코어 프로파일에서이 제거 된 함수입니다. 따라서 호환성 프로파일을 사용하여 사용해야합니다.

그리고 바로 비 bindless 코드가 거의 "불필요하게 복잡"는 것을 증명하기 위해, 여기있다 :

//The first 0 represents the scene UBO's `binding` from GLSL: 
glBindBufferRange(GL_UNIFORM_BUFFER, 0, sceneUbo, 0, sizeof(glm::vec4)); 
//1 represents the object UBO's `binding` from GLSL: 
glBindBufferRange(GL_UNIFORM_BUFFER, 1, objectUbo, 0, sizeof(glm::vec4)); 
+0

덕분에, glBufferAddressRangeNV''에 전화를 실종됐다 – waaitt

관련 문제