我使用 glMultiDrawElementsIndirect
与 ARB_bindless_texture
的组合来绘制东西。我使用内置顶点着色器变量 gl_DrawID
获取纹理句柄。该变量据说是一个动态统一表达式,这意味着在访问着色器内的无绑定(bind)纹理时,我不必依赖 NV_gpu_shader5。它看起来像这样。
#version 460 core
out flat int MaterialIndex;
void main()
{
...
MaterialIndex = gl_DrawID;
}
#version 460 core
#extension GL_ARB_bindless_texture : require
struct Material
{
sampler2D Albedo;
ivec2 pad0;
};
layout(std140, binding = 1) uniform BindlessUBO
{
Material Materials[256];
} bindlessUBO;
in flat int MaterialIndex;
void main()
{
Material material = bindlessUBO.Materials[MaterialIndex];
vec3 albedo = texture(material.Albedo, coords).rgb;
}
这适用于 NVIDIA RTX 3050 Ti,支持 NV_gpu_shader5
。模型及其所有网格和纹理在一次绘制调用中正确绘制。然而,在不支持扩展的 AMD RX 5700XT 上,驱动程序会在几秒钟后崩溃。两个 GPU 都可以渲染没有任何纹理的模型。所以现在我的猜测是 MaterialIndex
不是一个动态统一的表达式,即使它从其中获取其值。将 MaterialIndex
从顶点传递到片段着色器是否会使其成为非到期项?如何获取片段着色器中 glMultiDrawElementsIndirect
中绘图命令的索引作为 d.u.e?有没有办法在没有 NV_gpu_shader5
的情况下完成我想要做的事情?
最佳答案
从 AMD 驱动程序 19.12.2
升级到 21.12.1
后,该错误消失了。因此,使用 flat
限定符将 gl_DrawID
从顶点传递到片段着色器实际上确实将其保留为动态统一表达式,并且我不需要依赖 NV_gpu_shader5
:)。
关于OpenGL - 在不使用 NV_gpu_shader5 的情况下访问 glMultiDrawElementsIndirect 内的无绑定(bind)纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70377014/