c++ - 着色器限制

标签 c++ opengl glsl shader

我一直在为配备 Radeon HD 3850 的笔记本电脑调整游戏的渲染器。该芯片具有不错的处理能力,但内存带宽有限,因此我一直在尝试将更多的着色器工作转移到更少的传球次数。

以前,我使用的是简单的多 channel 模型:

  • 绑定(bind)并清除 FP16 混合缓冲区(带深度缓冲区)
    • 仅深度通行证
    • 对每个灯光,做一个附加的灯光 channel
  • 绑定(bind)后台缓冲区,使用混合缓冲区作为纹理
    • 色调映射 channel

为了提高这种方法的性能,我编写了一个新的渲染路径,用于计算灯光的数量和类型,以动态构建自定义 GLSL 着色器。这些着色器接受所有光照参数作为制服,并在一次通过中完成所有光照。我预计会遇到某种限制,所以我先用一盏灯对其进行了测试。然后三个。然后是 21 个,没有错误或伪像,并且表现出色。这引出了我的实际问题:

Is the maximum number of uniforms retrievable?

Is this method viable on older hardware, or are uniforms much more limited?

If I push it too far, at what point will I get an error? Shader compilation? Program linking? Using the program?

最佳答案

着色器统一通常由硬件作为寄存器实现(或者有时通过将值直接修补到着色器微代码中,例如 nVidia 片段着色器)。因此,该限制高度依赖于实现。

您可以通过分别查询顶点和片段着色器的 GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARBGL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 来检索最大值。

关于c++ - 着色器限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1792776/

相关文章:

c++ - 将 C++ 的相同功能/概念转换为序言

c++ - 下标是否在赋值运算符的右侧之前计算

c - 在 C 中绘制过剩对象之间的交集

c++ - 素描圆柱体

c++ - 绝对比例 - 旋转比例 vector

opengl - 简单的程序天空盒

c++ - 打印 vector - 空输出

php - postgresql 位串与否?

swift - iOS 10 打破自定义 CIFilter

opengl - 多重采样和片段着色器