日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Vertex and Fragment Shader

發布時間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Vertex and Fragment Shader 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Semantics語義詞:
  定義:GPU工作時,數據通常暫存在寄存器,那么在Cg中,語義詞就指定了輸入/輸出數據和圖形硬件寄存器之間的映射關系。
  原理:根據輸入語義,圖形處理器從某個寄存器取數據;然后再將處理好的數據,根據輸出語義,放到指定的寄存器。
     ?VS中綁定語義的輸出數據會傳遞到PS中綁定相同語義的輸入參數。
     ?語義只對VS和PS入口函數的輸入/輸出參數有意義,是VS/PS輸入輸出和寄存器之間的橋梁。
  VS輸入語義詞:POSITION BLENDWEIGHT NORMAL TANGENT BINORMAL PSIZE BLENDINDICES TEXCOORD0-TEXCOORD7
  VS輸出語義:POSITION PSIZE FOG COLOR0-COLOR1 TEXCOORD0-TEXCOORD7
        ?VS的輸出中必須包含POSITION語義變量,該值不能在PS中直接使用,它只被用于光柵化。
        ?VS的輸出中的自定義數據可以使用TEXCOORD系列的語義詞來表示。
  PS輸入語義詞:除POSITION外,VS的輸出語義,也是VP的輸入語義
  PS輸出語義:通常只有一個輸出COLOR,最終顏色值。

VS輸入參數的定義:
  VS的輸入參數可以是通用類型appdata_base,也可以是自定義結構體,并在其中指定需要的參數。
  [UnityGC.cginc]VS預定義輸入參數:
    appdata_base:包含頂點的position、normal、one texture coordinate
    appdata_tan:包含頂點的position、tangent、normal、one texture coordinate
    appdata_full:包含頂點的position、tangent、normal、tow texture coordinate、color
  自定義輸入結構示例:

  struct vertexInput {float4 vertex : POSITION;float4 texcoord0 : TEXCOORD0;fixed4 color : COLOR;};

  Unity中,頂點只能包含以下這些數據,所以自定義輸入結構中的成員也必須在此范圍內(具體類型可以不一樣,比如fixed4 color):
  float4 vertex/float3 normal/float4 texcoord/float4 texcoord1/float4 tangent/float4 color
  注意:其中沒有副法向量binoraml,它可以通過noraml和tangent計算得出來,公式如下所示:

// binormal的計算公式float3 binormal = cross( v.normal, v.tangent.xyz ) * v.tangent.w;

Cg訪問屬性定義:
  Cg訪問Properties塊中定義的變量的方式:聲明同名并匹配類型的變量。
    Color/Vector --> float4/half4/fixed4
    Range/Float --> float/half/fixed
    2D --> sampler2D
    3D --> sampler3D
    Cube --> samplerCUBE
  可以看下面的例子:
  屬性:

  _MyColor ("Some Color", Color) = (1,1,1,1) _MyVector ("Some Vector", Vector) = (0,0,0,0) _MyFloat ("My float", Float) = 0.5 _MyTexture ("Texture", 2D) = "white" {} _MyCubemap ("Cubemap", CUBE) = "" {}

  Cg變量:

  fixed4 _MyColor; // low precision type is enough for colorsfloat4 _MyVector;float _MyFloat; sampler2D _MyTexture;samplerCUBE _MyCubemap

  shader中的Cg片段會被Unity編輯器編譯成low-level shader assembly,并被包含在生成的版本的data files里面。因為Cg片段需要被預編譯,所以不能在運行時動態創建Cg shader。
  #pragma glsl_no_auto_normalization 當給移動平臺編譯GLSL時,不自動normalize法向量和切線向量。在IOS/Android平臺,noramls和tangents會在vertex shader中自動noramize。
  #pragma exclude_renderers d3d11 xbox360 在DX11和Xbox360平臺上不渲染

常用預定義和Cg函數:
  [Cg]采樣2dtexture: tex2D(_MainTex, i.texcoord0);
  [Cg]frac函數:取小數部分
  [Cg]any函數:輸入參數只要有其中一個不為0,則返回true
  [Cg]saturate函數:如果小于0則返回0,如果大于1則返回1,否則返回原值
  [Cg]語義詞VPOS表示像素的屏幕坐標,至少需要支持target 3.0。
  [UnityCG.cginc]_ScreenParam表示屏幕的寬和高。
  [UnityCG.cginc]ComputeScreenPos(MVP_pos)該函數返回像素的屏幕坐標,不需要target 3.0的支持。

一些代碼片段:

  // 3D坐標轉換到2D Window坐標return mul(UNITY_MATRIX_MVP, v.vertex); // 計算像素的屏幕坐標 方法一 vertOut vert(appdata_base v) {vertOut o;o.pos = mul (UNITY_MATRIX_MVP, v.vertex);o.scrPos = ComputeScreenPos(o.pos);return o;// PS中轉化[0-1]:float2 wcoord = (i.scrPos.xy/i.scrPos.w); }// 計算像素的屏幕坐標 方法二 fixed4 frag(float4 sp:VPOS) : SV_Target {float2 wcoord = sp.xy/_ScreenParams.xy;...}// 判斷uv是否在[0-1]返回內,可用來做uv檢查if (any(saturate(i.uv) - i.uv))...

?

轉載于:https://www.cnblogs.com/sifenkesi/p/4707991.html

總結

以上是生活随笔為你收集整理的Vertex and Fragment Shader的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。