不用预计算切向空间的Normal mapping
先贴出shader 吧 等有时间了 来阐述原理
// vertex shader
//varying vec3 ViewPosition;
//varying vec3 Normal; varying vec3 Vertex_UV;
varying vec3 Vertex_Normal;
varying vec3 Vertex_LightDir;
varying vec3 Vertex_EyeVec; void main(void)
{ gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
Vertex_UV = gl_MultiTexCoord0.xyz ;
Vertex_Normal = gl_NormalMatrix*gl_Normal;
vec4 view_vertex = gl_ModelViewMatrix*gl_Vertex;
Vertex_LightDir = (gl_LightSource[].position - view_vertex).xyz;
Vertex_EyeVec = (-view_vertex).xyz ;
/*
vec4 MVM = (gl_ModelViewMatrix*gl_Vertex);
ViewPosition = MVM.xyz / MVM.w;
Normal = normalize(gl_NormalMatrix*gl_Normal);
*/ }
//uniform sampler2D tex0; // color map
uniform sampler2D normalMap; // normal map //uniform int LightNum; varying vec3 Vertex_UV;
varying vec3 Vertex_Normal;
varying vec3 Vertex_LightDir;
varying vec3 Vertex_EyeVec; //out vec4 Out_Color; mat3 cotangent_frame(vec3 N, vec3 p, vec2 uv)
{
// get edge vectors of the pixel triangle
vec3 dp1 = dFdx( p );
vec3 dp2 = dFdy( p );
vec2 duv1 = dFdx( uv );
vec2 duv2 = dFdy( uv ); // solve the linear system
vec3 dp2perp = cross( dp2, N );
vec3 dp1perp = cross( N, dp1 );
vec3 T = dp2perp * duv1.x + dp1perp * duv2.x;
vec3 B = dp2perp * duv1.y + dp1perp * duv2.y; // construct a scale-invariant frame
float invmax = inversesqrt( max( dot(T,T), dot(B,B) ) );
return mat3( T * invmax, B * invmax, N );
} vec3 perturb_normal( vec3 N, vec3 V, vec2 texcoord )
{
// assume N, the interpolated vertex normal and
// V, the view vector (vertex to eye)
vec3 map = texture(normalMap, texcoord ).xyz;
map = map * ./. - ./.;
mat3 TBN = cotangent_frame(N, -V, texcoord);
return normalize(TBN * map);
} void main(void){ vec2 uv = Vertex_UV.xy; vec3 N = normalize(Vertex_Normal);
vec3 L = normalize(Vertex_LightDir);
vec3 V = normalize(Vertex_EyeVec);
vec3 PN = perturb_normal(N, V, uv); //float lambertTerm = dot(PN, L);
vec4 intensity=vec4(0.0,0.0,0.0,0.0); // 最终的颜色 vec3 vDir,lDir,hDir;
float NdotL,NdotHV; hDir = normalize(V + L) ;
NdotL = max(dot(PN, L), 0.0);
NdotHV = max(dot(PN, hDir), 0.0); intensity+= gl_LightSource[].ambient * 0.5 ;
intensity+= gl_LightSource[].diffuse * NdotL * 0.3 ; if(NdotL!=)
intensity += gl_LightSource[].specular * NdotL * pow(NdotHV,); gl_FragColor = intensity; }
最近做subsurface scattering ,发现normal mapping 根本加不上,因为SSS实质相当于对表面做了个平滑,细节再加也会被平滑掉。
后来想着把扰动后的normal 直接加在最终的SSS效果上,不过这样有个问题就是本来的法向图必须增强,因为在最终的效果上叠加法向图效果比较弱
不用预计算切向空间的Normal mapping的更多相关文章
- 基于预计算的全局光照(Global Illumination Based On Precomputation)
目录 基于图像的光照(Image Based Lighting,IBL) The Split Sum Approximation 过滤环境贴图 预计算BRDF积分 预计算辐射度传输(Precomput ...
- 数据挖掘概念与技术15--为快速高维OLAP预计算壳片段
1. 论数据立方体预计算的多种策略的优弊 (1)计算完全立方体:需要耗费大量的存储空间和不切实际的计算时间. (2)计算冰山立方体:优于计算完全立方体,但在某种情况下,依然需要大量的存储空间和计算时间 ...
- Unity预计算光照的学习(速度优化,LightProb,LPPV)
1.前言 写这篇文章一方面是因为unity的微博最近出了关于预计算光照相关的翻译文章,另一方面一些美术朋友一直在抱怨烘培速度慢 所以抱着好奇的心态来学习一下unity5的PRGI预计算实时光照 2.基 ...
- Unity预计算全局光照的学习(速度优化,LightProbe,LPPV)
1.基本参数与使用 1.1 常规介绍 使用预计算光照需要在Window/Lighting面板下找到预计算光照选项,保持勾选预计算光照并保证场景中有一个光照静态的物体 此时在编辑器内构建后,预计算光照开 ...
- 切线空间(Tangent Space)法线映射(Normal Mapping)【转】
// 请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 切线空间(Tangent Space) 切换空间,同局部空间.世界空间等一样,是3D图形学中众多的坐标系之一.切 ...
- Unity Lighting - The Precompute Process 预计算过程(二)
The Precompute Process 预计算过程 In Unity, precomputed lighting is calculated in the background - eith ...
- 3DShader之法线贴图(normal mapping)
凹凸贴图(bump mapping)实现的技术有几种,normal mapping属于其中的一种,这里实现在物体的坐标系空间中实现的,国际惯例,上图先: 好了讲下原理 可以根据高度图生成法线量图,生成 ...
- 翻译:非常详细易懂的法线贴图(Normal Mapping)
翻译:非常详细易懂的法线贴图(Normal Mapping) 本文翻译自: Shaders » Lesson 6: Normal Mapping 作者: Matt DesLauriers 译者: Fr ...
- 3D游戏常用技巧Normal Mapping (法线贴图)原理解析——高级篇
1.概述 上一篇博客,3D游戏常用技巧Normal Mapping (法线贴图)原理解析——基础篇,讲了法线贴图的基本概念和使用方法.而法线贴图和一般的纹理贴图一样,都需要进行压缩,也需要生成mipm ...
随机推荐
- loadView,viewDidLoad等几种方法的调用总结
viewDidLoad 此方法只有当view从nib文件初始化的时候才被调用.viewDidLoad用于初始化,加载时用到的. loadView 此方法在控制器的view为nil的时候被调用.虽然经常 ...
- LinearLayout增加divider分割线
在android3.0及后面的版本在LinearLayout里增加了个分割线 1 2 android:divider="@drawable/shape"<!--分割线图片-- ...
- C++发送邮件和附件
c++socketnulldelete服务器stream 头文件 /**************************************************************** ...
- Linux shell入门基础(六)
六.Shell脚本编程详解 将上述五部分的内容,串联起来,增加对Shell的了解 01.shell脚本 shell: # #perl #python #php #jsp 不同的脚本执行不同的文本,执行 ...
- 如何在ASP.NET端获取屏幕宽度
using System.Windows.Forms; 首先引用上面的命名空间. 然后在代码中获取屏幕信息.如下代码: System.Windows.Forms.Screen screen = Sys ...
- node.js常用的几个模块总结
/** 一 util * 是 node 里面一个工具模块 ,node 里面几乎所有的模块 都会用到 在这个模块 * 功能: * 1 实现继承 这是主要功能 * 2 实现 ...
- html.ex.day02
1.同一个目录内页面跳转 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http: ...
- javaee后台适合用的编辑器插件
http://pan.baidu.com/s/1bn7D9sr 这个适合用在后台
- eclipse如何运行maven项目
不然启动tomcat会提示spring的类找不到
- Linux命令--用户用户组管理
新增用户组 : groupadd groupadd [-g GID] 组名 不加-g 则按照系统默认的gid创建组,跟用户一样,gid也是从500开始的 修改用户组信息 : groupmod grou ...