【问题标题】:How do you apply light sources using OpenGL ES 2.0?如何使用 OpenGL ES 2.0 应用光源?
【发布时间】:2012-02-29 16:23:25
【问题描述】:

我正在尝试查找任何教程或示例代码来解释和显示 OpenGL ES 2.0 中灯光的用法。我在网上看到的大部分资料都是指 Opengl ES 1.1。

谁能提供任何关于如何在 OpenGL ES 2.0 中进行光照的链接或文档?

【问题讨论】:

  • 让我重新表述一下这个问题。有没有人知道任何教程展示了如何使用着色器实现光源?

标签: iphone ios opengl-es opengl-es-2.0


【解决方案1】:

OpenGL ES 2.0 的困难在于,由于您几乎可以按照自己的意愿编写自己的着色器,因此没有一种固定的方法可以为对象提供光照。这将取决于您希望如何呈现您的内容。

也就是说,您可以复制 OpenGL ES 1.1 的固定函数光照能力,方法是提供光照方向并计算每个顶点的光照强度。你可以在this sample application 中看到一个例子,我为我的一门课打了个巴掌。

这里使用的顶点着色器如下:

attribute vec4 position;
attribute vec4 normal;

varying float lightIntensity;

uniform mat4 modelViewProjMatrix;
uniform vec3 lightDirection;

void main()
{
    vec4 newNormal = modelViewProjMatrix * normal;
    vec4 newPosition = modelViewProjMatrix * position;
    gl_Position = newPosition;

    lightIntensity = max(0.0, dot(newNormal.xyz, lightDirection));
}

使用匹配的片段着色器:

varying highp float lightIntensity;

void main()
{
    lowp vec4 yellow = vec4(1.0, 1.0, 0.0, 1.0);
    gl_FragColor = vec4((yellow * lightIntensity * 0.2).rgb, 1.0);
}

光的方向和该顶点法线的点积用于计算从该顶点射入观察者眼睛的光强度。然后在每个三角形的顶点之间对该光强度进行插值,从而为您提供每个片段的强度。

我在我的开源Molecules 应用程序中做了一些更高级的每像素照明,其中每个球体和圆柱体实际上是驻留在矩形内的光线追踪冒名顶替者。对于每个像素,我计算虚拟对象上该点的镜面反射和环境光贡献,然后将其与模型加载时计算的环境光遮蔽因子相结合。这远远不是你可以用光照做的另一个极端,但你可以深入研究那里的代码或阅读my little writeup了解它是如何工作的。

【讨论】:

  • 非常感谢布拉德,我认为这段代码会很有帮助。我在这个问题上花了很多时间,我认为你提供的源代码肯定会帮助我完成线。我会在一段时间内发布我的经验.. PS。我希望有一种方法可以增加超过 1 个声望点
  • @user1200008 - 你可能也对我的 iTunes U 课程感兴趣,在那里你可以找到我使用的 OpenGL ES 2.0 类:itunes.apple.com/WebObjects/MZStore.woa/wa/…
  • 其实我有个问题。到目前为止,我的几何图形由一个简单的立方体组成。我想知道如何计算这个的法线?
  • @Abhi - 如果你想为每个顶点提供它们,你可以只使用顶点坐标,标准化为距离 1 (x^2 + y^2 + z^2 = 1) .如果您想使用索引并定义每个面的法线,那么您需要计算与每个面正交的方向(可能是 (1, 0, 0) 等)。
  • 好的 .. 经过反复试验并点击此位置的链接gamedev.net/page/resources/_/technical/opengl/…,我能够计算出立方体的法线。但我有一种感觉,当立方体旋转/缩放时,需要重新计算法线。我说的对吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-20
  • 1970-01-01
  • 2012-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多