RenderMonkey 练习 第五天 【OpenGL NormalMapping】

1. 新建一个OpenGL 空effect;

2. 添加相关变量

右击Effect节点选择Add Variable->float->float / float3 添加镜面光强度、灯光位置和相机位置参数:

float3 vec3LightPosition = {-100.0,100.0,100.0};

float3 vec3EyePosition = {0,0,100.0};

右击Effect节点选择AddTexture->Add 2DTexture 添加base和bump两张纹理图片:

base

normal

3. 修改Stream Mapping 中 添加Normal, TexCoord

4. 在pass0中添加纹理对象 AddTextureObject 将base和normal图片添加进去,重新命名为baseMap和normalMap

5. 修改vertex shader :

uniform vec3 vec3LightPosition;
uniform vec3 vec3EyePosition;

varying vec2 texcoord;
varying vec3 lightDirection;
varying vec3 viewDirection;

void main(void)
{
   gl_Position = ftransform();
   
   texcoord = gl_MultiTexCoord0.xy;
   vec4 fvObjectPosition = gl_ModelViewMatrix * gl_Vertex;
   
   viewDirection = normalize(vec3EyePosition - fvObjectPosition.xyz);
   lightDirection = normalize(vec3LightPosition - fvObjectPosition.xyz);   
}

6.修改pixel shader:

varying vec2 texcoord;
varying vec3 lightDirection;
varying vec3 viewDirection;

uniform sampler2D normalMap;
uniform sampler2D baseMap;
void main(void)
{
   vec4 NormalMap = texture2D(normalMap,texcoord);
   
   // convert to range -1.0 to 1.0
   vec3 normal = NormalMap.xyz * 2.0 - 1.0;
   
   vec3 N = normalize(normal.xyz);
   vec3 L = normalize(lightDirection.xyz);
   float fNDotL = dot(N,L);
   
   vec3 fvReflection = normalize( 2 * normal * fNDotL - lightDirection);
   float fRDotV = max(dot(fvReflection, viewDirection),0.0);
   
   vec4 fvBaseColor = texture2D(baseMap,texcoord);
   
   float fSpecularPower = 25.0;
   
   vec4 fvTotalAmbient = vec4(0.3,0.3,0.3,1.0) * fvBaseColor;
   vec4 fvTotalDiffuse = vec4(0.8,0.8,0.8,1.0) * max(fNDotL,0.0)* fvBaseColor;
   vec4 fvTotalSpecular = vec4(0.6,0.6,0.6,1.0) * pow(fRDotV, fSpecularPower);    
       
   gl_FragColor = fvTotalAmbient + fvTotalDiffuse + fvTotalSpecular;
}

7. 效果图

 

转载于:https://www.cnblogs.com/mazhenyu/p/6705338.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值