Vertex中实现每顶点光照的镜面高光效果

时间:2022-09-25 19:35:42

1,基础知识讲解

  一个物体在自然界会收到三种光的影响,周围的环境光、漫反射和镜面反射。那么对于计算机要想模拟现实中的光照,就应该也会实现这三种基本光照->环境光、漫反射、镜面高光。对于这三种光照,都存在着一定的影响因素,这就需要去追究其光照模型的公式了。

  (1),环境光强影响因素

    Vertex中实现每顶点光照的镜面高光效果 ,由此可看出环境光照的效果取决于一般环境光的强度 Vertex中实现每顶点光照的镜面高光效果 和漫反射的材质颜色 Vertex中实现每顶点光照的镜面高光效果

  (2),漫反射光强影响因素

    Vertex中实现每顶点光照的镜面高光效果

    Vertex中实现每顶点光照的镜面高光效果

    由此可看出,漫反射的反射光取决于入射光强度 Vertex中实现每顶点光照的镜面高光效果 和材质常数Vertex中实现每顶点光照的镜面高光效果,对于黑色表面,材质常数 Vertex中实现每顶点光照的镜面高光效果 的值是 0,对于白色表面,材质常数 Vertex中实现每顶点光照的镜面高光效果 的值是 1。当入射光的方向和物体表面法线的夹角有关,夹角越小,越接近法线,那么接受到的光强也就越多,就越亮。此时的dot乘积也就越大。(回想Cos的函数)

  (3),镜面反射光强影响因素

    Vertex中实现每顶点光照的镜面高光效果

    Vertex中实现每顶点光照的镜面高光效果

    镜面反射通过观察者方向 V 来计算镜面反射,如果 V 接近于 R,反射的强度也会变大(同时也受光泽度Vertex中实现每顶点光照的镜面高光效果 影响),根据 R 与 V 角度余弦值的 Vertex中实现每顶点光照的镜面高光效果-th 次方(pow 值)来生成不同光泽的亮点,我们需要限制负余弦的值为 0,此外镜面反射还要求一个材质颜色 Vertex中实现每顶点光照的镜面高光效果(通常是白色)

2,代码演练

  

Shader "JiKi/VertexLighting_Specular"
{
Properties
{
_Color("Base RGB",Color)=(,,,)
_Shininess("Shininess",Range(0.001,))=
_SpecColor("Specular Color",Color)=(,,,)
}
SubShader
{
Pass
{
Tags
{
"LightMode"="ForwardBase"
} CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc" uniform float4 _LightColor0; uniform float4 _Color;
uniform float _Shininess;
uniform float4 _SpecColor; struct inputVertex
{
float4 vertex:POSITION;
float3 normal:NORMAL;
};
struct outPutVertex
{
float4 pos:SV_POSITION;
float4 col:COLOR;
}; outPutVertex vert(inputVertex input)
{
outPutVertex o;
//工具函数
float4x4 modelMatrix=_Object2World;
float4x4 modelMatrixVerse=_World2Object;
//世界空间中的法线向量
float3 normalDir=normalize(mul(float4(input.normal,0.0),modelMatrixVerse).xyz);
//视线方向
float3 viewDir=normalize(_WorldSpaceCameraPos-mul(modelMatrix,input.vertex).xyz);
//灯光
float3 lightDir;
float attenuation;//衰减量 if(_WorldSpaceLightPos0.w==)//证明是无限长度的方向向量
{
attenuation=1.0;
lightDir=normalize(_WorldSpaceLightPos0).xyz;
}
else
{
float3 vertexToLightSource=(_WorldSpaceLightPos0-mul(modelMatrix,input.vertex)).xyz;
float dist=length(vertexToLightSource);
lightDir=normalize(vertexToLightSource);
attenuation=/dist;
}
//环境光
float3 ambientColor=UNITY_LIGHTMODEL_AMBIENT.rgb*_Color.rgb;
//漫反射
float3 diffuseColor=attenuation*_LightColor0.rgb*_Color.rgb*max(,dot(normalDir,lightDir));
//镜面高光
float3 specularColor;
if(dot(lightDir,normalDir)<)//证明是背面
{
specularColor=float3(,,);
}
else
{
specularColor=attenuation*_LightColor0.rgb*_SpecColor.rgb*pow((max(,dot(viewDir,reflect(-lightDir,normalDir)))),_Shininess);
}
//混合
o.col=float4(ambientColor+diffuseColor+specularColor,1.0);
o.pos=mul(UNITY_MATRIX_MVP,input.vertex);
return o;
} float4 frag(outPutVertex input):COLOR
{
return input.col;
}
ENDCG
}
}
}

  最后上效果图

  Vertex中实现每顶点光照的镜面高光效果 

  上面代码写的有些简陋,但个人觉得反映出来光照的原理了,有问题还请大家多多指正。

  由于这个是基于顶点的,因此光照效果显得有些粗糙,不够细腻,后续将在fragment中去实现光照,那样就会得到光滑的镜面高光。敬请期待!!不早了该睡了哈哈

