GLSL实现Ambient Occlusion 【转】

http://blog.csdn.net/a3070173/archive/2008/11/04/3221181.aspx

相信使用OpenGl或DirectX3D的朋友都知道到固定功能管线在光照处理主要由环境光,散射光和镜面光构成,这样一个光照处理模型在被光 的地方将以统一的环境光进行着色,导致一种不自然的不真实效果.本文介绍的Ambient Occlusion方法将使用不当预计算的方式离线的生成模型的AO图,并在片元着色器中将对此AO图进行采样的结果与环境光和散射光效果进行相乘以适当 削弱环境光和散射光的强度,以增加模型的真实感.

那么什么是AO图呢?AO图其实是Ambient Occlusion纹理图的简称,其包含了模型各顶点的AO因子(即削弱因子).关于此削弱因子是如何计算的请参考http://www.ozone3d.net/tutorials/ambient_occlusion.php.这里只介绍效果的具体实现.

由于这个效果主要在GLSL着色器上进行实现所以以下贴出的Ambient Occlusion着色器代码.
 顶点着色器:
uniform float g_fScale;

varying vec2 g_vec2TexCoord0;
varying vec3 g_vec3Normal;
varying vec3 g_vec3Vertex;

void main()
{
 g_vec2TexCoord0 = vec2(gl_MultiTexCoord0.s, 1.0 - gl_MultiTexCoord0.t);
 g_vec3Normal = vec3(gl_Normal);

g_vec3Vertex = vec3(gl_Vertex);
    gl_Position = ftransform();
}

片元着色器:
const vec3 g_vec3AmbientResult = vec3(0.2, 0.2, 0.2);
const vec3 g_vec3DiffuseResult = vec3(0.64, 0.64, 0.64);
const vec3 g_vec3SpecularResult = vec3(1.0, 1.0, 1.0);
const float g_fShininess = 100.0;

uniform vec3 g_vec3CameraPositinInModel; // 模型空间照相机位置
uniform vec3 g_vec3LightPositionInModel; // 模型空间光源位置

uniform sampler2D g_AmbientOcclusion;

uniform bool g_bUseAmbientGene; // 是否使用Ambient Occlusion的标志

varying vec2 g_vec2TexCoord0;
varying vec3 g_vec3Normal;
varying vec3 g_vec3Vertex;

void main()
{
 // 采样Ambient Occlusion因子
 float fAmbientGene = texture2D(g_AmbientOcclusion, g_vec2TexCoord0).r;

// 计算散射因子
 vec3 L = normalize(g_vec3LightPositionInModel - g_vec3Vertex);
 vec3 N = normalize(g_vec3Normal);
 float fDiffuseGene = max(dot(N, L), 0.0);

// 计算镜面光因子
 float fSpecularGene = 0.0;
 if (fDiffuseGene > 0.0)
 {
  vec3 V = normalize(g_vec3CameraPositinInModel - g_vec3Vertex);
  vec3 H = normalize(L + V);
  fSpecularGene = pow(max(dot(N, H), 0.0), g_fShininess);
 }

// 计算最终颜色     
 if (g_bUseAmbientGene)
 {
  // Ambient Occlusion只影响环境和散射选项
  gl_FragColor = vec4(fAmbientGene*(g_vec3AmbientResult + 
      fDiffuseGene*g_vec3DiffuseResult) +
      fSpecularGene*g_vec3SpecularResult,
      1.0);
 }
 else
 {
  gl_FragColor = vec4(g_vec3AmbientResult + 
      fDiffuseGene*g_vec3DiffuseResult +
      fSpecularGene*g_vec3SpecularResult,
      1.0);
 }
}

在整个着色过程中唯一需要注意的是由于AO图是上下颠倒的,所以带计算纹理坐标时需要将t坐标被1.0f相减.
 Demo效果图:
 不启动Ambient Occlusion:


 
 启动Ambient Occlusion:

GLSL实现Ambient Occlusion 【转】

时间: 2024-10-16 16:50:00

GLSL实现Ambient Occlusion 【转】的相关文章

Cesium源码剖析---Ambient Occlusion(环境光遮蔽)

Ambient Occlusion简称AO,中文没有太确定的叫法,一般译作环境光遮蔽.百度百科上对AO的解释是这样的:AO是来描绘物体和物体相交或靠近的时候遮挡周围漫反射光线的效果,可以解决或改善漏光.飘和阴影不实等问题,解决或改善场景中缝隙.褶皱与墙角.角线以及细小物体等的表现不清晰问题,综合改善细节尤其是暗部阴影,增强空间的层次感.真实感,同时加强和改善画面明暗对比,增强画面的艺术性.AO简单来说就是根据周围物体对光线的遮挡程度,改变明暗效果.AO具体理论原理在网上都可以找到,感兴趣的可以去

