zoukankan      html  css  js  c++  java
  • 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 colors
      float4 _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))
            ...
  • 相关阅读:
    实验三:Linux进程管理(HDU)
    ORA-25153错误及解决办法
    Python中的next()iter()函数详解
    python基础_格式化输出(%用法和format用法)(转载)
    DataTable ---导出Excel
    gridview-
    Web-Web/Json的请求与返回
    Sql-事务
    Windows-远程桌面
    Dev-GridView-对于gridview的列值的合计
  • 原文地址:https://www.cnblogs.com/sifenkesi/p/4707991.html
Copyright © 2011-2022 走看看