glgetProgramrogramRogramUnceIndex返回错误的索引

问题描述 投票:0回答:0

这些两个均匀的缓冲区明确链接到结合点0和1。还有其他统一的缓冲块,但所有均匀的缓冲区的名称和结合点都不同。 但是,我在这两个统一块上遇到了错误,因此我认为列出所有其他统一块没有用。

I使用通用方法将它们(以及所有其他缓冲区)绑定,该方法是在绘制呼叫之前完成的,如下所示:

// Get shader program ... glUseProgram(program); // binding of textures and uniform data ... for (auto& buffer : rc.AdditionalBufferData) { GLuint bufferIndex = glGetProgramResourceIndex(program, buffer.ResourceProgramInterface, buffer.Name.data()); glBindBufferBase(bufferGL.Target, bufferIndex, buffer.ID); } // draw ...
(Buffer

对象包含有关缓冲区的信息,例如名称,程序接口(gl_uniform_block,gl_shader_storage_block,...),缓冲区对象ID,...)

对于某些着色器程序,它可以正常工作,但是有时我会遇到错误的视觉结果。在调试过程中,我注意到,对于给出错误结果的着色器程序,GLGETPROGRAGROGRAGROGRAGYREGRAGYERCEINDEX()函数返回

cameradata
transformdata

统一缓冲区1和0而不是0和1。 : renderdoc捕获屏幕截图

可以看到缓冲液的倒尺寸。 如果我将两个缓冲液的索引分别迫使cameradata

和transformdata分别为0和1(而不是1和0),则问题是固定的,视觉结果是正确的。 我在网上没有发现类似的东西,所以我试图更改装订点,名称和其他次要内容,但没有运气。对我来说,这似乎是一个低级错误。有没有人发生过类似的事情? 我使用OpenGL Core4.5.

问题是,您将资源指数视为结构指数。他们不是同一件事。 资源索引是任意数字,其唯一目的是在着色器中充当资源的数值标识符。这些索引无法从着色器设置,并且应在其他程序资源API中使用它们。

如果您想通过名称获取均匀缓冲区的缓冲型绑定索引,则需要查询

GL_BUFFER_BINDING属性通过。您将

glGetProgramResourceiv

program和资源索引传递给此功能。

c++ opengl glsl opengl-4
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.