2016-11-01 2 views
-1

Ich erstelle 2+ einfache UBOs mit vec4 colorA's und colorBs wie so. Ich bekomme nur einen schwarzen Bildschirm mit dem unnötig komplexen UBO-Erstellungs-/Bindeprozess mit std140. Wie lege ich fest, welcher Index bei der Verwendung von glCreate verwendet wird, damit dieses Chaos funktioniert, damit ich colorA oder colorB wählen kann?Wie spezifiziert man die UBO-Bindung mit Bindless?

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

Antwort

0

Vor diesem Shader:

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

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

Und das C++ Puffer Initialisierungscode:

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

Hier ist, was die die NV_uniform_buffer_unified_memory "bindless" Code wie folgt aussieht:

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

Beachten Sie, dass diese Erweiterung effektiv glEnable/DisableClientState erfordert, eine Funktion, die aus dem Kernprofil entfernt wurde. Sie müssen also ein Kompatibilitätsprofil verwenden, um es zu verwenden.

Und nur um zu beweisen, dass der Nicht-bindless Code ist kaum „unnötig komplex“, hier ist es:

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

dank fehlte Aufruf 'glBufferAddressRangeNV' – waaitt

Verwandte Themen