2014-10-29 94 views
0

第一个问题是如何从单个光源获取,使用多个光源,而不使用多个片段着色器。GLSL法线映射着色器的多个光源和实现细节

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

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

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

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

+0

'com.badlogic.gdx.graphics.g3d.shaders.DefaultShader'处理来自环境的多个灯光。该软件包还包含一个默认的垂直/碎片着色器。可能会给你一些启示。 – cfrick 2014-10-30 10:29:53

回答

4

有许多方法有多个光源。我会点3最常用的。

1)指定均匀结构阵列中的每个光源。在所有活动光源的着色器循环中进行光计算,并根据每个顶点或每个片段完成着色,将结果累加为单个顶点颜色或片段颜色。 (这是固定功能的OpenGL如何计算多个灯光)

2)以最简单的形式通过单通道启用单光源的多通道渲染可以通过加法混合(srcFactor = ONE dstFactor = ONE)合成。不要忘记在从GL_LESS首次传递到GL_EQUAL之后更改深度func,或者仅对所有传递使用GL_LEQUAL。 3)许多环境照明算法模拟多个光源,假设它们距离场景无限远。最简单的渲染器应该将光强度存储到环境纹理中(最好是立方体贴图),然后着色器作业就是以一定的随机角度偏移在纹理法线方向上多次采样该纹理。

+0

我想加上一个这样的答案,但是你刚才所说的一切都在我头上,我不知道从哪里开始。我不是以任何方式成为GL专家。这是我第一次使用OpenGL直接*工作(因为以前我一直让图书馆做这项工作)。 – 2014-10-30 02:53:18

+0

你需要什么?一些glsl的例子?你可能会发现[链接] Nehe教程很有用(http://nehe.gamedev.net/)它不使用libGDX,但所有fundeamental的opengl和glsl概念都是逐步解释和编码的。 – Anonymous 2014-10-30 09:20:11

+0

我已经用一些使用光线投射来制作方向灯的照明库。我试图找出如何将正常地图照明纳入该库集。它被称为Box2DLights。有些视频已经完成了,但我对如何让它发挥作用感到茫然。 – 2014-11-15 04:17:00