1

首先,我对着色器能做什么知之甚少,而且我对制作顶点光照非常感兴趣。我正在尝试使用 3d 颜色图,用于计算世界该位置的顶点颜色,并使用颜色图中的附近颜色插入颜色。

我不能使用典型的 OpenGL 光照,因为它可能太慢了,而且我需要渲染很多光照。我将首先在颜色图中“渲染”灯光,然后我可以手动映射使用颜色图中相应颜色绘制的每个顶点。

...或者我可以以某种方式自动化这个过程,所以它不必自己更改顶点的颜色值,但着色器也许可以为我做这件事?

问题是......这可能吗,如果是的话:我需要知道什么才能使它成为可能?

编辑:请注意,我还需要有效地更新光照贴图,而不关心光照贴图的大小,因此更新应该只在我想要更新的光照贴图的特定部分进行。

4

3 回答 3

0

听起来您几乎想要做的是将灯光渲染到您的颜色贴图,然后将您的颜色贴图用作纹理,但不是贴花模式,而是将其设置为调制模式,因此它与现有颜色相乘,而不是仅仅替换.

但是,这在一个方面是不同的:它不仅会影响顶点,还会映射到各个片段(本质上是像素)。

编辑:我想到的不是 3D 纹理——而是立方体贴图。基本上,创建一个围绕“世界”中所有事物的虚拟立方体。为该立方体的每个面创建一个 2D 纹理。将您的颜色渲染到立方体贴图。然后,为顶点着色,您(实际上)从中心向外延伸一条射线,穿过顶点,到达立方体。您在立方体贴图上点击的像素会为您提供该顶点的照明颜色。

更新应该是相对有效的——你有顶部、底部、前面等的正常 2D 纹理,你可以根据需要更新它们。

于 2010-11-19T16:34:01.433 回答
0

这是可能的,但在当前硬件上无效。

您想将光体积渲染为 3d 纹理。光栅化器在 2D 表面上工作,因此您的体积必须沿其中一个轴拆分。可以通过以下方式之一进行拆分:

  • 每次拆分都有不同的绘制调用
  • 实例化绘制,基于 glInstanceID 的图层选择(需要几何着色器)
  • 直接从单个绘图调用在几何着色器中分支

为了实现它,我建议阅读 GL-3 规范和示例。这并不容易,对于复杂场景的结果也不会足够快。

于 2011-02-11T16:53:35.603 回答
0

如果您不能使用固定函数管道功能,那么执行每个顶点光照的最佳方法应该是在顶点着色器中对每个顶点进行所有光照计算,然后当您将它传递给片段着色器时,它将被正确插值在脸。

使用大量光源时处理性能问题的另一种方法是使用延迟渲染,因为它只会对实际可见的几何图形进行光照计算。

于 2010-11-19T23:53:35.973 回答