2016-11-01 7 views
-1

Я создаю 2+ простых UBO с цветами vec4 colorA и colorB. Я получаю только черный экран, используя ненужно сложный процесс создания/связывания UBO с std140. Как указать какой индекс при использовании 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