我把光加到我的物体上。但是我有很多关于互联网的例子,我想了解我在做什么。有人能详细解释一下代码中的每一步都做了什么吗?
片段程序,
顶点程序,
-Why gl_MultiTexCoord0.xy?-有人能解释一下光方向是如何计算的吗?
varying vec2 Texcoord;
uniform sampler2D baseMap;
uniform vec4 lightColor;
uniform float shininess;
varying vec3 LightDirection;
varying vec3 Normal;
void main(void)
{
float facingRatio = dot(normalize(Normal), normalize(LightDirection));
gl_FragColor = texture2D(baseMap, Texcoord) + facingRatio * lightColor * shininess;
}
varying vec2 Texcoord;
uniform mat4 modelView;
uniform vec3 lightPos;
varying vec3 Normal;
varying vec3 LightDirection;
void main(void)
{
gl_Position = gl_ProjectionMatrix * modelView * gl_Vertex;
Texcoord = gl_MultiTexCoord0.xy;
Normal = normalize( gl_NormalMatrix * gl_Normal);
vec4 objectPosition = gl_ModelViewMatrix * gl_Vertex;
LightDirection = (gl_ModelViewMatrix * vec4(lightPos, 1)).xyz - objectPosition.xyz;
}发布于 2015-08-10 13:39:01
顶点着色器
我猜使用的是OpenGL的旧版本,这就是使用gl_MultiTexCoord0.xy的原因。看看这个页面来理解多纹理化和内置变量。
变量LightDirection很容易计算,因为它只是指从物体指向光源的矢量。因此,您可以从当前位置减去光线的位置(此处:objectPosition)。在本例中,这是在眼睛空间中完成的,它的优点是视图方向易于计算(它只是vec3(0.00.01.0))。
其他的线条只是从顶点的对象空间到眼睛空间的一些通常的图形转换。为了将法线变换成眼睛空间,需要用法向矩阵代替模型视图矩阵。这是模型视图矩阵的逆和转置。
片段着色器
facingRatio定义了当前片段应该具有多强的启发性。因此,用法向和光方向之间的标量乘积来测量它。在下一行中,通过从纹理中读取该片段的颜色并从光线中添加颜色来计算片段颜色。
https://stackoverflow.com/questions/31920324
复制相似问题