Vertex中实现每顶点光照的镜面高光效果的更多相关文章

  1. GLSL逐顶点光照&lbrack;转&rsqb;

    转载:http://blog.csdn.net/hgl868/article/details/7872350 引言 在OpenGL中有三种类型的光:方向光(directional).点光(point) ...

  2. Vertex Lit 顶点光照

    http://blog.csdn.net/heyuchang666/article/details/51565102 顶点光照(Vertex Lit) 是最低保真度的光照.不支持实时阴影的渲染路径.最 ...

  3. &lbrack;Unity Shader&rsqb; 逐顶点光照和逐片元漫反射光照

    书中的6.4节讲的是漫反射的逐顶点光照和逐片元光照. 前一种算法是根据漫反射公式计算顶点颜色(顶点着色器),对颜色插值(光栅化过程)返回每个像素的颜色值(片元着色器). 第二种算法是获得顶点的法线(顶 ...

  4. unity shader入门(二)语义,结构体,逐顶点光照

    下为一个逐顶点漫反射光照shader Shader "study/Chapter6/vertexShader"{ Properties{_Diffuse("Diffuse ...

  5. Unity可编程管线的顶点光照Shader

    UnityCG.cginc有一个叫ShadeVertexLightsFull的函数可以用来计算顶点光照. 源码如下: // Used in Vertex pass: Calculates diffus ...

  6. Shader Model 3&period;0&colon;Using Vertex Textures SM3&colon;使用顶点纹理 &lpar;NVIDIA spec&comma; 6800支持使用D3DFMT&lowbar;R32F and D3DFMT&lowbar;A32B32G32R32F的纹理格式实现Vertex Texture。&rpar;

    翻译者 周波 zhoubo22@hotmail.com 版权所有 Philipp Gerasimov Randima (Randy) Fernando Simon Green NVIDIA Corpo ...

  7. ASP&period;NET中使用JavaScript实现图片自动水平滚动效果

    参照网上的资料,在ASP.NET中使用JavaScript实现图片自动水平滚动效果. 1.页面前台代码: <%@ Page Language="C#" AutoEventWi ...

  8. vue中使用第三方插件animate&period;css实现动画效果

    vue中使用第三方插件animate.css实现动画效果1.首先先引入第三方类animated.css2.将你所需要动画的标签用包裹起来3.在transition元素中添加enter-active-c ...

  9. MySQL中的模糊查询 like 和 Oracle中的 instr&lpar;&rpar; 函数有同样的查询效果

    注:MySQL中的模糊查询 like 和 Oracle中的 instr() 函数有同样的查询效果: 如下所示: MySQL: select * from tableName where name li ...

随机推荐

  1. Office2016打开doc字符间距过小

    缺少字体.........装上就行,放到windows/fonts目录下,自动安装了

  2. gridView RowDataBound事件 鼠标经过行颜色变化及根据字段值显示指定内容

    protected void gvBarInfo_RowDataBound(object sender, GridViewRowEventArgs e)        {            if ...

  3. Android studio 查看签名

    根据密钥查看 根据安装包查看:改apk为zip 解压 打开 META-INF --->cmd: keytool -printcert -file CERT.RSA

  4. HashTable&comma;HashSet与Dictionary

    1.HashTable 哈希表(HashTable)表示键/值对的集合.在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现 ...

  5. Android Broadcast Receiver

    说明 有时候我们在做android系统软件的时候,经常会需要做的事就是开机重新设置上次关机前的状态,当然,我们就会用到这个开机广播: <uses-permission android:name= ...

  6. &lt&semi;微信应用开发系列&gt&semi;定时刷新AccessToken

    微信内嵌H5站一直很火,很多公司也想借助微信的用户群和社交群来做点事情,所以对于各位代码君来说也算是一个研究方向吧. access_token是公众号的全局唯一票据,公众号调用各接口时都需使用acce ...

  7. codeforces 1077F2&period; Pictures with Kittens &lpar;hard version&rpar;单调队列&plus;dp

    被队友催着上(xun)分(lian),div3挑战一场蓝,大号给基佬紫了,结果从D开始他开始疯狂教我做人??表演如何AKdiv3???? 比赛场上:A 2 分钟,B题蜜汁乱计数,结果想得绕进去了20多 ...

  8. ROS 创建服务和请求

    教程 维基 http://wiki.ros.org/cn/ROS/Tutorials 快速过程 创建包 $ cd ~/catkin_ws $ mkdir ~/catkin_ws/src $ cd ~/ ...

  9. Android学习之基础知识八—Android广播机制实践(实现强制下线功能)

    强制下线功能算是比较常见的了,很多的应用程序都具备这个功能,比如你的QQ号在别处登录了,就会将你强制挤下线.实现强制下线功能的思路比较简单,只需要在界面上弹出一个对话框,让用户无法进行任何操作,必须要 ...

  10. Linux 清楚历史history命令的一个简单方法

    有时候做了一些历史记录 不想让别人知道, 发现最简单的办法是 set HISTSIZE=0 然后 history 就没有历史记录命令了 然后为了能用上下键进行历史命令使用 再 set HISTSIZE ...