java3d 上色_Unity 着色过程
圖形API包括:OpenGL、Metal、Vulkan、Director3D。
渲染管線(圖形管線)通用結構:
1、數據收集(圖形的網格、紋理、材質)--------2、頂點著色器(獲取圖形的2D坐標)----------3、頂點的后處理(頂點的坐標變換、圖形基元的裁剪,其實就是將不會在屏幕顯示的部分裁剪掉)
--------4、圖形基元的收集----------5、柵格化(不可編程階段、接受三角形及其數據、形成潛在的像素-片源)-----------6、片源著色器----------7、輸出合并檢查
柵格化器:決定三角形覆蓋了那些圖像
無光照著色器的結構:
頂點數據收集到appdata結構體------頂點函數(Vertex Shader)--------頂點到片源(v2f struct)--------片源函數(Fragment Shader)-------最終顏色
appdata結構體:獲取頂點的位置或者其他信息
structappdata
{
float4 vertex : POSITION;
};
頂點函數:將頂點數據轉化為柵格化器可以處理的數據
v2f vert (appdata v)
{
v2f o;
o.vertex=UnityObjectToClipPos(v.vertex);returno;
}
片源數據結構體:
structv2f
{
float4 vertex : SV_POSITION;
};
片源函數:
fixed4 frag (v2f i) : SV_Target
{return_Color;
}
坐標空間:
對象空間、世界空間、相機空間、裁剪空間、標準化設備坐標、屏幕空間;
對象空間:頂點位置處于對象空間;
世界空間:Transform使用的空間是世界空間;
相機空間:照相機拍攝的空間;
裁剪空間:將任何不在裁剪空間的圖形基元裁剪掉,變化范圍[-1,1],四維坐標其中的w軸用來解決兩個平行線相交的問題,來決定是否被裁剪掉。
標準化設備坐標:2D空間,但是使用了3個值,z軸分量用于深度緩存。
屏幕空間:將NPC轉換為適合于屏幕的空間。
坐標空間的相互轉換:
比如從對象空間轉化為世界空間,可以通過一些Unity內置的函數實現:
float3 UnityObjectToWorldDir(int float3 Dir)? ? ? ? ? ? ?對象空間的光線轉化到世界空間
float3 UnityObjectToWorldNormal(int float3 norm)? 對象空間的法向量轉化到世界空間
通過內置的矩陣可以實現將模型在對象空間的頂點位置轉化到世界空間,這樣的矩陣比如:unity_ObjectToWorld、unity_WorldToObject、unity_WorldToCamera,具體是通過mul函數實現:
float4 vertexWorld=mul(unity_ObjectToWorld,v.vertex);
內置函數的底層實現:
v2f vert (appdata v)
{
v2f o;
o.vertex=UnityObjectToClipPos(v.vertex);returno;
}
其實函數UnityObjectToClipPos()=mul(UNITY_MATRIX_MVP,*),MVP矩陣代表Matrix*View Matrix*Projection Matrix的矩陣乘法
總結
以上是生活随笔為你收集整理的java3d 上色_Unity 着色过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java堆排序递归_大顶堆第二弹----
- 下一篇: java系统反应慢怎么解决_为什么反应慢