• Unity Shader:(五)语义、Debug、规范


    一、语义

    1. a2v 语义(a代表应用阶段,v代表顶点着色器)

    POSITION:float4类型,模型空间中顶点的位置。

    NORMAL:float3类型,顶点法线。

    TANGENT:float4类型,顶点切线。

    TEXCOORDn:float2/float4类型,顶点纹理坐标。

    COLOR:fixed4/float4类型,顶点颜色。

    2. v2f 语义(f代表片元着色器)

    SV_POSITION:结构体中必须使用,裁剪空间中的顶点坐标。

    COLOR0:输出第一组顶点颜色

    COLOR1:输出第二组顶点颜色

    TEXCOORD0~TEXCOORD7:输出纹理坐标

    3. f 语义

    SV_Target:输出值会存储到渲染目标中

    二、Debug

    1. 用appdata_full输出结果

    #include "UnityCG.cginc"

    struct appdata_full

    {

      float4 vertex: POSITION;

      float4 tangent: TANGENT;

      float3 normal: NORMAL;

      float4 texcoord: TEXCOORD0;

      float4 texcoord1: TEXCOORD1;

      float4 texcoord2: TEXCOORD2;

      float4 texcoord3: TEXCOORD3;

    #if defined(SHADER_API_XBOX360)

      half4 texcoord4: TEXCOORD4;

      half4 texcoord5: TEXCOORD5;

    #endif

      fixed4 color: COLOR

    }

    2. VS提供的Graphics Debugger工具。

    3. Unity提供的帧调试器 (路径:Window->Frame Debugger)。

    三、规范

    1. 优先选择低精度浮点值

    float是最高精度浮点值,通常是32位;half通常16位(-6W~6W);fixed通常11位(-2.0~2.0)

    尽可能使用精度较低的类型:颜色和单位矢量用fixed类型,更大范围的用half类型,最后才选择float类型。

    这个差距在移动平台尤其明显,所以一定要在移动平台测试效果。

    2. 减少计算量

    错误提示:temporary register limit of 8 exceeded

    错误提示:Arithmetic instruction limit of 64 exceeded; 65 arithmetic instructions needed to compile program

    原因是计算量超过了临时寄存器数目或指令数目。我们可以通过制定更高等级的Shader Target来解决。但是最好还是减少计算量。

    #pragma target 2.0  默认,不支持顶点纹理采样,不支持LOD纹理采样

    #pragma target 3.0 支持顶点纹理采样

    #pragma target 4.0 支持几何着色器

    #pragma target 5.0 

    3. 不使用分支和循环语句

    GPU里计算分支、循环语句的计算量不同于CPU,性能会成倍下降。

    就算非得使用,尽量把放在片元着色器的计算放在顶点着色器中,或者直接在CPU中预计算再把结果传给Shader。

  • 相关阅读:
    Delphi防止同时出现多个应用程序实例CreateMutex
    DLL注入代码
    DLL注入代码
    C语言学习笔记
    随笔
    存储器简介
    随笔
    对偶问题的基本性质
    C语言学习笔记
    对偶问题的基本性质
  • 原文地址:https://www.cnblogs.com/tomatokely/p/15882762.html
Copyright © 2020-2023  润新知