Opengl es 光在opengl中的位置

Opengl es 光在opengl中的位置,opengl-es,opengl-es-2.0,opengl-es-lighting,Opengl Es,Opengl Es 2.0,Opengl Es Lighting,我试图画一个旋转立方体,并在立方体前面的固定位置添加聚光灯。但因为我在z轴上设置了错误的值,所以灯光不会显示。在我尝试了不同的光线位置后,立方体最终显示为我所希望的。但我仍然不知道为什么这个值有效 这是错误的代码。但我认为这个价值是合理的 Matrix.setIdentityM(mLightModelMatrix, 0); Matrix.translateM(mLightModelMatrix, 0, 0.0f, 0.0f, 0.5f); Matrix.multiplyM

我试图画一个旋转立方体,并在立方体前面的固定位置添加聚光灯。但因为我在z轴上设置了错误的值,所以灯光不会显示。在我尝试了不同的光线位置后,立方体最终显示为我所希望的。但我仍然不知道为什么这个值有效

这是错误的代码。但我认为这个价值是合理的

    Matrix.setIdentityM(mLightModelMatrix, 0);
    Matrix.translateM(mLightModelMatrix, 0, 0.0f, 0.0f, 0.5f);
    Matrix.multiplyMV(mLightPosInWorldSpace, 0, mLightModelMatrix, 0, mLightPosInModelSpace, 0);
    Matrix.multiplyMV(mLightPosInEyeSpace, 0, mViewMatrix, 0, mLightPosInWorldSpace, 0);
    GLES20.glUniform3f(muLightPosHandler,
            mLightPosInEyeSpace[0],
            mLightPosInEyeSpace[1],
            mLightPosInEyeSpace[2]);
这是正确的代码。但我不知道为什么它会起作用

    Matrix.setIdentityM(mLightModelMatrix, 0);
    Matrix.translateM(mLightModelMatrix, 0, 0.0f, 0.0f, 2.8f);
    Matrix.multiplyMV(mLightPosInWorldSpace, 0, mLightModelMatrix, 0, mLightPosInModelSpace, 0);
    Matrix.multiplyMV(mLightPosInEyeSpace, 0, mViewMatrix, 0, mLightPosInWorldSpace, 0);
    GLES20.glUniform3f(muLightPosHandler,
            mLightPosInEyeSpace[0],
            mLightPosInEyeSpace[1],
            mLightPosInEyeSpace[2]);
这两个片段之间的区别只是灯光位置的z轴。您可以从中获取所有源代码


我认为
0.0f,0.0f,0.5f
是一个合理位置的原因是,在变换之前,立方体正面的中心点是
0.0f,0,0f,0.5f
。因此,它将发出立方最强的光

这是因为您有一个由光锥定义的聚光灯。在2.8之前的任何距离,圆锥体都不够宽,无法照亮整个立方体,如下图所示:

要照亮立方体的整个面,您需要将灯光移得更远(如您所发现的)或加宽灯光圆锥体


由于每个面只有两个三角形,在第一种情况下,由于没有任何顶点被照亮,因此不会获得太多照明。顶点上的灯光决定了面上的灯光。如果将模型分解为多个面,您将看到效果。

这是因为您有一个由光锥定义的聚光灯。在2.8之前的任何距离,圆锥体都不够宽,无法照亮整个立方体,如下图所示:

要照亮立方体的整个面,您需要将灯光移得更远(如您所发现的)或加宽灯光圆锥体


由于每个面只有两个三角形,在第一种情况下,由于没有任何顶点被照亮,因此不会获得太多照明。顶点上的灯光决定了面上的灯光。如果你把模型分解成更多的面,你就会看到效果。

我认为问题在于光线在立方体的面上,而不是在立方体的前面。如果将灯光位置移动到
0,0,0.6
(例如)立方体是否点亮?@ChrisF Util当我增加到
0.0,0.0,0.7
时,立方体会显示一点。从0.7到2.8,立方变得越来越亮。啊。我想我知道答案。这是因为你有一个聚光灯,它是由一个光锥定义的。在2.8之前的任何距离,圆锥体都不够宽,无法照亮整个立方体。我来画一幅画。我想问题是因为光线在立方体的表面,而不是在它的前面。如果将灯光位置移动到
0,0,0.6
(例如)立方体是否点亮?@ChrisF Util当我增加到
0.0,0.0,0.7
时,立方体会显示一点。从0.7到2.8,立方变得越来越亮。啊。我想我知道答案。这是因为你有一个聚光灯,它是由一个光锥定义的。在2.8之前的任何距离,圆锥体都不够宽,无法照亮整个立方体。我要画一幅画。但我觉得第二幅画的光线比第一幅画的强。它似乎与现实世界相反。@洪博斯——因为整个脸部都被照亮,而不是中间的一个小部分。因为每个面只有两个三角形,所以在第一种情况下你不会得到太多的照明,因为没有任何顶点被照亮。但是我觉得第二张图片中的光线比第一张图片中的强。它似乎与现实世界相反。@洪博斯——因为整个脸部都被照亮,而不是中间的一个小部分。由于每个面只有两个三角形,在第一种情况下,由于没有任何顶点被照亮,因此不会获得太多照明。