OpenGL - 在不使用 NV_gpu_shader5 的情况下访问 glMultiDrawElementsIndirect 内的无绑定(bind)纹理

标签 opengl glsl textures

我使用 glMultiDrawElementsIndirectARB_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/

相关文章:

javascript - 启动一些顶点/三 Angular 形供顶点着色器使用

three.js - 为什么我的 "X"没有通过透明矩形显示?

c++ - OpenGL - 将变换应用于 3D 空间中的多边形

c - OpenGL:用于加载资源的辅助线程?

math - Glsl mod 与 Hlsl fmod

qt - Text2DEntity 呈现不透明并隐藏其后面的其他实体

c# - 如何在 Unity 中使用粗糙度纹理?

java - 立方体渲染: Textures displaying incorrectly

c++ - 绘制带渐变的圆有问题

OpenGL - 自定义透视矩阵和着色器的问题