C++ OpenGL网站中的Phong照明

C++ OpenGL网站中的Phong照明,c++,opengl,opengl-es,C++,Opengl,Opengl Es,我正在阅读opengl.org中的以下Phong Illumination shader: 顶点和片段着色器如下所示: 顶点着色器: varying vec3 N; varying vec3 v; void main(void) { v = vec3(gl_ModelViewMatrix * gl_Vertex); N = normalize(gl_NormalMatrix * gl_Normal); gl_Position = gl_Mod

我正在阅读opengl.org中的以下Phong Illumination shader:

顶点和片段着色器如下所示:

顶点着色器:

 varying vec3 N;
 varying vec3 v;
 void main(void)  
 {     
   v = vec3(gl_ModelViewMatrix * gl_Vertex);       
   N = normalize(gl_NormalMatrix * gl_Normal);
   gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;  
 }
片段着色器:

varying vec3 N;
varying vec3 v;    
void main (void)  
{  
   vec3 L = normalize(gl_LightSource[0].position.xyz - v);   
   vec3 E = normalize(-v); // we are in Eye Coordinates, so EyePos is (0,0,0)  
   vec3 R = normalize(-reflect(L,N));  

   //calculate Ambient Term:  
   vec4 Iamb = gl_FrontLightProduct[0].ambient;    

   //calculate Diffuse Term:  
   vec4 Idiff = gl_FrontLightProduct[0].diffuse * max(dot(N,L), 0.0);
   Idiff = clamp(Idiff, 0.0, 1.0);     

   // calculate Specular Term:
   vec4 Ispec = gl_FrontLightProduct[0].specular 
                * pow(max(dot(R,E),0.0),0.3*gl_FrontMaterial.shininess);
   Ispec = clamp(Ispec, 0.0, 1.0); 
   // write Total Color:  
   gl_FragColor = gl_FrontLightModelProduct.sceneColor + Iamb + Idiff + Ispec;     
}
我想知道他是如何计算观察向量的。因为通过将顶点位置与gl_ModelViewMatrix相乘,结果将出现在视图矩阵中,并且与世界坐标相比,视图坐标大部分时间都是旋转的

因此,我们不能简单地从v中减去光的位置来计算L向量,因为它们不在同一坐标系中。此外,L和N之间的点积结果将不正确,因为它们的坐标不相同。我说得对吗

所以,我们不能简单地从v中减去光的位置来计算 L向量,因为它们不在同一坐标系中。 此外,L和N之间的点积结果也不正确 因为它们的坐标不一样。我说得对吗

没有

gl_光源[0].position.xyz不是您设置gl_位置的值。GL将在glLight调用时自动将位置乘以当前GL_MODELVIEW矩阵。照明计算完全在固定功能GL的眼睛空间中完成。因此V和N都必须转换到眼睛空间,而gl_光源[]。位置将已经转换到眼睛空间,因此代码是正确的,实际上没有混合不同的坐标空间

您使用的代码依赖于不推荐使用的功能,使用了GL的许多旧的固定功能特性,包括该特定问题。在现代德国劳埃德船级社中,这些内置制服和属性不存在,您必须定义自己的制服和属性,您可以根据自己的喜好对其进行解释

当然,您也可以忽略该约定,仍然使用不同的坐标空间进行内置照明计算,并解释gl_光源[]。在设置位置时,只需选择其他矩阵,即可改变位置,灯光的世界空间位置已设置,而GL_MODELVIEW矩阵仅包含视图变换,因此某些世界静止光源的眼睛空间灯光位置将出现,但您可以执行任何操作。然而,本文中的代码是作为固定功能管道的替代品,因此它将以固定功能管道的方式解释这些内置统一和属性

所以,我们不能简单地从v中减去光的位置来计算 L向量,因为它们不在同一坐标系中。 此外,L和N之间的点积结果也不正确 因为它们的坐标不一样。我说得对吗

没有

gl_光源[0].position.xyz不是您设置gl_位置的值。GL将在glLight调用时自动将位置乘以当前GL_MODELVIEW矩阵。照明计算完全在固定功能GL的眼睛空间中完成。因此V和N都必须转换到眼睛空间,而gl_光源[]。位置将已经转换到眼睛空间,因此代码是正确的,实际上没有混合不同的坐标空间

您使用的代码依赖于不推荐使用的功能,使用了GL的许多旧的固定功能特性,包括该特定问题。在现代德国劳埃德船级社中,这些内置制服和属性不存在,您必须定义自己的制服和属性,您可以根据自己的喜好对其进行解释

当然,您也可以忽略该约定,仍然使用不同的坐标空间进行内置照明计算,并解释gl_光源[]。在设置位置时,只需选择其他矩阵,即可改变位置,灯光的世界空间位置已设置,而GL_MODELVIEW矩阵仅包含视图变换,因此某些世界静止光源的眼睛空间灯光位置将出现,但您可以执行任何操作。然而,本文中的代码是作为固定功能管道的替代品,因此它将以固定功能管道的方式解释这些内置制服和属性。

哦,我明白了。因此,gl_法线矩阵包含旧固定函数管道中的模型_视图矩阵,并且gl_光源在视图坐标中进行变换。然后,代码开始工作。实际上,我在检查superbible opengl phong照明着色器,它也在视图坐标中进行phong照明计算。@mmostajab:嗯,gl_NormalMatrix是从modelview矩阵派生的,它不是一回事。原因是法线在某些情况下必须进行不同的变换。考虑一个倾斜操作。如果直接将其应用于法线方向,则生成的法线不会垂直于 我再也不喜欢表面了。假设他们以前是。对此给出了更详细的解释。哦,我明白了。因此,gl_法线矩阵包含旧固定函数管道中的模型_视图矩阵,并且gl_光源在视图坐标中进行变换。然后,代码开始工作。实际上,我在检查superbible opengl phong照明着色器,它也在视图坐标中进行phong照明计算。@mmostajab:嗯,gl_NormalMatrix是从modelview矩阵派生的,它不是一回事。原因是法线在某些情况下必须进行不同的变换。考虑一个倾斜操作。如果直接将其应用于法线方向,则生成的法线将不再垂直于曲面。假设他们以前是。对此给出了更详细的解释。