参考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. C语言基础二(敲打键盘、寻找资料)

    看过很多资料的人,估计发觉了什么,我上篇的基础一其中一个最致命的错误,没有加return 0; 为什么不加,说真的,我留个坑,所以跳跃性的直接说到函数是如何运用的. 上章说到main就是主入口,根据m ...

  2. 在C#中,Json的序列化和反序列化的几种方式总结 转载

    转载自  https://www.cnblogs.com/caofangsheng/p/5687994.html    谢谢 在这篇文章中,我们将会学到如何使用C#,来序列化对象成为Json格式的数据 ...

  3. 4990: [Usaco2017 Feb]Why Did the Cow Cross the Road II 线段树维护dp

    题目 4990: [Usaco2017 Feb]Why Did the Cow Cross the Road II 链接 http://www.lydsy.com/JudgeOnline/proble ...

  4. Alpha冲刺(2/10)——2019.4.25

    所属课程 软件工程1916|W(福州大学) 作业要求 Alpha冲刺(2/10)--2019.4.25 团队名称 待就业六人组 1.团队信息 团队名称:待就业六人组 团队描述:同舟共济扬帆起,乘风破浪 ...

  5. C/JS_二分法查找

    1. 二分法查找 前提: 数据是排好序的. 题设:给出一个有序arr,从中找出key,arr的区间是array[ low , higt]. 步骤: (1)mid=(low+high)/2 (2)arr ...

  6. 10、jQuery初识

    jQuery是由原生js写的所以说所有jQuery制作出来的效果都可以使用js做出来,jQuery出现的目的是为了优化代码,提高码代码的效率它将很多功能封装. 本篇导航: jQuery的认识 jQue ...

  7. nginx配置http访问自动跳转到https

    1.按照如下格式修改nginx.conf 配置文件,80端口会自动转给443端口,这样就强制使用SSL证书加密了.访问http的时候会自动跳转到https上面 server { listen ; se ...

  8. SeaweedFS的配置使用

    SeaweedFS是一个简单并且高度可扩展的分布式文件系统,可以存储数十亿的文件并且快速获得文件,特别适合于有效处理小文件,这里我们简称为weed,weed的主节点不管理文件元数据而是仅管理文件卷,这 ...

  9. 【Spring】Springboot监听器,启动之后初始化工作

    package com.laplace.laplace.common.starter.config; import java.io.IOException; import org.slf4j.Logg ...

  10. UVA - 1456 Cellular Network

    题目大意: 手机在蜂窝网络中的定位是一个基本问题.如果蜂窝网络已经得知手机处于c1, c2,-,cn这些区域中的一个.最简单的方法是同一时候在这些区域中寻找手机.但这样做非常浪费带宽. 因为蜂窝网络中 ...