Unity Shader------漫反射(Diffuse)计算

2023-10-10 00:30

本文主要是介绍Unity Shader------漫反射(Diffuse)计算,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

光照模型:
一个公式,用来计算在某个点的光照效果
标准光照模型下进入摄像机的光:
自发光
高光反射
漫反射(Diffuse): 直射光颜色 * max(0,cos(光和法线的夹角))
逐顶点实现漫反射:

Shader "Custom/Shader01"{SubShader{Pass{//定义LightMode以得到unity的内置光照变量Tags{"LightMode"="ForwardBase"}CGPROGRAM//unity内置文件引入,要使用unity的内置变量#include "Lighting.cginc"#pragma vertex vert#pragma fragment fragstruct a2v{float4 vertex : POSITION;float3 normal : NORMAL;};struct v2f{float4 position : SV_POSITION;fixed3 color : COLOR;};v2f vert(a2v v){v2f f;//UNITY_MATRIX_MVP 坐标从模型空间转剪裁空间f.position = mul(UNITY_MATRIX_MVP,v.vertex);//法线的单位向量:_World2Object 把一个方向从世界空间转模型空间fixed3 normalDir = normalize(mul(v.normal, (float3x3) _World2Object));//光的单位向量:对于每个顶点来说,平行光位置就是光的方向 _WorldSpaceLightPos0 取得平行光的位置fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);fixed3 diffuse = _LightColor0.rgb * max(dot(normalDir, lightDir), 0);//取得漫反射颜色f.color = diffuse;return f;}fixed4 frag(v2f f) : SV_Target{return fixed4(f.color,1);}ENDCG}}FallBack "Diffuse"
}

漫反射效果:
在这里插入图片描述
添加环境光和自身的颜色

Shader "Custom/Shader01"{Properties{_Color("_Color",Color) = (1,1,1,1) //物体本身的颜色}SubShader{Pass{//定义LightMode以得到unity的内置光照变量Tags{"LightMode"="ForwardBase"}CGPROGRAM//unity内置文件引入,要使用unity的内置变量#include "Lighting.cginc"#pragma vertex vert#pragma fragment fragfixed4 _Color;struct a2v{float4 vertex : POSITION;float3 normal : NORMAL;};struct v2f{float4 position : SV_POSITION;fixed3 color : COLOR;};v2f vert(a2v v){v2f f;//UNITY_MATRIX_MVP 坐标从模型空间转剪裁空间f.position = mul(UNITY_MATRIX_MVP,v.vertex);//法线的单位向量:_World2Object 把一个方向从世界空间转模型空间fixed3 normalDir = normalize(mul(v.normal, (float3x3) _World2Object));//光的单位向量:对于每个顶点来说,平行光位置就是光的方向 _WorldSpaceLightPos0 取得平行光的位置fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);//取得漫反射颜色fixed3 diffuse = _LightColor0.rgb * max(dot(normalDir, lightDir), 0) * _Color.rgb;//UNITY_LIGHTMODEL_AMBIENT 获取环境光fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;f.color = diffuse + ambient;return f;}fixed4 frag(v2f f) : SV_Target{return fixed4(f.color,1);}ENDCG}}FallBack "Diffuse"
}

在这里插入图片描述
逐像素实现漫反射:

Shader "Custom/Shader02"{Properties{_Color("_Color",Color) = (1,1,1,1) //物体本身的颜色}SubShader{Pass{//定义LightMode以得到unity的内置光照变量Tags{"LightMode"="ForwardBase"}CGPROGRAM//unity内置文件引入,要使用unity的内置变量#include "Lighting.cginc"#pragma vertex vert#pragma fragment fragfixed4 _Color;struct a2v{float4 vertex : POSITION;float3 normal : NORMAL;};struct v2f{float4 position : SV_POSITION;fixed3 worldNormalDir : COLOR0;};v2f vert(a2v v){v2f f;f.position = mul(UNITY_MATRIX_MVP, v.vertex);f.worldNormalDir = normalize(mul(v.normal, (float3x3) unity_WorldToObject));return f;}fixed4 frag(v2f f) : SV_Target{fixed3 normalDir = f.worldNormalDir;fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);fixed3 diffuse = _LightColor0.rgb * max(dot(normalDir, lightDir), 0) * _Color.rgb;fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;fixed3 tempColor = diffuse + ambient;return fixed4(tempColor,1);}ENDCG}}FallBack "Diffuse"
}

与之前的逐顶点进行对比,颜色过渡平滑,效果更好
在这里插入图片描述

半兰伯特光照模型:
之前的漫反射也叫兰伯特光照模型,通过公式我们可以看到cos的值是-1到1的,当小于1时为0,这时物体的背面是几乎是黑色的,会影响游戏的体验
我们将cos值*0.5+0.5,这时值的范围变为0到1

fixed3 diffuse = _LightColor0.rgb * (dot(normalDir, lightDir)*0.5 + 0.5) * _Color.rgb;

在这里插入图片描述
在这里插入图片描述

这篇关于Unity Shader------漫反射(Diffuse)计算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/176655

相关文章

poj 1113 凸包+简单几何计算

题意: 给N个平面上的点,现在要在离点外L米处建城墙,使得城墙把所有点都包含进去且城墙的长度最短。 解析: 韬哥出的某次训练赛上A出的第一道计算几何,算是大水题吧。 用convexhull算法把凸包求出来,然后加加减减就A了。 计算见下图: 好久没玩画图了啊好开心。 代码: #include <iostream>#include <cstdio>#inclu

uva 1342 欧拉定理(计算几何模板)

题意: 给几个点,把这几个点用直线连起来,求这些直线把平面分成了几个。 解析: 欧拉定理: 顶点数 + 面数 - 边数= 2。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc

uva 11178 计算集合模板题

题意: 求三角形行三个角三等分点射线交出的内三角形坐标。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <

XTU 1237 计算几何

题面: Magic Triangle Problem Description: Huangriq is a respectful acmer in ACM team of XTU because he brought the best place in regional contest in history of XTU. Huangriq works in a big compa

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

计算数组的斜率,偏移,R2

模拟Excel中的R2的计算。         public bool fnCheckRear_R2(List<double[]> lRear, int iMinRear, int iMaxRear, ref double dR2)         {             bool bResult = true;             int n = 0;             dou

GPU 计算 CMPS224 2021 学习笔记 02

并行类型 (1)任务并行 (2)数据并行 CPU & GPU CPU和GPU拥有相互独立的内存空间,需要在两者之间相互传输数据。 (1)分配GPU内存 (2)将CPU上的数据复制到GPU上 (3)在GPU上对数据进行计算操作 (4)将计算结果从GPU复制到CPU上 (5)释放GPU内存 CUDA内存管理API (1)分配内存 cudaErro

Java - BigDecimal 计算分位(百分位)

日常开发中,如果使用数据库来直接查询一组数据的分位数,就比较简单,直接使用对应的函数就可以了,例如:         PERCENT_RANK() OVER(PARTITION BY 分组列名 ORDER BY 目标列名) AS 目标列名_分位数         如果是需要在代码逻辑部分进行分位数的计算,就需要我们自己写一个工具类来支持计算了 import static ja

安卓玩机工具------小米工具箱扩展工具 小米机型功能拓展

小米工具箱扩展版                     小米工具箱扩展版 iO_Box_Mi_Ext是由@晨钟酱开发的一款适用于小米(MIUI)、多亲(2、2Pro)、多看(多看电纸书)的多功能工具箱。该工具所有功能均可以免root实现,使用前,请打开开发者选项中的“USB调试”  功能特点 【小米工具箱】 1:冻结MIUI全家桶,隐藏状态栏图标,修改下拉通知栏图块数量;冻结

OpenStack离线Train版安装系列—2计算节点-环境准备

本系列文章包含从OpenStack离线源制作到完成OpenStack安装的全部过程。 在本系列教程中使用的OpenStack的安装版本为第20个版本Train(简称T版本),2020年5月13日,OpenStack社区发布了第21个版本Ussuri(简称U版本)。 OpenStack部署系列文章 OpenStack Victoria版 安装部署系列教程 OpenStack Ussuri版