gpt4 book ai didi

c++ - 如何使用无绑定(bind)指定 UBO 绑定(bind)?

转载 作者:行者123 更新时间:2023-11-28 05:26:58 26 4
gpt4 key购买 nike

我用 vec4 colorA 和 colorB 创建了 2 个以上的简单 UBO。使用带有 std140 的不必要的复杂 UBO 创建/绑定(bind)过程,我只会得到一个黑屏。我如何在使用 glCreate 时指定哪个索引并让这个困惑工作,以便我可以选择 colorA 或 colorB?

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

最佳答案

给定这个着色器:

//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 的内容“无绑定(bind)”代码如下所示:

//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,这是一个已从核心配置文件中删除的函数。因此,您需要使用兼容性配置文件才能使用它。

为了证明非绑定(bind)代码几乎不是“不必要的复杂”,这里是:

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

关于c++ - 如何使用无绑定(bind)指定 UBO 绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40352610/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com