2016-11-01 18 views
-1

我使用vec4 colorA和colorB創建了2 +個簡單的UBO。我只使用與std140不必要的複雜UBO創建/綁定過程獲得黑屏。如何在使用glCreate時指定哪個索引並讓這個混亂起作用,以便我可以選擇colorA或colorB?如何使用無束指定UBO綁定?

//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

鑑於這種着色器:

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

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

而這個C++緩衝區初始化代碼:

//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