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. 效果图
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2012-04-13 (转)一个简单的osg控件开发例子