Opengl es opengles中立方体上的镜面反射光

Opengl es opengles中立方体上的镜面反射光,opengl-es,3d,cube,lighting,specular,Opengl Es,3d,Cube,Lighting,Specular,在一些介绍照明的教程中,人们会从球体的示例开始,球体由三种类型的灯光照亮:环境光、漫反射光和镜面反射光。然后,人们可以很容易地看到,例如,通过关闭单个灯光,环境灯光负责对象的均匀照明,漫反射灯光来自特定方向,并且由于镜面反射光,我们可以观察到表面上的亮点 我试图用一个简单的例子重复同样的步骤,一个用户可以任意旋转的立方体。我实际上期望看到的是一幅类似的图片:我认为OpenGL应该在某种程度上遵循几何光学的规则,并且,如果指定了光源和相机的位置,那么在其中一个立方体面上应该只有一个亮点,即直接将光

在一些介绍照明的教程中,人们会从球体的示例开始,球体由三种类型的灯光照亮:环境光、漫反射光和镜面反射光。然后,人们可以很容易地看到,例如,通过关闭单个灯光,环境灯光负责对象的均匀照明,漫反射灯光来自特定方向,并且由于镜面反射光,我们可以观察到表面上的亮点

我试图用一个简单的例子重复同样的步骤,一个用户可以任意旋转的立方体。我实际上期望看到的是一幅类似的图片:我认为OpenGL应该在某种程度上遵循几何光学的规则,并且,如果指定了光源和相机的位置,那么在其中一个立方体面上应该只有一个亮点,即直接将光源反射到相机上的亮点


然而,我只能得到均匀发光的脸,从来没有亮点。所以,我的问题是,真的有可能得到它吗?忘了提一下,我使用了最简单的三角剖分法——每个面2个三角形。另外,我使用的是OpenGL ES 1.1,因此没有着色器。

照明强烈地依赖于立方体每一侧的顶点数量。 由于未使用着色器,因此照明是逐顶点计算的。但计算取决于曲面法线,曲面法线的方向垂直于面,每个面计算3个顶点。面上每个顶点的法线都相同,这就是为什么每个顶点的光强度也相同,所以你看不到任何照明效果。 如果正确计算法线,则必须看到立方体不同侧面的颜色存在差异。 要在一侧获得一些聚光灯,必须提高立方体每一侧的栅格分辨率,并且必须为聚光灯的圆锥体应用适当的角度,或者最小化聚光灯到立方体的距离

            n1         n2
           /          /
          /          /
        v1 ---------- v2
         |         / 
         |       /
         |  n3 /    
         | / /
         |//
         |
        v3            v4

看看这个漂亮的教程。它以一种非常容易理解的方式解释了基本机制:

您的示例存在一些问题

您需要区分点光源和平行光。您没有在问题中明确说明使用哪种光源(编辑:如果光源的第四个坐标为0,则获得平行光,否则获得点光源)

有一张很好的图片显示了不同的

(来自冲绳网)

如果使用定向光源,那么当然立方体一侧的所有点都将具有相同的照明计算,从而产生相同的颜色。如果改用球体,将获得高光

如果使用点光源,则会因为OpenGL(ES)-固定管道照明模型而遇到麻烦。它计算每个顶点的照明。由于每个立方体边只使用5个不同的顶点,因此最终在照明方面也会有一些差异。您可以通过使用逐像素照明着色器或将立方体细分为更小的三角形来解决此问题


当然也有一些小的“陷阱”,你需要确保你的不同光源(光源和类型)在组合时不会发出太多的光,这会弄乱你的照明。还要确保法线设置正确。

OpenGL中的照明计算是逐顶点计算的,然后在每个面的像素上对结果进行线性插值(可能带有透视校正)

<>这意味着,如果你只用四个顶点来构造一个立方体,你就无法在脸部中间得到一个明亮的反射点。立方体面照明始终仅由两个渐变组成:两个三角形面各有一个渐变

要近似每像素闪电,您需要将面细分为许多小三角形。。。或者您需要使用其他技术:例如,使用“像素/片段着色器”计算每像素闪电或纹理贴图技巧来模拟相同的效果

有关OpenGL ES上片段着色器的说明,请参见

使用纹理贴图技巧(通常称为“环境贴图”方法),甚至可以很容易地模拟令人信服的闪亮对象,这些对象可以反射环境,而不仅仅是每像素的光源

是一个web画布演示,其中光泽反射确实是使用纹理映射技巧计算的。实际上,该代码根本不依赖于任何3d支持,只使用html5画布对象提供的2d变换矩阵绘制三角形

正如您所注意到的,对象几何体非常粗糙(环面上的每个面片只有9个顶点),但光源反射已定义,您甚至可以看到瓷砖地板的扭曲反射


发布您的相关代码。代码在这里没有帮助,但是研究应该模拟的现象。非常感谢大家!,抱歉这么长时间的休息。经过一些测试,我发现我在这里得到的两个提示都是正确的:首先,镜面反射光的位置离物体表面太远,其次,我的镶嵌太粗糙。