【问题标题】:Multiple light sources & implementation details around GLSL normal mapping shader围绕 GLSL 法线贴图着色器的多个光源和实现细节
【发布时间】:2014-10-29 21:55:11
【问题描述】:

第一个问题,是如何在不使用多个片段着色器的情况下,从单一光源到使用多个光源。

我的直觉是,每次运行着色器计算都需要光源坐标,也许还需要一些颜色信息,我们可以循环运行 n 个光源的计算。

如何将多个灯光传递到着色器程序中?我是否使用一系列制服?我的猜测是传入一个带有每个光源坐标的制服数组,然后指定有多少个光源,然后设置一个最大值。

我可以为着色器程序调用 getter 或 setter 方法吗?而不是仅仅操纵全局变量?

我正在使用本教程和 libGDX 实现来学习如何做到这一点: https://gist.github.com/mattdesl/4653464

【问题讨论】:

  • com.badlogic.gdx.graphics.g3d.shaders.DefaultShader 处理来自环境的多个灯光。这个包还包含一个默认的 vert/frag 着色器。可能会给你一些启发。

标签: opengl libgdx glsl lwjgl


【解决方案1】:

拥有多个光源的方法有很多。我会指出最常用的 3 点。

1) 在统一结构数组中指定每个光源。光照计算是在着色器循环中对所有活动光照进行的,并将结果累积到单个顶点颜色或片段颜色中,具体取决于着色是针对每个顶点还是每个片段进行的。 (这就是固定函数 OpenGL 计算多个灯光的方式)

2) 每次通道启用单个光源的多通道渲染,在最简单的形式中,通道可以通过加法混合 (srcFactor=ONE dstFactor=ONE) 合成。不要忘记在第一次从 GL_LESS 到 GL_EQUAL 后更改深度函数,或者简单地使用 GL_LEQUAL 进行所有传递。

3) 许多环境照明算法模拟多个光源,假设它们与您的场景相距无限远。最简单的渲染器应该将光强度存储到环境纹理(最好是立方体贴图)中,然后着色器的工作就是在表面法线周围的方向上以一些随机角度偏移对该纹理进行多次采样。

【讨论】:

  • 我想给这个答案加一个,但你刚才说的一切都超出了我的想象,我真的不知道从哪里开始。无论如何,我都不是 GL 专家。这是我第一次直接使用 OpenGL(之前我一直让库来做这项工作)。
  • 你需要什么?一些 glsl 的例子?您可能会发现 [链接] Nehe 教程很有用 (nehe.gamedev.net) 它不使用 libGDX,但所有基本的 opengl 和 glsl 概念都已逐步解释和编码。
  • 我实际上已经使用了一些使用光线投射来制作定向光的照明库。我试图弄清楚如何将法线贴图照明合并到那组库中。它被称为 Box2DLights。有一些视频已经完成,但我不知道如何使它工作。
  • 这里有一些你可能会觉得有用的代码。 gamedev.stackexchange.com/questions/79944/…
猜你喜欢
  • 2012-01-12
  • 1970-01-01
  • 2012-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多