c++ - 您可以从着色器中修改制服吗?如果是这样。如何?

标签 c++ opengl vertex-shader

所以我想将所有网格存储在一个大型 VBO 中。问题是,你如何做到只有一个绘制调用,但让每个网格都有自己的模型到世界矩阵?

我的想法是在绘制之前将一组矩阵提交给统一。在 VBO 中,我会将网格的每个第一个顶点的颜色设为负值(因此我将使用签名位来检查顶点是否是网格的第一个顶点)。

好的,这样我就可以检测到新网格何时开始,并且我已经准备好一组矩阵,可能还有一个名为“索引”的制服。但是如何在每次遇到新网格时将此索引增加一?

您可以在着色器中修改制服吗?如果是,怎么办?

最佳答案

Can you modify a uniform from within the shader?

如果可以,它就不会统一了,对吗?

此外,即使使用图像加载/存储或 SSBO,您想要做的也无法完成,这两者都允许着色器写入数据。它不会工作,因为顶点着色器调用不需要顺序执行。许多同时发生,并且任何着色器调用都无法知道它将在网格中的“第一个顶点”“之后”发生。

处理此问题的最简单方法是显而易见的解决方案。单独渲染每个网格,但在每次绘制调用之前为每个网格设置制服。当然,无需在绘制之间更改缓冲区。统一更改虽然并不十分便宜,但并不是现有的最昂贵的状态更改。

有更复杂的绘图方法可以让您获得更高的性能。但这种形式足以满足大多数需要。您已经完成了困难的部分:除了统一状态之外,您不再需要任何状态更改(纹理、缓冲区、顶点格式等)。

关于c++ - 您可以从着色器中修改制服吗?如果是这样。如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36910671/

相关文章:

opengl-es - 如何在 OpenGL es 2.0 vertex shader pro 中找到所有制服的列表

opengl-es - 顶点万花筒着色器

ios - 在顶点着色器中创建纹理并传递给片段以实现使用 Metal 涂抹画笔?

c++ - gcov 与 CMake 使用单独的构建目录

c++ - 将流运算符与模板类一起使用

C# OpenGL字体显示

macos - 如何使用 GLFW 轮询 libdispatch block 中的事件?

c++ - 从主线程 c++11 执行函数调用的线程

c++ - 在线段上的水平和垂直翻转

ruby - 如何使用 | 将多个参数传递给 Ruby 方法