着色器编程,创建与图像的轻微交互

时间:2015-01-07 01:57:23

标签: shader light rendermonkey

我正在尝试在RenderMonkey中学习着色器编程,如果我拍了一张照片并希望对该对象应用一些光交互。

我应该如何做到这一点,我不想使用默认的openGL灯,想要自己定义一个。

假设我从变量lightColor创建一个颜色,浮动光泽系数 以及具有光源xyz位置的vec3 lightPos。在默认管道中,灯光位置以摄像机坐标表示。我该怎样以最好的方式做到这一点?

如果我想要一个质量最好的像素着色器哪个着色器应该实现着色计算?

1 个答案:

答案 0 :(得分:0)

让我们看看这是否能回答你的问题。这是旧版本的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语句中使用您想要的任何条件。