網(wǎng)站開發(fā) 方案如何注冊網(wǎng)站怎么注冊
文章目錄
- 前言
- 一、在Shader中使用轉(zhuǎn)化矩陣
- 1、在頂點著色器中定義轉(zhuǎn)化矩陣
- 2、用 UNITY_NEAR_CLIP_VALUE 區(qū)分平臺矩陣
- 3、定義一個枚舉用于區(qū)分當(dāng)前是處于什么相機(jī)
- 二、我們在DirectX平臺下,看看效果
- 1、正交相機(jī)下
- 2、透視相機(jī)下
- 3、最終代碼
前言
在上一篇文章中,我們推導(dǎo)得出了 透視相機(jī)到裁剪空間的轉(zhuǎn)化矩陣
- Unity中Shader裁剪空間推導(dǎo)(透視相機(jī)到裁剪空間的轉(zhuǎn)化矩陣)
我們在正交矩陣Shader的基礎(chǔ)上,繼續(xù)測試
- Unity中Shader裁剪空間推導(dǎo)(在Shader中實現(xiàn))
在這篇文章中,我們在Shader中使用該矩陣測試一下。
- OpenGL
[ 2 n w 0 0 0 0 2 n h 0 0 0 0 n + f n ? f 2 n f n ? f 0 0 ? 1 0 ] \begin{bmatrix} \frac{2n}{w} & 0 & 0 & 0 \\ 0 & \frac{2n}{h} & 0 &0\\ 0 & 0 & \frac{n+f}{n-f} &\frac{2nf}{n-f}\\ 0 & 0 & -1 & 0\\ \end{bmatrix} ?w2n?000?0h2n?00?00n?fn+f??1?00n?f2nf?0? ? - DirectX
[ 2 n w 0 0 0 0 2 n h 0 0 0 0 n f ? n n f f ? n 0 0 ? 1 0 ] \begin{bmatrix} \frac{2n}{w} & 0 & 0 & 0 \\ 0 & \frac{2n}{h} & 0 &0\\ 0 & 0 & \frac{n}{f-n} &\frac{nf}{f-n}\\ 0 & 0 & -1 & 0\\ \end{bmatrix} ?w2n?000?0h2n?00?00f?nn??1?00f?nnf?0? ?
一、在Shader中使用轉(zhuǎn)化矩陣
1、在頂點著色器中定義轉(zhuǎn)化矩陣
- OpenGL:
M_clipP = float4x4
(
2n/w,0,0,0,
0,2n/h,0,0,
0,0,(n+f)/(n-f),(2nf)/(n-f),
0,0,-1,0
);
- DirectX:
M_clipP = float4x4
(
2n/w,0,0,0,
0,2n/h,0,0,
0,0,n/(f-n),(n*f)/(f-n),
0,0,-1,0
);
2、用 UNITY_NEAR_CLIP_VALUE 區(qū)分平臺矩陣
- 1為OpenGL
- -1為DirectX
3、定義一個枚舉用于區(qū)分當(dāng)前是處于什么相機(jī)
[Enum(OrthoGraphic,0,Perspective,1)]_CameraType(“CameraType”,Float) = 0
- 在手動轉(zhuǎn)化矩陣時使用三目運(yùn)算符來決定使用哪一個矩陣
float4x4 M_clip = _CameraType ? M_clipP : M_clipO;
o.vertexCS = mul(M_clip,float4(vertexVS,1));
二、我們在DirectX平臺下,看看效果
1、正交相機(jī)下
2、透視相機(jī)下
3、最終代碼
//平移變換
//縮放變換
//旋轉(zhuǎn)變換(四維)
//視圖空間矩陣
//正交相機(jī)視圖空間 -> 裁剪空間
Shader "MyShader/URP/P3_7_6"
{Properties{[Header(MainTexx)]_MainTex("MainTex",2D) = "white"{}[Header(Transtion)]_Translate("Translate(XYZ)",Vector) = (0,0,0,0)_Scale("Scale(XYZ)",Vector)= (1,1,1,1)_Rotation("Rotation(XYZ)",Vector) = (0,0,0,0)[Header(View)]_ViewPos("View Pos",vector) = (0,0,0,0)_ViewTarget("View Target",vector) = (0,0,0,0)[Header(Camera)]_CameraParams("Size(X),Near(Y),Far(Z) Ratio(W)",Vector) = (0,0,0,1.777)[Enum(OrthoGraphic,0,Perspective,1)]_CameraType("CameraType",Float) = 0}SubShader{Tags{"PenderPipeline"="UniversalPipeline""RenderType"="Opaque""Queue"="Geometry"}Pass{HLSLPROGRAM#pragma vertex vert#pragma fragment frag#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"struct Attribute{float4 vertexOS : POSITION;float2 uv : TEXCOORD0;};struct Varying{float4 vertexCS : SV_POSITION;float2 uv : TEXCOORD0;};CBUFFER_START(UnityPerMaterial)float4 _Translate;float4 _Scale;float4 _Rotation;float4 _ViewPos;float4 _ViewTarget;float4 _CameraParams;float _CameraType;CBUFFER_ENDTEXTURE2D(_MainTex);SAMPLER(sampler_MainTex);Varying vert (Attribute v){Varying o;o.uv = v.uv;//平移變換float4x4 M_Translate = float4x4(1,0,0,_Translate.x,0,1,0,_Translate.y,0,0,1,_Translate.z,0,0,0,1);v.vertexOS = mul(M_Translate,v.vertexOS);//縮放交換float4x4 M_Scale = float4x4(_Scale.x,0,0,0,0,_Scale.y,0,0,0,0,_Scale.z,0,0,0,0,1);v.vertexOS = mul(M_Scale,v.vertexOS);//旋轉(zhuǎn)變換float4x4 M_rotateX = float4x4(1,0,0,0,0,cos(_Rotation.x),sin(_Rotation.x),0,0,-sin(_Rotation.x),cos(_Rotation.x),0,0,0,0,1);float4x4 M_rotateY = float4x4(cos(_Rotation.y),0,sin(_Rotation.y),0,0,1,0,0,-sin(_Rotation.y),0,cos(_Rotation.y),0,0,0,0,1);float4x4 M_rotateZ = float4x4(cos(_Rotation.z),sin(_Rotation.z),0,0,-sin(_Rotation.z),cos(_Rotation.z),0,0,0,0,1,0,0,0,0,1);v.vertexOS = mul(M_rotateX,v.vertexOS);v.vertexOS = mul(M_rotateY,v.vertexOS);v.vertexOS = mul(M_rotateZ,v.vertexOS);//觀察空間矩陣推導(dǎo)//P_view = [W_view] * P_world//P_view = [V_world]^-1 * P_world//P_view = [V_world]^T * P_worldfloat3 ViewZ = normalize(_ViewPos.xyz - _ViewTarget.xyz);float3 ViewY = float3(0,1,0);float3 ViewX = cross(ViewZ,ViewY);ViewY = cross(ViewX,ViewZ);float4x4 M_viewTemp = float4x4(ViewX.x,ViewX.y,ViewX.z,0,ViewY.x,ViewY.y,ViewY.z,0,ViewZ.x,ViewZ.y,ViewZ.z,0,0,0,0,1);float4x4 M_viewTranslate = float4x4(1,0,0,-_ViewPos.x,0,1,0,-_ViewPos.y,0,0,1,-_ViewPos.z,0,0,0,1);float4x4 M_view = mul(M_viewTemp,M_viewTranslate);float3 vertexWS = TransformObjectToWorld(v.vertexOS.xyz);//世界空間轉(zhuǎn)化到觀察空間float3 vertexVS = mul(M_view,float4(vertexWS,1)).xyz;//相機(jī)參數(shù)float h = _CameraParams.x * 2;float w = h * _CameraParams.w;float n = _CameraParams.y;float f = _CameraParams.z;//正交相機(jī)投影矩陣//P_Clip = [M_Clip] * P_viewfloat4x4 M_clipO;if(UNITY_NEAR_CLIP_VALUE==-1){//OpenGLM_clipO = float4x4(2/w,0,0,0,0,2/h,0,0,0,0,2/(n - f),(n + f) / (n - f),0,0,0,1);}if(UNITY_NEAR_CLIP_VALUE==1){//DirectXM_clipO = float4x4(2/w,0,0,0,0,2/h,0,0,0,0,1/(f-n),f/(f-n),0,0,0,1);}//透視相機(jī)投影矩陣float4x4 M_clipP;if(UNITY_NEAR_CLIP_VALUE==-1){//OpenGLM_clipP = float4x4(2*n/w,0,0,0,0,2*n/h,0,0,0,0,(n+f)/(n-f),(2*n*f)/(n-f),0,0,-1,0);}if(UNITY_NEAR_CLIP_VALUE==1){//DirectXM_clipP = float4x4(2*n/w,0,0,0,0,2*n/h,0,0,0,0,n/(f-n),(n*f)/(f-n),0,0,-1,0);}//手動將觀察空間下的坐標(biāo)轉(zhuǎn)換到裁剪空間下float4x4 M_clip = _CameraType ? M_clipP : M_clipO;o.vertexCS = mul(M_clip,float4(vertexVS,1));//觀察空間 轉(zhuǎn)化到 齊次裁剪空間//o.vertexCS = TransformWViewToHClip(vertexVS);//o.vertexCS = TransformObjectToHClip(v.vertexOS.xyz);return o;}half4 frag (Varying i) : SV_Target{float4 mainTex = SAMPLE_TEXTURE2D(_MainTex,sampler_MainTex,i.uv);return mainTex;}ENDHLSL}}
}