- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我用 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/
AFAIK 是 WebGL 中非常有限的计算着色器模型。这方面的文档更少。我很难找到问题的答案。 是否有可能在一个或多个 VBO/UBO 上执行计算着色器并更改它们的值? 最佳答案 更新:2019 年
AFAIK 是 WebGL 中非常有限的计算着色器模型。这方面的文档更少。我很难找到问题的答案。 是否有可能在一个或多个 VBO/UBO 上执行计算着色器并更改它们的值? 最佳答案 更新:2019 年
我正在关注以下教程:Here . 我已经完成加载模型,所以我的代码与那一点类似。 我现在正尝试以与之前所示类似的方式将另一个结构传递给统一缓冲区对象。 我创建了另一个在应用程序外部定义的结构来存储数据
我想将包含两个 4x4 矩阵的统一缓冲区对象传递给顶点着色器。我已在 C++ 中声明结构如下: struct PerRenderUBO { glm::mat4 viewProjection;
我目前正在使用 UBO 在 OpenGL 4.3 中进行渲染,以将我所有的常量数据存储在 GPU 上。 (诸如 Material 描述、矩阵等之类的东西)。它可以工作,但是 UBO 的小尺寸(我的实现
我正在研究 OpenGL Uniform Buffer Objects 和 Shader Storage Buffers。我认为这个问题适用于他们两个,但让我们只关注 UBO。 教程好像在说“块索引”
我有以下情况。在一个数组中包含 4 个 uint64_t 的 UBO 结构。 struct MaterialData{ uint64_t comps[4]; }; layout
我已按照 www.vulkan-tutorial.com 上的教程进行操作我正在尝试将统一缓冲区拆分为 2 个单独的缓冲区,一个用于 View 和投影,一个用于模型。然而,我发现一旦我向布局添加另一个
我用 vec4 colorA 和 colorB 创建了 2 个以上的简单 UBO。使用带有 std140 的不必要的复杂 UBO 创建/绑定(bind)过程,我只会得到一个黑屏。我如何在使用 glCr
我的问题与 opengl 中如何处理分配有关。如果您使用 glGenBuffers(1, &id) 创建一个缓冲区对象,那么假设使用 glBindBuffer(GL_ARRAY_BUFFER, id)
在 article on Imagination's website ,我已阅读以下段落: For example, there are no glUniform*() equivalent entr
如果我正在进行实例化渲染并且需要将每个实例一个 mat4 发送到顶点着色器,对于大量实例,哪种方法可能更快? 使用实例化的 mat4 属性 (glVertexAttribDivisor) 并将 mat
我正在浏览 this关于如何在 openGL 中使用统一缓冲区对象的页面,看到了以下结构: struct shader_data_t { float camera_position[4];
我是一名优秀的程序员,十分优秀!