Unity Shader - Shader Compilation Target Levels 着色器编译目标级别

目录:Unity Shader - 知识点目录(先占位,后续持续更新)
原文:Shader Compilation Target Levels
版本:2019.1

Shader Compilation Target Levels

着色器编译目标级别

当编写Surface Shaders表面着色器或常规Shader Programs着色器程序时,HLSL源代码可以编译成不同的“着色器模型”。为了允许使用更现代的GPU功能,您必须使用更高的着色器编译目标。

注意:使用更高的着色器编译目标,可能使着色器不能在旧的GPU或平台上工作。

指定编译目标通过使用 #pragma target name 指令或是指定 #pragma require feature 指令。例如:

#pragma target 3.5
#pragma require integers 2darray instancing

Default copilation target

默认的编译目标

Unity默认将着色器编译成最低支持目标(2.5);介于DirectX着色器模型2.0和3.0之间。其他一些编译指令使着色器自动编译成更高的目标:

  • 使用几何着色器(#pragma geometry)将会设置编译目标为 4.0
  • 使用曲面细分着色器(#pragma hullpragma domain)将会设置编译目标为 4.6

任何着色器如果没有通过 #pragma 为几何体、外壳或域着色器明确的设置函数入口点,都将降低内部着色器的能力要求。这将让着色器在更多的非DX11平台都可以兼容工作。

例如,Unity支持在Metal图形平台上曲面细分着色器,但Metal不支持几何着色器。使用 #pragma target t.0 还是有效的,只要你不使用几何着色器。

Supported ‘#pragma tarrget’ names

支持的 ‘#pragma target’ names的目标着色器模型

这儿有一些可支持的着色器模型列表,可以提升一些兼容性(在某些情况下需要更高的平台/GPU):

#pragma target 2.0

  • Unity所有平台都支持。DX9着色器模型2.0。
  • 有限数量的算术和纹理指令;8个插值器;没有顶点阶段纹理采样;片段着色器中没有导数
    ;没有显式的LOD纹理采样。

#pragma target 2.5(efault)

  • 几乎与3.0 目标模型一样(往下看),除了仍然只有8个插值器,没有显式的LOD纹理采样。
  • 在Windows Phone平台上编译到DX11特性级别9.3的。

#pragma target 3.0

  • DX9着色器模型3.0:导数指令,LOD纹理采样,10个插值器,更多的数学/纹理指令。
  • 不支持DX11特性界别9.x GPU(例如,多数的Windows Phone设备)。
  • 在一些OpenGL ES 2.0设备不完全支持,这取决于当前的驱动程序扩展和所使用的特性。

#pragma target 3.5(or es3.0)

  • OpenGL ES 3.0的功能(在D3D平台的DX10 SM4.0,仅仅是没有几何着色器)。
  • 不支持DX11 9.X(WinPhone),OpenGL ES 2.0。
  • 支持DX11+,OpenGL 3.2+,OpenGL ES 3+,Metal,Vulkan,PS4/XB1 游戏主机。
  • 着色器原生整形操作,纹理数组,等。

#pragma target 4.0

  • DX11 SM 4.0。
  • 不支持DX11 9.X(WinPhone),OpenGL ES 2.0/3.0/3.1,Metal。
  • 支持DX11+,OpenGL 3.2+,OpenGL ES 3.1+AEP,Vulkan,PS4/XB1 游戏主机。拥有几何着色器和所有es3.0目标的。

#pragma target 4.5(or es3.1)

  • OpenGL ES 3.1的功能(在D3D平台的DX11 SM5.0,仅仅没有曲面细分着色器)。
  • 在SM5.0前不支持DX11,OpenGL 4.3前(例如:Mac),OpenGL ES 2.0/3.0。
  • 支持DX11+SM5.0,OpenGL 4.3+,OpenGL ES 3.1,Metal,Vulkan,PS/XB1 游戏主机。
  • 有用通用计算着色器,司机访问纹理些,原子操作,等。没有几何,曲面细分着色器。

#pragma target 4.6(oor gl4.1)

  • OpenGL 4.1的功能(在D3D平台的DX11 SM5.0,仅仅没有通用计算着色器)。这基本上是Mac上支持的最高OpenGL。
  • 在SM5.0前不支持DX11,4.1前不支持OpenGL,OpenGL ES 2.0/3.0/3.1,Metal。
  • 支持DX11+SM5.0,OpenGL 4.1+,OpenGL ES 3.1+AEP,Vulkan,Metal(没有几何着色器),PS4/XB1 游戏主机。

#pragma target 5.0

  • DX11 着色器模型5.0。
  • 在SM5.0前不支持DX11,4.3前不支持OpenGL(例如:Mac),OpenGL ES 2.0/3.0/3.1,Metal。
  • 支持DX11+SM5.0,OpenGL 4.3+,OpenGL ES 3.1+AEP,Vulkan,Metal(没有几何着色器),PS4/XB1 游戏主机。

注意所有OpenGL类平台(包括移动平台的)都将会被看作是“SM3.0”。WP8/WinRT 平台(DX11特性级别9.x)被看作是SM2.5。

Supported ‘#pragma require’ names

支持的’#pragma require’ names

下面是支持的一些 #pragma require 指令列表:

  • interpolators10:至少10个顶点到片段的插值器可用。
  • interpolators15:至少15个。
  • interpolatoors32:至少32个。
  • mrt4:多渲染目标,至少4个。
  • mrt8:多渲染目标,至少8个。
  • derivatives:像素着色器导数指令(ddx/ddy)。
  • sampledlod:显式的纹理LOD采样(tex2Dlod / SampleLevel)。
  • fragcoord:像素着色器中的输入像素定位信息(屏幕上的XY,裁剪空间的ZW深度)
  • integers:整数是一种实际的数据类型,包括位/移位操作。
  • 2darray:2D纹理数组(Texture2DArray)。
  • cubearray:Cubemap数组(CubemapArray)。
  • instancing:SV_InstanceID 将会输入到系统值中(System Value: SV)。
  • geometry:DX10 几何着色器。
  • compute:通用计算着色器,结构缓存,原子操作。
  • randomwrite:“random write”(UAV)纹理。
  • tesshw:GPU硬件曲面细分的支持,但不需要曲面细分的shader阶段(例如,Metal支持曲面细分,但不是通过shader阶段处理的)。
  • tessellation:曲面细分 外壳/域 着色器阶段。
  • msaatex:可以访问多采样纹理(HLSL中的Texture2DMS)。(MS:Multi-Sampled)
  • sparsetex:带有居住信息的稀疏纹理(这个直译,没动这个是什么,以后再说)("Tier2"项在D3D中支持;CheckAccessFullMapped HLSL函数)。注意当前仅仅在DX11/12有实现。
  • framebufferfetch:帧缓存抓取 - 可以读取在像素着色器中输入的像素颜色。

多数的 #pragma targete 指令都是上述要求的缩写 (#pragma require指令集的缩写),它们对应于:

  • 2.5:derivatives(偏导数)
  • 3.0:2.5 + interpolators10 + samplelod + fragcoord(在2.5基础上,添加10个插值器,load采样器,雾化坐标)
  • 3.5:3.0 + interploator15 + mrt4 + integers + 2darray + instancing(3.0上添加15个插值器,4个mrt(multiple render target),整数,2d纹理数组,数据实例)
  • 4.0:3.5 + geometry(3.5上添加了几何着色器)
  • 5.0:4.0 + compute + randomwrite + tesshw + tessellation(4.0上添加通用计算着色器,随机写入,硬件的曲面细分,外壳/域着色器的曲面细分)
  • 4.5:3.5 + compute + randomwrite(3.5上添加通用着色器,随机写入)
  • 4.6:4.0 + cubearray + tesshw +tessellation(4.0上添加cube纹理数组,硬件的曲面细分,外壳/域着色器的曲面细分)

注意在Direct3D的着色器模型4.0也有"mrt8"(8个mrt));着色器5.0有"interpolators32"(32个插值器)和"cubearray"(cube纹理数组)。当时,在多数的移动平台上不保证都是有效可用的。所以需要带上向后兼容的shader,写上 #pragma target 4.0 指令不会自动带上8 MRT的支持,#pragma target 5.0不会自动带上32个插值器,也不会自动带上cubemap数组。

See Also

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity Shader是一种用于在Unity引擎中创建和控制图形渲染效果的编程语言。通过使用Unity Shader,开发人员可以自定义游戏中各种物体的外观和行为,从而实现更加逼真和出色的视觉效果。 而热图(Heatmap)是一种用于显示某个区域内物体热度分布的视觉化工具。在游戏开发中,热图通常用于统计和分析玩家在游戏中的行为和偏好,以便开发人员可以根据这些数据进行游戏优化和改进。 为了创建一个热图效果,我们可以使用Unity Shader来实现。首先,我们需要将游戏中各个物体按照玩家与其的互动情况和频率进行区分,不同的行为和频率可以对应不同的颜色或者纹理。接着,我们可以在Shader中根据这些信息来着色和渲染物体,以展示物体的热度分布。 在Shader中,我们可以通过为物体添加一张热图纹理,并使用该纹理来表示物体的热度值。热图纹理可以是一张灰度图,不同的灰度值对应不同的热度。然后,我们可以使用纹理坐标和采样操作来获取每个像素对应的热度值,并根据这些值来着色和渲染物体。 除了使用纹理来表示热度分布,我们还可以使用其他的技术和效果来增强热图的可视化效果。例如,我们可以使用颜色渐变和透明度来形成平滑的过渡效果,以更好地显示物体的热度变化。我们还可以添加动画效果,使热图效果更加生动和有趣。 总结而言,Unity Shader可以用于创建热图效果,通过着色和渲染来展示物体的热度分布。这样的热图可以帮助开发人员分析游戏中玩家的行为和偏好,从而优化和改进游戏的设计和内容。这些热图效果能够增强游戏的可视化效果,并提供有价值的数据供开发人员参考。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值