我正在尝试在 RenderMonkey 中学习着色器编程,如果我拍了一张照片并想对那个对象应用一些光交互。
我应该如何以一种好的方式做到这一点,我不想使用默认的 openGL 灯,想自己定义一个。
假设我从变量 lightColor、float 光泽系数和 vec3 lightPos以及光源的位置x
创建颜色。在默认管道中,灯光位置以相机坐标表示。我应该如何以最好的方式做到这一点?y
z
如果我想要一个质量最好的像素着色器,我应该使用哪个着色器来实现着色计算?
我正在尝试在 RenderMonkey 中学习着色器编程,如果我拍了一张照片并想对那个对象应用一些光交互。
我应该如何以一种好的方式做到这一点,我不想使用默认的 openGL 灯,想自己定义一个。
假设我从变量 lightColor、float 光泽系数和 vec3 lightPos以及光源的位置x
创建颜色。在默认管道中,灯光位置以相机坐标表示。我应该如何以最好的方式做到这一点?y
z
如果我想要一个质量最好的像素着色器,我应该使用哪个着色器来实现着色计算?
让我们看看这是否回答了你的问题。这是旧版本 1.1 代码,但应该很容易适应新版本。我已经从它的初始版本大量编辑了这段代码,所以我不保证其中没有错误,但我至少编译并链接它没有错误。
顶点着色器:
#version 120
attribute vec4 Position;
attribute vec2 TexCoord;
attribute vec3 Normal;
uniform vec4 LightPosition;
uniform mat4 ModelMatrix;
uniform mat4 ViewMatrix;
uniform mat4 ProjectionMatrix;
uniform mat3 NormalMatrix;
varying vec2 texCoord;
varying float DiffuseIntensity;
varying float SpecularIntensity;
void main()
{
vec3 lightPosition= vec3(LightPosition);
float shininess = 30.0;
vec3 ecPosition = vec3(ViewMatrix * ModelMatrix * Position);
vec3 tnorm = normalize(NormalMatrix * Normal);
vec3 lightVec = normalize(lightPosition - ecPosition);
vec3 reflectVec = reflect(-lightVec, tnorm);
vec3 viewVec = normalize(-ecPosition);
float spec = clamp(dot(reflectVec, viewVec), 0.0, 1.0);
SpecularIntensity = pow(spec, shininess / 5.0);
DiffuseIntensity = max(dot(lightVec, tnorm), 0.0);
texCoord = TexCoord;
gl_Position = ProjectionMatrix * ViewMatrix * ModelMatrix * Position;
}
片段着色器:
#version 120
uniform sampler2D Texture;
uniform vec4 Emission;
uniform vec4 Ambient;
uniform vec4 Diffuse;
uniform vec4 Specular;
varying vec2 texCoord;
varying float DiffuseIntensity;
varying float SpecularIntensity;
void main()
{
vec3 emission = vec3(Emission);
vec3 ambient = vec3(Ambient);
vec3 diffuse = vec3(Diffuse);
vec3 specular = vec3(Specular);
vec3 lightColor = emission;
lightColor = lightColor + ambient;
lightColor = lightColor + (SpecularIntensity * specular);
lightColor = lightColor + (DiffuseIntensity * diffuse);
vec3 face = texture2D(Texture, texCoord).rgb * lightColor;
face = clamp(face, 0.0, 1.0);
gl_FragColor = vec4(face, 1.0);
}
编辑:
为了说明关键字“discard”的使用(只能在片段着色器中使用),我将片段着色器的最后几行修改为:
vec3 face = texture2D(FaceTexture, texCoord).rgb * lightColor;
face = clamp(face, 0.0, 1.0);
if((texCoord[0] >= 0.45 && texCoord[0] <= 0.55) || (texCoord[1] >= 0.45 && texCoord[1] <= 0.55))
{
discard;
}
gl_FragColor = vec4(face, 1.0);
这在纹理中创建了一个十字形孔。当然,您可以在 if 语句中使用您想要的任何条件。