gpt4 book ai didi

opengl - 一次更新多个着色器程序中的统一变量

转载 作者:行者123 更新时间:2023-12-02 09:32:49 25 4
gpt4 key购买 nike

我有几个带有统一变量的着色器,它们在所有着色器中具有相同的名称。一次更新所有着色器中具有相同名称的制服的最佳方法是什么?我考虑以下方法:

1) 只需存储每个程序的制服位置,并在该程序被指定为“已使用”程序 (glUseProgram) 后立即更新它。

缺点:所有“共享”统一变量将在每次 glUseProgram 调用后更新。此外,如果某个程序在当前帧期间不是第一次使用,则所有 glUniform* 调用都将是多余的。或者,应该有一组标志来判断该程序是否是第一次使用。 “未使用”标志应该每帧重置。

2) 使用统一缓冲区和共享(甚至std140)布局。在这种方法中,我们可以立即设置一个统一,然后更改着色器程序而不更新缓冲区。但是,如果有一堆简单的着色器,其中唯一的共享变量是变换矩阵怎么办?对于这么小的内存使用统一缓冲区可以吗?在一些论坛讨论中我读到过

glBindBuffer(GL_UNIFORM_BUFFER,buf);
glBufferSubData(/*just 16 floats*/);
glBindBuffer(GL_UNIFORM_BUFFER,0);

glUniform* 调用慢得多。在这里我们可以注意到,第一种方法和第二种方法的选择取决于以下条件:

  • 着色器每帧更改的频率以及重复的频率如何?
  • 有多少“共享”制服?
  • 每帧中应向着色器程序传递多少数据?

无论这三个问题的答案如何,是否有任何折衷的设计模式都将具有良好的性能?

3) 使用 ubershader。这里第二段提到:GLSL multiple shaderprogram VS uniforms switches 。我有两个问题:

什么具有更好的性能:一次 glUseProgram 调用或多个统一开关,这将改变 ubershader 的功能?

提到的该问题的作者

Uniforms have to be changed many times per frame

这是 ubershader 的缺点之一。但为什么不好呢?是不是性能不好?如果是这样,是否可以将变换矩阵和其他一些小尺寸的东西作为统一变量传递并每帧更新它们?

总结上述所有内容的主要问题:您是否可以建议任何其他技术或设计模式来更新多个不同着色器程序中的同名统一变量?

UPD:答案已被接受,但是如果您可以建议一种重要的高级设计技术(用 C++ 或与语言无关),请将其留在这里。

最佳答案

In some forum discussions I've read that [...] is much slower than glUniform* call.

如果是的话又怎样(当然,假设有证据表明确实如此)?每帧只需执行一次,而 glUniform 调用是每个修改后的程序一次。

对于任何共享数据,我都会使用统一 block (默认情况下始终使用 std140)。更新它们的成本是固定的,而更新其他的成本是可变的。

关于opengl - 一次更新多个着色器程序中的统一变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14403177/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com