首页 > 解决方案 > 如何分两个阶段编写 OpenGL 片段着色器?

问题描述

我正在编写一个绘制曼德布罗集的程序。对于每个像素,我运行一个函数,它返回一个介于 0 和 1 之间的激活数。目前,这是在片段着色器中完成的,激活是我的颜色。

但是想象一下你放大分形,突然你在屏幕上看到的所有激活值都在 0.87 到 0.95 之间。你不能很好地看到差异。

我正在寻找一种方法来首先计算所有激活并将它们存储在一个数组中,然后根据该数组选择颜色。出于性能原因,这两者都需要在 GPU 上运行。

标签: openglfragment-shadercompute-shader

解决方案


所以你需要找到你渲染的图片的最小和最大强度。这不能在一次绘制中完成,因为这些值是非本地的。一种可能的方法是递归地应用将图像缩小一半的管道,计算 2x2 正方形的最小值和最大值并将它们存储在例如 RG 纹理中(一种 mipmap 生成,使用 min/max 而不是平均颜色)。最后,您有一个 1x1 纹理,其中包含图像的唯一像素中的最小值和最大值。您可以在将激活值映射到颜色的最终渲染中对该纹理进行采样。


推荐阅读