blinn-phong高光反向穿透问题

blinn-phong高光:

H=normalize(V+L);?

specular=pow(saturate(dot(N,H)),shiness);

会遇到如下问题:

图中光源在surface背面,但却仍然产生高光。(可以验证,不使用半角向量h,而使用反射向量r的原始phong高光也存在类似问题。)

此问题的一种简单解决办法,是判断出光源在surface背面则令specular为0,即:

H=normalize(V+L);?

specular=pow(saturate(dot(N,H)),shiness);

if(dot(N,L)<0){

  specular=0;

}

这样确实能避面背光面产生高光,但是在背光面和受光面之间高光突然截断会产生过硬的明暗交界线。

为了使交界线处过度柔和些,可以采用如下技巧:

首先不难看出上面代码等价于:

H=normalize(V+L);?

specular=pow(saturate(dot(N,H)),shiness);

specular*=step(0,dot(N,L));

为使过度平滑,只需用smoothstep代替step,即:

H=normalize(V+L);?

specular=pow(saturate(dot(N,H)),shiness);

specular*=smoothstep(0,0.12,dot(N,L));

这样就ok了。

注:smoothstep(0,0.12,dot(N,L))的含义就是:当dot(N,L)<0时,取0;当dot(N,L)>0.12时取1,当dot(N,L)介于0与0.12之间时平滑插值。

时间: 2024-10-10 21:21:39

blinn-phong高光反向穿透问题的相关文章

Unity-Shader-镜面高光Phong&amp;BlinnPhong-油腻的师姐在哪里

[旧博客转移 - 2016年4月4日 13:13 ] 油腻的师姐: 以前玩过一款很火热的端游<剑灵>,剑灵刚出来的时候,某网页游戏广告视频中有句台词:"我不断的在寻找,有你的世界在哪里",该广告中的人物,音效都模仿了剑灵,而<剑灵>中的人物模型表面看上去油光发亮,所以就被网友改成了:"我不断的洗澡,油腻的师姐在哪里" 像这样(皮肤表面的高光) 这样 还有~ 这样 其实这是使用了镜面反射着色,除了剑灵,其他很多高品质的AAA级游戏也都使用了不同

Unity3D ShaderLab 使用BlinnPhong高光类型

Unity3D shaderLab 使用BlinnPhong高光类型 上一篇我们实现了自定义高光类型,这一篇,我们说Blinn高光,它是另一种计算和估算高光更高效的方式,它是通过视线防线和光线方向,所形成的半角向量来完成. 这种方式比我们自己形成反射向量来进行计算更加高效.在UnityCG.cginc文件中内置的BlinnPhong光照模型就是半角矢量完成的. 首先还是创建一个shader,一个材质球,双击shader,打开编辑器. 1:Properties Properties { _Main

Unity3D ShaderLab 创建自定义高光类型

Unity3D ShaderLab 创建自定义高光类型 在上一篇,我们认识了Unity基础的高光实现,本次主要是研究如何对Phong高光类型进行顶点操作,以及在表面着色器中使用Input结构体的新参数进行像素操作. 所以还是新建Shader,再建材质球然后打开编辑器进行shader的编辑. 1.修改Properties Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _MainTint("Diff

OpenGL ES 2.0基本概念

1. OpenGL ES 2.0可编程管道 OpenGL负责把三维空间中的对象通过投影.光栅化转换为二维图像,然后呈现到屏幕上. 上图黄色部分(Vertex Shader和Fragment Shader)为此管道的可编程部分.整个管道包含以下两个规范: 1) OpenGL ES 2.0 API specification 2) OpenGL ES Shading Language Specification (OpenGL ES SL) 详细流程图如下: 此流程把三维数据变换为可以显示的二维数据

局部光照模型

提要 常见的光照模型一般包括四个部分ambient, diffuse, specular, 和emitted light. 即: vertex color = ambient + diffuse + specular + emitted light 当有多个光源的时候,最后的颜色就是多个结果的叠加. Ambient light:环境光,通常定义在光源的中,注意每个光源的衰减量. Diffuse:漫反射部分,光照找到物体的表面,由于物体的表面凹凸不平而反射到各个方向的光. Specular :相比

opengl ES

1. OpenGL ES 2.0可编程管道 OpenGL负责把三维空间中的对象通过投影.光栅化转换为二维图像,然后呈现到屏幕上. 上图黄色部分(Vertex Shader和Fragment Shader)为此管道的可编程部分.整个管道包含以下两个规范: 1) OpenGL ES 2.0 API specification 2) OpenGL ES Shading Language Specification (OpenGL ES SL) 详细流程图如下: 此流程把三维数据变换为可以显示的二维数据

Unity 图形学 基础知识总结

1. 渲染流水线 三大块:应用阶段,几何阶段,光栅化阶段 渲染图元   顶点信息 GPU流水线 顶点数据=> 顶点着色器;曲面细分着色器;几何着色器;裁剪;屏幕映射=> 三角形设置;三角形遍历;片元着色器;逐片元操作=> 屏幕图像 裁剪:可配置的,摄像机属性 逐片元操作:模板测试,深度测试,混合(不可编程,可以配置) 为了优化,Unity的Ztest是在片元着色器之前; 但是如果使用了clip(值为负数,丢弃像素信息 discard)函数,会关闭提前测试,导致需要处理的片元增加 2. 数

我们的机房更环保,数据更安全?

如何让我们辛苦建立起来的机房重地,数据更安全?设备维保,除尘为先. 机房智能除尘预案[成都地衣科技] Science Sechnology Cleaning 概述 保护客户中心机房的信息系统基础设施.设备.媒介免受环境的危害.通过对设备从维护直至最后报废的全过程进行安全相关的防护和相应的规范,防止客户的信息系统的的资产的损坏.丢失.从而进一步保障客户信息系统的持续工作,我们采用世界上最先进的工艺和科学的技术,保障机房设备的安全,维护客户的信息数据的安全. 第一章 机房情况介绍 一.客户的机房除尘

【Shader拓展】Illustrative Rendering in Team Fortress 2

写在前面 早在使用ramp texture控制diffuse光照一文就提到了这篇著名的论文.Valve公司发表的其它成果可见这里.这是Valve在2007年发表的一篇非常具有影响力的文章,我的导师也提到过这篇,既然这么有名.我就去拜读了下,结果真是读到头大啊啊啊啊!事实上半年前就读了这篇文章.差一点读完.后来一比赛一考试一放假就没完毕,对自己非常愧疚. ..时隔这么久希望能把之前的理解整理出来,顺便看看能不能有很多其它收获.(又要读一遍E文!) 这篇博客在翻译这篇论文的基础上.会在Unity S