OpenGL normalMap
参考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的更多相关文章
- 在 OpenGL ES 2.0 上实现视差贴图(Parallax Mapping)
在 OpenGL ES 2.0 上实现视差贴图(Parallax Mapping) 视差贴图 最近一直在研究如何在我的 iPad 2(只支持 OpenGL ES 2.0, 不支持 3.0) 上实现 视 ...
- NormalMap原理详细解析
NormalMap的实现标志着对渲染流水线的各个环节以及矩阵变化有了正确和深入的认识.这里记录一下学习过程,以及关于NormalMap的诸多细节. 刚开始想要实现NormalMap程序的时候,查阅的是 ...
- RenderMonkey 练习 第五天 【OpenGL NormalMapping】
1. 新建一个OpenGL 空effect; 2. 添加相关变量 右击Effect节点选择Add Variable->float->float / float3 添加镜面光强度.灯光位置和 ...
- NormalMap 贴图 【转】
转载: http://www.zwqxin.com/archives/shaderglsl/review-normal-map-bump-map.html 说起Normal Map(法线贴图),就 ...
- NormalMap 贴图 [转]
转载: http://www.zwqxin.com/archives/shaderglsl/review-normal-map-bump-map.html 说起Normal Map(法线贴图),就 ...
- 【AR实验室】OpenGL ES绘制相机(OpenGL ES 1.0版本)
0x00 - 前言 之前做一些移动端的AR应用以及目前看到的一些AR应用,基本上都是这样一个套路:手机背景显示现实场景,然后在该背景上进行图形学绘制.至于图形学绘制时,相机外参的解算使用的是V-SLA ...
- [OpenGL超级宝典]专栏前言
我小时候的梦想呢,是做宇航员或者科学家或者是做一款属于自己的游戏,后来前面两个梦想都没有实现,于是我就来实现我的第三个梦想了,,,我呢,也算是零基础,因为我的专业是物联网工程,这个专业覆盖面之广,简直 ...
- OpenGL超级宝典笔记----渲染管线
在OpenGL中任何事物都在3D空间中,但是屏幕和窗口是一个2D像素阵列,所以OpenGL的大部分工作都是关于如何把3D坐标转变为适应你屏幕的2D像素.3D坐标转为2D坐标的处理过程是由OpenGL的 ...
- OpenGL超级宝典笔记----框架搭建
自从工作后,总是或多或少的会接触到客户端3d图形渲染,正好自己对于3d图形的渲染也很感兴趣,所以最近打算从学习OpenGL的图形API出发,进而了解3d图形的渲染技术.到网上查了一些资料,OpenGL ...
随机推荐
- AC自动机算法小结
AC自动机,可惜不能自动AC 转载:飘过的小牛 OIer55242 简介 Aho-Corasick automation 该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一.一个常见的例子就 ...
- LINUX文件及目录管理命令基础
Linux命令行组成结构 Linux命令结构 在Linux中一切皆文件,一切皆命令! 命令提示符: [root@tt ~]# [xiaohui@tt ~]$ Linux命令行常用快捷键 ctrl + ...
- js写滚动的文字
页面中的文字,逐个显示在页面:由于电脑的配置较低,录制的视频相对来说比较卡顿 思路: 用一个定时器将预制的文字通过字符串截取.substring(0, i)方法不断的赋给要显示的区域,i在定时器里面迭 ...
- vue使用babel+sass出错解决
按照官网的步骤先将vue项目建立好,这时如果使用lang="babel",lang="scss"会报错. 这时终端进入项目文件夹下输入以下命令: npm ins ...
- Intel处理器技术文档
1.intel程序员手册(1986).pdf 下载地址 2.Intel® 64 and IA-32 Architectures Software Developer Manuals 下载链接 3. ...
- ELK架构设计
1.架构一 2.架构二 3.架构三 4.架构四 示例1: 示例二: ELKB简述 E:Elasticsearch 是一个基于Lucene的分布式搜索和分析引擎,具有高可伸缩.高可靠和易管理等特点.支持 ...
- C# 程序打包成安装项目
Xaml设置图标https://blog.csdn.net/u014234260/article/details/73648649 winform程序控制面板中卸载显示图标https://blog.c ...
- ArrayList代码学习
ArrayList (数组链表)使用Object数组作为存储. /** * The array buffer into which the elements of the ArrayList are ...
- Linux学习必备
17,继往开来 实践是检验真理的唯一标准! ---运维技术组----mvpbang #开源代码 https://github.com/ #目前最受欢迎的 https://gitee.com/ ...
- Linux-进程描述符 task_struct 详解
为了描述控制进程的运行,系统中存放进程的管理和控制信息的数据结构称为进程控制块 PCB(Process Control Block),它是进程实体的一部分,是操作系统中最重要的记录性数据结构.它是进程 ...