OpenGL normalMap
2015-09-13 23:20
190 查看
参考zwqxin的博客 http://www.zwqxin.com/
shader 来自zwqxin,稍作修改
c++代码(用自己的框架不方便全部放出来)
shader 来自zwqxin,稍作修改
<-vertex-> attribute vec3 v_Pos; attribute vec3 v_Normal; attribute vec2 v_TexCoord; attribute vec3 v_tangent; uniform vec3 lightpos; //传入光源的模型坐标吧 uniform vec4 eyepos; varying vec3 lightdir; varying vec3 halfvec; varying vec3 norm; varying vec3 eyedir; void main(void) { vec4 pos = gl_ModelViewMatrix * vec4(v_Pos,1.0); pos = pos / pos.w; //把光源和眼睛从模型空间转换到视图空间 vec4 vlightPos = (gl_ModelViewMatrix * vec4(lightpos, 1.0)); vec4 veyePos = (gl_ModelViewMatrix * eyepos); lightdir = normalize(vlightPos.xyz - pos.xyz); vec3 eyedir = normalize(veyePos.xyz - pos.xyz); //模型空间下的TBN norm = normalize(gl_NormalMatrix * v_Normal); vec3 vtangent = normalize(gl_NormalMatrix * v_tangent); vec3 vbinormal = cross(norm,vtangent); //将光源向量和视线向量转换到TBN切线空间 lightdir.x = dot(vtangent, lightdir); lightdir.y = dot(vbinormal, lightdir); lightdir.z = dot(norm , lightdir); lightdir = normalize(lightdir); eyedir.x = dot(vtangent, eyedir); eyedir.y = dot(vbinormal, eyedir); eyedir.z = dot(norm , eyedir); eyedir = normalize(eyedir); halfvec = normalize(lightdir + eyedir); gl_TexCoord[0].st = v_TexCoord; gl_Position = gl_ModelViewProjectionMatrix *vec4( v_Pos,1); } <-fragment-> uniform sampler2D bumptex; uniform sampler2D basetex; float amb = 0.2; float diff = 0.2; float spec = 0.6; varying vec3 lightdir; varying vec3 halfvec; varying vec3 norm; varying vec3 eyedir; void main(void) { float shiness =4; vec4 ambient = vec4(0.2,0.2,0.2,0.2); vec4 diffuse = vec4(0.3,0.3,0.3,0.3); vec4 specular = vec4(0.3,0.3,0.3,0.3); vec3 vlightdir = normalize(lightdir); vec3 veyedir = normalize(eyedir); vec3 vnorm = normalize(norm); vec3 vhalfvec = normalize(halfvec); vec4 baseCol = texture2D(basetex, gl_TexCoord[0].xy); //Normal Map里的像素normal定义于该像素的切线空间 vec3 tbnnorm = texture2D(bumptex, gl_TexCoord[0].xy).xyz; tbnnorm = normalize((tbnnorm - vec3(0.5))* 2.0); float diffusefract = max( dot(lightdir,tbnnorm) , 0.0); float specularfract = max( dot(vhalfvec,tbnnorm) , 0.0); if(specularfract > 0.0){ specularfract = pow(specularfract, shiness); } gl_FragColor = vec4(amb * ambient.xyz * baseCol.xyz + diff * diffuse.xyz * diffusefract * baseCol.xyz + spec * specular.xyz * specularfract ,1.0)*3.0; }
c++代码(用自己的框架不方便全部放出来)
glEnable(GL_TEXTURE_2D); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D,m_img.Getid()); glActiveTexture(GL_TEXTURE0+1); glBindTexture(GL_TEXTURE_2D,m_NormalImg.Getid()); m_ShaderNormalMap.Enable(); m_ShaderNormalMap.uniform("bumptex",1); m_ShaderNormalMap.uniform("basetex",0); m_ShaderNormalMap.uniform("lightpos",vec3(100,100,100)); m_ShaderNormalMap.uniform("eyepos",vec3(0,0,10)); glPushMatrix(); glTranslatef(0,0,-100); static float angleA =0.0f; angleA +=0.02f; glRotatef(angleA,1,1,1); m_Mesh.RenderTest(); glActiveTexture( GL_TEXTURE0);
相关文章推荐
- 浅谈置信度传播算法(Belief-Propagation)在立体匹配中的应用~
- Apache端口占用解决办法
- 启动Tomcat时遇到的 java.lang.IllegalArgumentException: Can't convert argument: null 异常
- centos安装hadoop-1.2.1
- Linux 基本命令学习
- Neutron 理解 (4): Neutron OVS OpenFlow 流表 和 L2 Population [Netruon OVS OpenFlow tables + L2 Populatio
- docker常用命令
- Linux下可执行文件格式详解
- 学习的网站
- Linux下利用backtrace追踪函数调用堆栈以及定位段错误
- Linux 日志分析工具之awstats
- ZOOKEEPER在CENTOS6上的再安装
- LINUX-添加和修改文件搜索路径PATH变量
- Linux Shell脚本 多线程
- Linux下源码安装mysql及mysql的简单用法
- linux基础知识
- linux , python 发送邮件,基本实现了mutt常用功能
- 常见的七种Hadoop和Spark项目案例
- 香港空间的确很坑,网站可用性只有72.37%
- linuxGrep命令