Phong Illumination in OpenGL website
Phong Illumination in OpenGL website
我正在阅读以下 Phong Illumination 着色器,该着色器具有 opengl.org:
Opengl.org 的防线照明
顶点和片段着色器如下所示:
顶点着色器:
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;
}
我想知道他计算查看器矢量或v
的方式.因为通过将顶点位置乘以gl_ModelViewMatrix
,结果将在视图矩阵中(与世界坐标相比,视图坐标大部分时间都在旋转)。
因此,我们不能简单地从v
中减去光的位置来计算L
矢量,因为它们不在同一坐标系中。此外,L 和 N 之间的点积的结果将不正确,因为它们的坐标不同。我说的对吗?
因此,我们不能简单地从 v 中减去光的位置来计算 L 向量,因为它们不在同一坐标系中。 此外,L 和 N 之间的点积结果将不正确 因为它们的坐标不一样。我说的对吗?
不。
gl_LightSource[0].position.xyz
不是您GL_POSITION
设置的值。GL 将在glLight()
调用时自动将位置乘以当前GL_MODELVIEW
矩阵。照明计算完全在固定功能GL的眼空间中完成。所以V
和N
都必须转换为眼空间,而gl_LightSource[].position
已经转换为眼空间,所以代码是正确的,实际上并没有混合不同的坐标空间。
您使用的代码依赖于已弃用的功能,使用 GL 的许多旧的固定功能特性,包括该特定问题。在 mordern GL 中,那些内置的制服和属性不存在,您必须定义自己的制服和属性 - 您可以根据需要解释它们。
当然,您也可以忽略该约定,仍然使用不同的坐标空间进行内置的照明计算,并通过在设置位置时简单地选择其他矩阵来解释gl_LightSource[].position
(通常,设置光源的世界空间位置,而GL_MODELVIEW
矩阵仅包含视图转换,以便出现某些世界静止光源的眼睛空间光位置, 但你可以做任何你喜欢的事情)。但是,所呈现的代码旨在作为固定函数管道的一些"直接"替代品,因此它将以与固定函数管道相同的方式解释这些内置的统一和属性。
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 了解 GLM- openGL 中的相机转换
- 如何在全屏模式下(在OpenGL中)使背景透明
- 为什么我不能使用 EGL 创建无头 OpenGl 上下文?
- OpenGL大的3D纹理(>2GB)非常慢
- OpenGl glm rotate
- C++atioglxx.pdb未加载错误glBufferData OpenGL
- OpenGL在启用深度测试时不会丢弃我的碎片
- OpenGL相机和相机空间转型的困惑
- OpenGL将纹理四边形渲染为(0,0)
- OpenGL 和 GLM 矩阵无法正确扩展,总是按比例缩小
- 发布旋转矩阵(openGL/glm)
- 如何在Visual Basic中使用矩形函数OpenGL绘制矩形
- 无法使用VAO和EBO(openGL)绘制多个对象
- 为什么我的点没有在 OpenGL 中绘制鼠标所在的位置?
- OpenGL 16 位模板缓冲区?
- 将QOpenGLWidget子类转换为使用Metal而不是OpenGL的子类是否可行?
- 在顶点着色器中使用 OpenGl 的未声明标识符,我在顶点着色器中绘制三角形时遇到问题
- 在 openGL 中多次绑定缓冲区
- Phong Illumination in OpenGL website