Unity中Shader的Standard材質解析(一)

文章目錄

  • 前言
  • 一、在Unity中,按一下步驟準備
    • 1、在資源管理面板創建一個 Standard Surface Shader
    • 2、因為Standard Surface Shader有很多缺點,所以我們把他轉化為頂點片元著色器
    • 3、整理只保留主平行光的Shader效果
    • 4、精簡后的最終代碼


前言

在Unity中,實現PBR材質的Shader


一、在Unity中,按一下步驟準備

1、在資源管理面板創建一個 Standard Surface Shader

在這里插入圖片描述

2、因為Standard Surface Shader有很多缺點,所以我們把他轉化為頂點片元著色器

  • 點擊Show generated code

在這里插入圖片描述

  • 把生成后的,頂點片元著色器代碼復制過去

在這里插入圖片描述

  • 這樣我們就可以得到一個簡單的PBR材質了

在這里插入圖片描述

3、整理只保留主平行光的Shader效果

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述

4、精簡后的最終代碼

最終效果:

  • 給予對于紋理

在這里插入圖片描述
在這里插入圖片描述

//Standard材質
Shader "MyShader/P2_2_4"
{Properties{_Color ("Color", Color) = (1,1,1,1)_MainTex ("Albedo (RGB)", 2D) = "white" {}[NoScaleOffset]_MetallicTex("Metallic(R) Smoothness(G) AO(B)",2D) = "white" {}[Normal]_NormalTex("NormalTex",2D) = "bump" {}_Glossiness ("Smoothness", Range(0,1)) = 0.0_Metallic ("Metallic", Range(0,1)) = 0.0_AO("AO",Range(0,1)) = 1.0}SubShader{Tags{"RenderType"="Opaque"}LOD 200// ---- forward rendering base pass:Pass{Name "FORWARD"Tags{"LightMode" = "ForwardBase"}CGPROGRAM// compile directives#pragma vertex vert#pragma fragment frag#pragma target 3.0#pragma multi_compile_instancing#pragma multi_compile_fog#pragma multi_compile_fwdbase#include "UnityCG.cginc"#include "Lighting.cginc"#include "UnityPBSLighting.cginc"#include "AutoLight.cginc"sampler2D _MainTex;float4 _MainTex_ST;half _Glossiness;half _Metallic;fixed4 _Color;sampler2D _MetallicTex;half _AO;sampler2D _NormalTex;struct appdata{float4 vertex : POSITION;float4 tangent : TANGENT;float3 normal : NORMAL;float4 texcoord : TEXCOORD0;float4 texcoord1 : TEXCOORD1;float4 texcoord2 : TEXCOORD2;float4 texcoord3 : TEXCOORD3;fixed4 color : COLOR;UNITY_VERTEX_INPUT_INSTANCE_ID};// vertex-to-fragment interpolation data// no lightmaps:struct v2f{float4 pos : SV_POSITION;float2 uv : TEXCOORD0; // _MainTexfloat3 worldNormal : TEXCOORD1;float3 worldPos : TEXCOORD2;#if UNITY_SHOULD_SAMPLE_SHhalf3 sh : TEXCOORD3; // SH#endif//切線空間需要使用的矩陣float3 tSpace0 : TEXCOORD4;float3 tSpace1 : TEXCOORD5;float3 tSpace2 : TEXCOORD6;UNITY_FOG_COORDS(7)UNITY_SHADOW_COORDS(8)};// vertex shaderv2f vert(appdata v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.uv.xy = TRANSFORM_TEX(v.texcoord, _MainTex);float3 worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;float3 worldNormal = UnityObjectToWorldNormal(v.normal);//世界空間下的切線half3 worldTangent = UnityObjectToWorldDir(v.tangent);//切線方向half tangentSign = v.tangent.w * unity_WorldTransformParams.w;//世界空間下的副切線half3 worldBinormal = cross(worldNormal, worldTangent) * tangentSign;//切線矩陣o.tSpace0 = float3(worldTangent.x, worldBinormal.x, worldNormal.x);o.tSpace1 = float3(worldTangent.y, worldBinormal.y, worldNormal.y);o.tSpace2 = float3(worldTangent.z, worldBinormal.z, worldNormal.z);o.worldPos.xyz = worldPos;o.worldNormal = worldNormal;// SH/ambient and vertex lights#if UNITY_SHOULD_SAMPLE_SH && !UNITY_SAMPLE_FULL_SH_PER_PIXELo.sh = 0;// Approximated illumination from non-important point lights#ifdef VERTEXLIGHT_ONo.sh += Shade4PointLights (unity_4LightPosX0, unity_4LightPosY0, unity_4LightPosZ0,unity_LightColor[0].rgb, unity_LightColor[1].rgb, unity_LightColor[2].rgb, unity_LightColor[3].rgb,unity_4LightAtten0, worldPos, worldNormal);#endifo.sh = ShadeSHPerVertex (worldNormal, o.sh);#endifUNITY_TRANSFER_LIGHTING(o, v.texcoord1.xy);UNITY_TRANSFER_FOG(o, o.pos); // pass fog coordinates to pixel shaderreturn o;}// fragment shaderfixed4 frag(v2f i) : SV_Target{UNITY_EXTRACT_FOG(i);float3 worldPos = i.worldPos.xyz;float3 worldViewDir = normalize(UnityWorldSpaceViewDir(worldPos));SurfaceOutputStandard o;UNITY_INITIALIZE_OUTPUT(SurfaceOutputStandard, o);fixed4 mainTex = tex2D(_MainTex, i.uv);o.Albedo = mainTex.rgb * _Color;o.Emission = 0.0;fixed4 metallicTex = tex2D(_MetallicTex, i.uv);o.Metallic = metallicTex.r * _Metallic;o.Smoothness = metallicTex.g * _Glossiness;o.Occlusion = metallicTex.b * _AO;o.Alpha = 1;half3 normalTex = UnpackNormal(tex2D(_NormalTex,i.uv));half3 worldNormal = half3(dot(i.tSpace0,normalTex),dot(i.tSpace1,normalTex),dot(i.tSpace2,normalTex));o.Normal = worldNormal;// compute lighting & shadowing factorUNITY_LIGHT_ATTENUATION(atten, i, worldPos)// Setup lighting environmentUnityGI gi;UNITY_INITIALIZE_OUTPUT(UnityGI, gi);gi.indirect.diffuse = 0;gi.indirect.specular = 0;gi.light.color = _LightColor0.rgb;gi.light.dir = _WorldSpaceLightPos0.xyz;// Call GI (lightmaps/SH/reflections) lighting functionUnityGIInput giInput;UNITY_INITIALIZE_OUTPUT(UnityGIInput, giInput);giInput.light = gi.light;giInput.worldPos = worldPos;giInput.worldViewDir = worldViewDir;giInput.atten = atten;#if defined(LIGHTMAP_ON) || defined(DYNAMICLIGHTMAP_ON)giInput.lightmapUV = IN.lmap;#elsegiInput.lightmapUV = 0.0;#endif#if UNITY_SHOULD_SAMPLE_SH && !UNITY_SAMPLE_FULL_SH_PER_PIXELgiInput.ambient = i.sh;#elsegiInput.ambient.rgb = 0.0;#endifgiInput.probeHDR[0] = unity_SpecCube0_HDR;giInput.probeHDR[1] = unity_SpecCube1_HDR;#if defined(UNITY_SPECCUBE_BLENDING) || defined(UNITY_SPECCUBE_BOX_PROJECTION)giInput.boxMin[0] = unity_SpecCube0_BoxMin; // .w holds lerp value for blending#endif#ifdef UNITY_SPECCUBE_BOX_PROJECTIONgiInput.boxMax[0] = unity_SpecCube0_BoxMax;giInput.probePosition[0] = unity_SpecCube0_ProbePosition;giInput.boxMax[1] = unity_SpecCube1_BoxMax;giInput.boxMin[1] = unity_SpecCube1_BoxMin;giInput.probePosition[1] = unity_SpecCube1_ProbePosition;#endifLightingStandard_GI(o, giInput, gi);// PBS的核心計算fixed4 c = LightingStandard(o, worldViewDir, gi);UNITY_APPLY_FOG(_unity_fogCoord, c); // apply fogUNITY_OPAQUE_ALPHA(c.a); //把c的Alpha置1return c;}ENDCG}}}

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

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

相關文章

基于Springboot+Vue選課系統

選課系統要求 (1)數據庫表:教師信息表、學生信息表、課程表、選課表 其中,教師信息表、學生信息表和選課表的數據需要提前設置,本題主要操作課程表 (2) 技術架構: 后臺使用springboot 前端使用vue-admin-template (3) 考試時間&…

鴻蒙(HarmonyOS)應用開發——安裝DevEco Studio安裝

前言 HarmonyOS華為開發的操作系統,旨在為多種設備提供統一的體驗。它采用了分布式架構,可以在多個設備上同時運行,提供更加流暢的連接和互動。HarmonyOS的目標是提供更高的安全性、更高效、響應更快的用戶體驗,并通過跨設備功能…

Vue3 響應式數據 reactive使用

ref 與 reactive 是 vue3 提供給我們用于創建響應式數據的兩個方法。 reactive 常用于創建引用數據,例如:object、array 等。 reactive 則是通過 proxy 來實現的響應式數據,并配合 reflect 操作的源對象。 reactive 創建引用數據&#xff1…

【實戰精選】掌握圖像風格遷移:構建基于生成對抗網絡的系統

1.研究背景與意義 隨著計算機技術的不斷發展,圖像處理和計算機視覺領域取得了長足的進步。圖像風格遷移是其中一個備受關注的研究方向,它可以將一幅圖像的風格特征應用到另一幅圖像上,從而創造出新的圖像。這項技術具有廣泛的應用前景&#…

lazada商品詳情數據接口(lazada.item_get)

Lazada商品詳情數據接口是Lazada電商平臺提供的一個API接口,用于獲取商品詳細信息。通過這個接口,開發者可以獲取Lazada平臺上商品的豐富信息,包括商品名稱、價格、庫存、描述、圖片等。這個接口使用RESTful風格,并通過HTTP協議進…

經過了多少輪洗牌后,序列中間位置的牌面為9 ← random.shuffle()

【題目描述】 有牌面為1~9的撲克牌,現在進行洗牌,并存于一個序列中。 請輸出經過了多少輪洗牌后,序列中間位置的牌面為9。【算法分析】 Python 中使用 random 模塊中的 shuffle 函數,可隨意排列列表中的元素。 本題中的輸出&#…

【基礎知識】AB軟件RSLinx的版本說明

哈嘍,大家好,我是雷工! 之前對AB的軟件了解比較少,在工作中未接觸過,最近一次現場勘察時,有很多中控系統都是AB的,借此機會對AB軟件有了些許了解。 一、RSLinx是什么軟件? RSLinx是…

fork介紹,返回值問題,寫時拷貝,進程切換,子進程開始執行的位置,子進程的用途

目錄 fork 介紹 fork的返回值問題 介紹 fork()時,系統要做什么 數據是否要獨立 如果共享的話,就會出現問題! 寫時拷貝 引入 介紹 舉例(fork返回值) fork返回的值是什么 創建失敗的原因 子進程執行位置從哪里開始 引入 進程切換 子進程執行的位置 子進程的…

燙傷事件屢有發生,覓光推脫責任,稱是用戶操作失誤

提及“雙十一”“直播間”等關鍵詞,人們常常將其與“低價”“薅羊毛”等字眼掛鉤。而在近日,科技美容品牌AMIRO覓光(下稱“覓光”)卻上演了一出“反向薅羊毛”的戲碼,因線上線下渠道相差超千元的價格差飽受爭議。 自橫…

camera-caps:Jetson設備上的一種實用的V4L2可視化界面

camera-caps:Jetson設備上的一種實用的V4L2可視化界面 github地址是: https://github.com/jetsonhacks/camera-caps 注意:Jetpack5.x需要選擇tag 5.x版本

走迷宮(BFS寬度優先搜索)

給定一個 nm 的二維整數數組,用來表示一個迷宮,數組中只包含 0 或 1,其中 0 表示可以走的路,1 表示不可通過的墻壁。 最初,有一個人位于左上角 (1,1)處,已知該人每次可以向上、下、左、右任意一個方向移動…

MySQL數據庫約束你真的懂嗎?

??????今天給各位帶來的是關于數據庫約束方面的知識 清風的CSDN博客 😛😛😛希望我的文章能對你有所幫助,有不足的地方還請各位看官多多指教,大家一起學習交流! 動動你們發財的小手,點點關…

JMeter接口測試之文件上傳

最近用JMeter做接口測試,頻繁遇到了文件上傳的接口,與其他一般接口的處理方式不一樣,想著分享下,希望能給測試同學一點啟發。 文章將圍繞三個部分進行展開: 一、用戶場景 二、接口請求參數 三、JMeter腳本編寫步驟…

C語言每日一題(36)隊列實現棧功能

力扣 225 用隊列實現棧 題目描述 請你僅使用兩個隊列實現一個后入先出(LIFO)的棧,并支持普通棧的全部四種操作(push、top、pop 和 empty)。 實現 MyStack 類: void push(int x) 將元素 x 壓入棧頂。int…

vue2系列 — 自定義指令

https://v2.cn.vuejs.org/v2/guide/custom-directive.html <div v-example:foo.bar"baz">vue 自定義指令的鉤子 bind&#xff1a; 當 v-XXX 指令綁定到節點上時 觸發inserted&#xff1a;被綁定元素插入父節點時調用update&#xff1a;所在組件的 VNode 更新…

使用nprogress實現請求進度條

一、安裝nprogress npm i nprogress 二、 在axios的請求攔截器中使用nprogress 如果對于axios的請求和響應攔截器的使用不了解的&#xff0c;可以看這篇文章&#xff1a; axios二次封裝配置請求攔截器和響應攔截器-CSDN博客 nprogress上有兩個有用的方法&#xff1a; star(…

OpenStack云計算平臺-Dashboard(圖形化)

目錄 一、安裝和配置 1、安全并配置組件 2、完成安裝 ?二、驗證操作 一、安裝和配置 1、安全并配置組件 安裝軟件包&#xff1a; yum install openstack-dashboard 編輯文件 vim /etc/openstack-dashboard/local_settings vim /etc/httpd/conf.d/openstack-dashboard.…

如何用Python爬取全國高校數據?

前言 Python是一門強大的編程語言&#xff0c;它可以用于爬取互聯網上的各種數據。在這篇文章中&#xff0c;我們將學習如何使用Python爬取全國高校數據&#xff0c;并使用代理IP進行爬取。 本文主要分為以下幾個部分&#xff1a; 數據來源及需求安裝依賴包及導入模塊爬取全…

關于禪道的安裝配置以及項目管理、團隊協同工作

目錄 一、禪道是什么&#xff1f; 二、特點和功能 三、安裝禪道 3.1 下載官網 3.2 版本考慮 3.3 禪道使用手冊參考 3.4 Windows端安裝禪道 四、啟動禪道 4.1 訪問禪道 四、禪道部分功能的使用 4.1 添加項目集 4.2 啟動/關閉項目 4.3 項目計劃儀表盤/階段目標/研發…