[shader] 光照入門(未完結。。。

反射

漫反射:而當物體表面粗糙時,我們把物體表面看作無數不同方向的微小鏡面,則這些鏡面反射出的光方向均不相同,這就是漫反射。

高光反射:我們假定物體表面光滑,只有一個鏡面,那么所有的光都被反射向了同一個方向(其實只是用時最短的光相位相似),這就是高光反射。

逐頂點光照和逐片元光照

逐頂點光照

1.在頂點上進行光照計算,頂點間的內部區域使用插值來獲取顏色信息。

2.計算量小,適用于移動設備及性能要求較高的場景。

3.效果不夠精細,細節損失。明暗變化損失嚴重。

逐片元光照

1.每個像素單獨進行光照計算。

2.精細度高,效果真實。

3.計算量大,耗費資源,適用于PC或主機游戲。

顏色相乘與顏色相加

顏色相加(復合光):計算光照反射時使用,向白色靠攏。

顏色相乘:計算顏色混合時使用,趨于黑色。

蘭伯特光照模型

1.理論:漫反射的強度僅與入射光的方向反射點處表面法線的夾角余弦成正比

2.公式:光源顏色*材質的漫反射顏色*max(0,標準化物體表面法線向量·標準化后光源方向向量)

實現思路

逐頂點光照

1.材質漫反射顏色屬性聲明

2.渲染標簽Tags設置,將LightMode光照模式設置為向前渲染

3.引用內置文件UnityCG.cginc和Lighting.cginc

4.結構體聲明(裁剪空間下的頂點坐標、對應頂點的漫反射光照顏色)

5.基于公式實現邏輯(為了陰暗面不為全黑,需要加上蘭伯特環境光顏色)

Shader "Unlit/Lambert" {Properties {// 材質漫反射顏色屬性聲明_MainColor ("MainColor", Color) = (1, 1, 1, 1)}SubShader {// 設置渲染標簽 將LightMode光照模式設置為ForwardBase 向前渲染Tags { "LightMode" = "ForwardBase" }Pass {CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#include "Lighting.cginc"//材質的漫反射顏色fixed4 _MainColor;//頂點著色器傳遞給片元著色器的內容struct v2f{//裁剪空間下的頂點坐標float4 pos:SV_POSITION;//對應頂點的漫反射光照顏色fixed3 color:COLOR;};//逐頂點光照 反射光照顏色計算寫在頂點著色器的回調函數中v2f vert(appdata_base v) {v2f v2fData;// 模型空間 ——> 裁剪空間的頂點 v2fData.pos = UnityObjectToClipPos(v.vertex);//模型空間下的法線 ——> 世界空間的法線float3 normal = UnityObjectToWorldNormal(v.normal);//世界空間下的 光源單位向量fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);fixed3 color = _LightColor0.rgb * _MainColor.rgb * max(0, dot(normal, lightDir));//記錄顏色 加上蘭伯特光照模型的環境光變量v2fData.color = UNITY_LIGHTMODEL_AMBIENT.rgb + color;return v2fData;}fixed4 frag(v2f i) : SV_Target{//傳出蘭伯特光照return fixed4(i.color.rgb, 1);}ENDCG}}
}

逐頂點和逐片元光照區別

1.在頂點著色器種計算頂點和法線

2.在片元著色器中計算蘭伯特光照

Shader "Unlit/LambertF" {Properties {_MainColor ("MainColor", Color) = (1, 1, 1, 1)}SubShader {Tags { "LightMode" = "ForwardBase" }Pass {CGPROGRAM#pragma vertex vert#pragma fragment frag#include "Lighting.cginc"#include "UnityCG.cginc"//材質漫反射顏色fixed4 _MainColor;//頂點著色器返回出去的內容struct v2f {//裁剪空間的 頂點坐標float4 pos : SV_POSITION;//世界空間的 法線位置float3 normal : NORMAL;};v2f vert(appdata_base v) {v2f v2fData;//模型空間——>裁剪空間 頂點v2fData.pos = UnityObjectToClipPos(v.vertex);//模型空間——>世界空間 法線v2fData.normal = UnityObjectToWorldNormal(v.normal);return v2fData;}//片元著色器fixed4 frag(v2f i) : SV_TARGET {//得到光源單位向量float3 lightDir = normalize(_WorldSpaceLightPos0.xyz);//光源顏色*材質的漫反射顏色*max(0,標準化物體表面法線向量·標準化后光源方向向量fixed3 color = _LightColor0.rgb * _MainColor * max(0, dot(i.normal, lightDir));color = UNITY_LIGHTMODEL_AMBIENT.rgb + color;return fixed4(color.rgb, 1);}ENDCG}}
}

半蘭伯特光照模型

1.使物體背面擁有明暗變化

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/164413.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/164413.shtml
英文地址,請注明出處:http://en.pswp.cn/news/164413.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

報錯For debugging consider passing CUDA_LAUNCH_BLOCKING=1.

.報錯For debugging consider passing CUDA_LAUNCH_BLOCKING1. /aten/src/ATen/native/cuda/NLLLoss2d.cu:103: nll_loss2d_forward_kernel: block: [29,0,0], thread: [707,0,0] Assertion t > 0 && t < n_classes failed. 報錯信息如下&#xff1a; ./aten/…

力扣labuladong——一刷day46

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、力扣971. 翻轉二叉樹以匹配先序遍歷二、力扣987. 二叉樹的垂序遍歷三、力扣666. 路徑總和 IV 前言 二叉樹的遞歸分為「遍歷」和「分解問題」兩種思維模式&a…

面試:RocketMQ相關問題

文章目錄 什么是 RocketMQ&#xff0c;有哪些使用場景&#xff1f;RocketMQ 由哪些?色組成&#xff0c;每個?色作用和特點是什么&#xff1f;RocketMQ 中的 Topic 和 JMS 的 queue 有什么區別&#xff1f;RocketMQ 消費模式有幾種&#xff1f;RocketMQ 的 Consumer 是如何消費…

【深度學習】Python快捷調用InsightFace人臉檢測,純ONNX推理

pypi資料&#xff1a; https://pypi.org/project/insightface/ 模型選擇&#xff1a; https://github.com/deepinsight/insightface/tree/master/python-package#model-zoo onnxruntime的GPU對應CUDA &#xff1a; https://onnxruntime.ai/docs/reference/compatibility …

1999-2021年地級市城鎮居民人均消費性支出數據

1999-2021年地級市城鎮居民人均消費性支出數據 1、時間&#xff1a;1999-2021年 2、指標&#xff1a;城鎮居民人均消費性支出 3、范圍&#xff1a;290個地級市 4、來源&#xff1a;城市年鑒、地級市統計公報 5、指標解釋&#xff1a; 城鎮居民人均消費性支出&#xff1a;指…

kubesphere安裝依賴文件

yum install socat -y yum install conntrack -y

GAMES101-Homework2

目錄 普通作業&#xff1a;提高作業&#xff1a;參考博客博客一博客二博客三 附代碼框架的個人一些注釋和理解&#xff1a;rasterizer.cppTriangle.cpp 普通作業&#xff1a; // 判斷點是否在三角形內的輔助函數 static bool insideTriangle(float x, float y, const Vector3f…

再添千萬級罰單,某銀行年內罰款過億!金融行業合規問題亟待解決

11月17日晚間&#xff0c;國家金融監管總局上海監管局披露行政處罰信息顯示&#xff0c;某銀行因32項違法違規事實收到兩張690萬元的大額罰單&#xff0c;合計罰款金額達1380萬元。但這并不是銀行該今年收到的第一張大額罰單。今年4月28日&#xff0c;該行因在結售匯、外幣理財…

k8s-pod生命周期 4

容器環境初始化 pod 由pod 鏡像來提供&#xff0c;在pod 生命周期里容器主要分為兩種&#xff1a;初始化容器和主容器 初始化容器一定要成功運行并退出&#xff0c;當初始化容器運行退出完了之后主容器開始和運行 主容器開始運行的時候&#xff0c;有兩個探針&#xff1a;存…

什么是arguments對象?

arguments 對象是 JavaScript 中的一個特殊對象&#xff0c;它包含了函數被調用時傳入的所有參數。arguments 對象是一個類數組對象&#xff0c;它有一個 length 屬性和按數字索引的元素。 每個函數在執行時都會自動創建一個 arguments 對象。我們可以通過arguments去訪問參數…

網絡圖簡單計算規則

單代號進度網絡圖&#xff08;節點法&#xff09; 概念 計算規則 &#xff08;順時針計算法&#xff09; &#xff08;TF取之差&#xff09; &#xff08;T&#xff1a;持續時間&#xff09; ES → EF (ES取大EF加T) ↑ T ↑ &#xff08;TF&#xff1a;總時差&…

NOIP2003提高組第二輪T3:加分二叉樹

題目鏈接 [NOIP2003 提高組] 加分二叉樹 題目描述 設一個 n n n 個節點的二叉樹 tree \text{tree} tree 的中序遍歷為 ( 1 , 2 , 3 , … , n ) (1,2,3,\ldots,n) (1,2,3,…,n)&#xff0c;其中數字 1 , 2 , 3 , … , n 1,2,3,\ldots,n 1,2,3,…,n 為節點編號。每個節點都…

【視覺SLAM十四講學習筆記】第三講——Eigen庫

專欄系列文章如下&#xff1a; 【視覺SLAM十四講學習筆記】第一講——SLAM介紹 【視覺SLAM十四講學習筆記】第二講——初識SLAM 【視覺SLAM十四講學習筆記】第三講——旋轉矩陣 本章將介紹視覺SLAM的基本問題之一&#xff1a;如何描述剛體在三維空間中的運動&#xff1f; Eigen…

網工內推 | Base北京,國企網工運維,最高30k*14薪,IE認證優先

01 萬方數據股份有限公司 招聘崗位&#xff1a;網絡工程師 職責描述&#xff1a; 1.負責完成基礎網絡組網工作&#xff1b; 2.負責網絡對象的訪問控制及安全策略&#xff0c;配置VLan&#xff0c;黑白名單、地址轉換、故障排查及網絡安全監控工作&#xff1b; 3.負責對操作系…

Vue框架學習筆記——Vue實例中el和data的兩種寫法

文章目錄 前文提要Vue實例的el第一種寫法第二種寫法小結 Vue實例中data第一種寫法&#xff0c;對象式效果圖片第二種寫法&#xff0c;函數式效果圖片小結 前文提要 本文僅做自己的學習記錄&#xff0c;如有錯誤&#xff0c;請多諒解 Vue實例的el 第一種寫法 <body><…

Python圖片文件和base64編碼互轉

圖片和base64編碼互轉 import base64 import cv2# 將圖片base64字符串生成圖片文件. def base64_to_img(base64_code,save_img_path):"""根據base64生成圖片.:param base64_code: 圖片的base64文件:param save_img_path: 生成的圖片路徑:returns: None"&q…

分布式鎖之基于mysql實現分布式鎖(四)

不管是jvm鎖還是mysql鎖&#xff0c;為了保證線程的并發安全&#xff0c;都提供了悲觀獨占排他鎖。所以獨占排他也是分布式鎖的基本要求。 可以利用唯一鍵索引不能重復插入的特點實現。設計表如下&#xff1a; CREATE TABLE tb_lock (id bigint(20) NOT NULL AUTO_INCREMENT,…

(二)C語言之變量與算數運算表達式概述

C語言之變量與算數運算表達式概述 一、華氏溫度與攝氏溫度對照二、代碼概述三、練習 一、華氏溫度與攝氏溫度對照 #include <stdio.h>/*當華氏溫度為 0,20,40,...300時&#xff0c;打印出華氏溫度與攝氏溫度對照表華氏溫度與攝氏溫度 C(5/9)(?F-32) 其中C表示攝氏溫度&…

順序棧和鏈棧

#include<iostream> using namespace std; #define MAXSIZE 100 typedef int SElemType; typedef struct { SElemType* base; SElemType* top; int stacksize; }SqStack;//順序棧 //構造一個空棧 int InitStack(SqStack& s) { s.base new SElemType…

Django之中間件與CSRF_TOKEN

文章目錄 一、什么是中間件二、中間件有什么用三、Django自定義中間件中間件中主要方法及作用創建自定義中間件的步驟&#xff1a;process_request與process_response方法process_view方法process_exceptionprocess_template_response&#xff08;不常用&#xff09; 四、CSRF_…