BumpTexture
1. 新建一个OpenGL 空effect;
2. 添加相关变量
右击Effect节点选择Add Variable->float->float / float3 添加镜面光强度、灯光位置和相机位置参数:
float fSpecularPower = 25.0;
float3 vec3LightPosition = {-100.0,100.0,100.0};
float3 vec3EyePosition = {0,0,100.0};
右击Effect节点选择AddTexture->Add 2DTexture 添加base和bump两张纹理图片:
Fieldstone.tga ----> base
FieldstoneBumpDOT3.tga -----> bump
右击Effect节点选择Add Variable->Color 添加 环境光、散射光、镜面光颜色
fvAmbient = {0.3,0.3, 0.3};
fvDiffuse = {0.86,0.86,0.86};
fvSpecular = {0.57,0.56,0.58};
3. 修改Stream Mapping 中 添加NORMAL、TexCoord 、 BINORMAL、TANGENT
4. 在pass0中添加纹理对象 AddTextureObject 将base和bump图片添加进去,重新命名为baseMap和bumpMap
5. 修改vertex shader :
uniform vec3 vec3LightPosition;
uniform vec3 vec3EyePosition;
varying vec2 texcoord;
varying vec3 viewDirection;
varying vec3 lightDirection;
attribute vec3 rm_BiNormal;
attribute vec3 rm_Tangent;
void main(void)
{
gl_Position = ftransform();
texcoord = gl_MultiTexCoord0.xy;
vec4 fvObjectPosition = gl_ModelViewMatrix * gl_Vertex;
vec3 fviewDirection = normalize(vec3EyePosition - fvObjectPosition.xyz);
vec3 flightDirection = normalize(vec3LightPosition - fvObjectPosition.xyz);
vec3 fvNormal = gl_NormalMatrix * gl_Normal;
vec3 fvBiNormal = gl_NormalMatrix * rm_BiNormal;
vec3 fvTangent = gl_NormalMatrix * rm_Tangent;
viewDirection.x = dot(fvTangent, fviewDirection);
viewDirection.y = dot(fvBiNormal, fviewDirection);
viewDirection.z = dot(fvNormal, fviewDirection);
lightDirection.x = dot(fvTangent, flightDirection);
lightDirection.y = dot(fvBiNormal, flightDirection);
lightDirection.z = dot(fvNormal, flightDirection);
}
6.修改pixel shader:
uniform vec4 fvAmbient;
uniform vec4 fvSpecular;
uniform vec4 fvDiffuse;
uniform float fSpecularPower;
uniform sampler2D baseMap;
uniform sampler2D bumpMap;
varying vec2 Texcoord;
varying vec3 ViewDirection;
varying vec3 LightDirection;
void main( void )
{
vec3 fvLightDirection = normalize( LightDirection );
vec3 fvNormal = normalize( ( texture2D( bumpMap, Texcoord ).xyz * 2.0 ) - 1.0 );
float fNDotL = dot( fvNormal, fvLightDirection );
vec3 fvReflection = normalize( ( ( 2.0 * fvNormal ) * fNDotL ) - fvLightDirection );
vec3 fvViewDirection = normalize( ViewDirection );
float fRDotV = max( 0.0, dot( fvReflection, fvViewDirection ) );
vec4 fvBaseColor = texture2D( baseMap, Texcoord );
vec4 fvTotalAmbient = fvAmbient * fvBaseColor;
vec4 fvTotalDiffuse = fvDiffuse * fNDotL * fvBaseColor;
vec4 fvTotalSpecular = fvSpecular * ( pow( fRDotV, fSpecularPower ) );
gl_FragColor = ( fvTotalAmbient + fvTotalDiffuse + fvTotalSpecular );
}
7. 效果图