Ambient Occlusion

一般在光照模型中,ambient light的计算方法为:A = l * m,其中l表示表面接收到的来自光源的ambient light的总量,而m表示表面接收到ambient light后,反射和吸收的量.出于性能考虑,在计算光照时,我们是不考虑那些从场景中其他物体反弹过来的光的,因为通常我们认为这些光在场景中被发散和弹射许许多多次以至于最后从各个方向照射到物体上的量是相同的.所以ambient light所做的就是提亮物体,它没有任何真实的物理光照计算,所以它最终的渲染效果就是一个常量颜色:

TSSAO Temporal Screen-Space Ambient Occlusion (Unity3d 5 示例实现)

前提 环境光(ambient occlusion)是一种GI,其简化形式SSAO可以用“微量高效”来形容,消耗得很少,得到的效果很好.环 境光遮蔽(ambient occlusion)的本质是计算在一个点的半球面范围内有多少方向被阻塞(如下图1.2.1),然后根据它调整表面颜色.如果实时渲染使用的话非常消 耗,所以在游戏中一般都使用(screen-space ambient occlusion)SSAO.SSAO使用depth buffer来近似一个离散的场景(如下图1.2.2),从而获得固定的

静态渲染之Ambient Occlusion

Ambient Occlusion Wikipedia 问题描述: 对于3D游戏,AO作为全局光照的一部分已经成为很多3D引擎的标配,不管是静态还是SSAO.本文描述为在游戏开发后期为了提高整体效果而弥补的静态渲染的AO. 制作流程: 按文档划分UV(正常应该按场景的区域还划分?) 渲染生成AO贴图 运行期使用AO贴图 一些要点: 分UV,合并单个文档的Mesh为一个Mesh,然后转换为DX的标准Mesh,然后利用DX自带的UVAtlas来进行UV划分(UVAtlas分的UV并不是很好),UVA

Unity3D技术之本地客户端开发入门

欢迎来到unity学习.unity培训.unity企业培训教育专区,这里有很多U3D资源.U3D培训视频.U3D教程.U3D常见问题.U3D项目源码,我们致力于打造业内unity3d培训.学习第一品牌. 本地客户端开发入门 本地客户端 (NaCl) 是 Google 提供的新技术,其允许您在 Web 页面嵌入本地可执行代码,以便您在无需安装插件的情况下部署性能非常强的 web 应用程序.目前,NaCl 仅支持在 Windows.Mac OS X 和 Linux(含可用的 Chrome 操作系统支

Unity3D组件参考手册

Refer to the information on these pages for details on working in-depth with various aspects of Unity. 这些页面的参考信息,是有关Unity深入工作的各个方面的详细信息. The Unity Manual Guide contains sections that apply only to certain platforms. Please select which platforms you

计算机图形学研究领域分哪些

计算机图形学各个领域的目标或许不同,但最终的形式都是渲染(即绘制)在二维的显示设备上的图像.下面是一个简单(可能并不完全)的分类: ?计算机图形学-领域及分支: ?1 绘制1.1 真实感绘制(非实时)1.1.1 光线追踪(Ray-tracing)1.1.2 全局光照(Global Illumination)......1.2 实时绘制1.2.1 Shading(BRDF, Programmable Shading等)1.2.2 纹理(Texture Synthesis, 反走样, 采样等)1.2

Unity5 GI与PBS渲染从用法到着色代码

本文主要介绍Untiy5以后的GI,PBS,以及光源探头,反射探头的用法以及在着色器代码中如何发挥作用,GI是如何影响渲染的,主要分成三个部分,最开始说明PBS需要的材质与相应概念,二是Unity 里相应GI的操作,三是对应着色器代码的理解.如果没有特殊声明,所有操作与代码都是针对Unity5.3. PBS材质与概念 简单来说,PBS的优点不同的照明下获得一致的外观,更容易实现,更直观的参数. PBS材质概念: 1.albedo 反照率 反照率贴图定义漫反射的基本颜色,与原来的漫反射贴图相比,不

Unity3D ShaderLab 漫反射卷积光照模型

http://www.cnblogs.com/2Yous/p/4251444.html 漫反射卷积[Diffuse convolution]是一个模糊立方体的过程,它保留了立方图的整体光照强度,只模糊了细节. 这种效果在我们要活得一个更具全局光照表面效果的时候非常有用. 为了实现这种效果,我们需要创建一个卷积运算的立方图.比如ATI的工具制作CubeMapGen. 下载地址: http://developer.amd.com/tools-and-sdks/archive/legacy-cpu-g