参考zwqxin的博客  http://www.zwqxin.com/

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);

-------------------------------------------分界线

2016年12月1日

重新增加了VAO渲染,改写材质

OpenGL normalMap的更多相关文章

  1. 在 OpenGL ES 2.0 上实现视差贴图(Parallax Mapping)

    在 OpenGL ES 2.0 上实现视差贴图(Parallax Mapping) 视差贴图 最近一直在研究如何在我的 iPad 2(只支持 OpenGL ES 2.0, 不支持 3.0) 上实现 视 ...

  2. NormalMap原理详细解析

    NormalMap的实现标志着对渲染流水线的各个环节以及矩阵变化有了正确和深入的认识.这里记录一下学习过程,以及关于NormalMap的诸多细节. 刚开始想要实现NormalMap程序的时候,查阅的是 ...

  3. RenderMonkey 练习 第五天 【OpenGL NormalMapping】

    1. 新建一个OpenGL 空effect; 2. 添加相关变量 右击Effect节点选择Add Variable->float->float / float3 添加镜面光强度.灯光位置和 ...

  4. NormalMap 贴图 【转】

    转载: http://www.zwqxin.com/archives/shaderglsl/review-normal-map-bump-map.html   说起Normal Map(法线贴图),就 ...

  5. NormalMap 贴图 [转]

    转载: http://www.zwqxin.com/archives/shaderglsl/review-normal-map-bump-map.html   说起Normal Map(法线贴图),就 ...

  6. 【AR实验室】OpenGL ES绘制相机(OpenGL ES 1.0版本)

    0x00 - 前言 之前做一些移动端的AR应用以及目前看到的一些AR应用,基本上都是这样一个套路:手机背景显示现实场景,然后在该背景上进行图形学绘制.至于图形学绘制时,相机外参的解算使用的是V-SLA ...

  7. [OpenGL超级宝典]专栏前言

    我小时候的梦想呢,是做宇航员或者科学家或者是做一款属于自己的游戏,后来前面两个梦想都没有实现,于是我就来实现我的第三个梦想了,,,我呢,也算是零基础,因为我的专业是物联网工程,这个专业覆盖面之广,简直 ...

  8. OpenGL超级宝典笔记----渲染管线

    在OpenGL中任何事物都在3D空间中,但是屏幕和窗口是一个2D像素阵列,所以OpenGL的大部分工作都是关于如何把3D坐标转变为适应你屏幕的2D像素.3D坐标转为2D坐标的处理过程是由OpenGL的 ...

  9. OpenGL超级宝典笔记----框架搭建

    自从工作后,总是或多或少的会接触到客户端3d图形渲染,正好自己对于3d图形的渲染也很感兴趣,所以最近打算从学习OpenGL的图形API出发,进而了解3d图形的渲染技术.到网上查了一些资料,OpenGL ...

随机推荐

  1. pymysql 使用twisted异步插入数据库:基于crawlspider爬取内容保存到本地mysql数据库

    本文的前提是实现了整站内容的抓取,然后把抓取的内容保存到数据库. 可以参考另一篇已经实现整站抓取的文章:Scrapy 使用CrawlSpider整站抓取文章内容实现 本文也是基于这篇文章代码基础上实现 ...

  2. incomplete type is not allowed ofstream

    错误: incomplete type is not allowed 解决方案: #include<fstream>

  3. python正则表达式(二)

    表示字符 示例1: . #coding=utf-8 import re ret = re.match(".","a") ret.group() ret = re ...

  4. usaco-5.3.3Network of Schools 校园网

    题目描述 一些学校连入一个电脑网络.那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作“接受学校”).注意如果 B 在 A 学校的分发列表中,那么 A 不必也在 B 学校的列表中. 你要 ...

  5. Java API实现Hadoop文件系统增删改查

    Java API实现Hadoop文件系统增删改查 Hadoop文件系统可以通过shell命令hadoop fs -xx进行操作,同时也提供了Java编程接口 maven配置 <project x ...

  6. 如何提高sql查询速度

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  7. Express基础单词

    访问请求对象(request)或(req) 响应对象(response)或(res) 中间件(middleware) http的请求方法(method) 服务器的路径(path) 路由匹配时的函数(c ...

  8. centos安装谷歌浏览器

    第一步: 切换到root权限 su root 或者 sudo -i 第二步: 下载新的软件源: 进入到 cd /etc/yum.repos.d 然后 wget http://people.centos ...

  9. Hibernate(9)_双向n对n

    1.概述 ①双向 n-n 关联需要两端都使用集合属性 ②双向n-n关联必须使用连接表 ③集合属性应增加 key 子元素用以映射外键列, 集合元素里还应增加many-to-many子元素关联实体类 ④在 ...

  10. java内部类(一)

    内部类(一) 一.定义: 内部类就是定义在另一个类内部的类,与之对应,包含内部类的类就是外部类. 二.作用: 1.内部类提供更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包之中的其他类访问该类 ...