OpenGL:使用着色器通过使用预先计算的色彩图创建顶点光照?

时间:2010-11-19 16:01:26

标签: c++ opengl lighting

首先,我对着色器可以做什么知之甚少,而且我对制作顶点光源非常感兴趣。我试图使用一个3d色图,用于计算世界那个位置的顶点颜色,并使用色彩图中附近的颜色插入颜色。

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

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

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

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

3 个答案:

答案 0 :(得分:0)

几乎听起来像你要做的是将灯光渲染到你的色彩地图,然后使用你的色彩图作为纹理,而不是贴花模式将其设置为调制模式,所以它是乘以现有的颜色而不是仅仅替换它。

这在某种程度上是不同的:它不仅仅影响顶点,而是映射到各个片段(实质上是像素)。

编辑:我想到的不是3D纹理 - 它是一个立方体贴图。基本上,创建一个围绕“世界”中所有内容的虚拟多维数据集。为该多维数据集的每个面创建一个2D纹理。将着色渲染到立方体贴图。然后,要为顶点着色,您(虚拟地)将光线从中心向外延伸,通过顶点到达立方体。您在立方体贴图上点击的像素为您提供该顶点的光照颜色。

更新应该相对有效 - 您可以为顶部,底部,前部等提供正常的2D纹理,并根据需要更新它们。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

您想要将光量渲染为3d纹理。光栅化器在2D曲面上工作,因此您的卷必须沿其中一个轴分割。拆分可以通过以下方式之一完成:

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

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