iphone - 如何使用 OpenGL ES 2.0 应用光源?

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

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

任何人都可以提供有关如何在 OpenGL ES 2.0 中进行照明的任何链接或文档吗?

最佳答案

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关于它是如何工作的。

关于iphone - 如何使用 OpenGL ES 2.0 应用光源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9502804/

相关文章:

ios - 从 JSON 数据 Swift 4 创建 TableView 部分

ios - 在 iOS 9 中你应该使用什么来代替 UICollectionViewFlowLayout AutomaticSize?

android - 与 SurfaceView、Camera 和 OpenGL 战斗

iphone - iOS 6.0 轮换中的问题

ios - 关于在 iPhone 中将数据存储在共享首选项中的建议

android - Appstore 多个名称

ios - 如何删除 AppIcon 上的黑屏 - IOS

ios - 强制 iPad 视网膜模拟器适应 MacBook Air 屏幕

android - Galaxy Note 2 上的奇怪 OpenGL ES 2.0 错误

android - 没有 NDK 的 OpenGL ES 2.0 可能吗?