编写顶点片段shader
原文链接:https://docs.unity3d.com/Manual/SL-ShaderPrograms.html
ShaderLab shader 不仅仅包含硬件shader。它们做了很多事情。它们描述了显示在材质面板的属性,包含多个shader对于不同图形硬件的实现,配置固定方法硬件状态等等。实际的可编程的shader,比如顶点片段编程,只是整个ShaderLab shader概念的一部分。看一看shader教程(链接见原网页)得到一个基础的介绍。这里我们将调用低级硬件shader的shader程序。
如果你想写一个与光照交互的shader,看一下表面shader的文档。有关示例,看一下定点片段shader的例子。本篇文章呈现的其他shader不与Unity光照交互(比如说特殊效果,后处理效果等等)。shader编程被写在HLSL语言中,通过在shader文本中植入片段,在pass命令中的某处。它们经常看起来像这样:
Pass {
// ... the usual pass state setup ...
CGPROGRAM
// compilation directives for this snippet, e.g.:
#pragma vertex vert
#pragma fragment frag
// the Cg/HLSL code itself
ENDCG
// ... the rest of pass setup ...
}
HLSL片段
HLSL是写在CGPROGRAM和ENDCG关键词之间的, 或者是换成写在HLSLPROGRAM和ENDHLSL关键词之间的程序片段。后一种形式不会自动包含HLSL支持和Unityshader变量内置头文件。
在代码片段的开头,编译指令可以被作为#pragma语句给出。指令声明哪个shader方法将被编译:
·#pragma vertex 名字-作为顶点shader编译的函数名。
·#pragma fragment 名字-作为片段shader编译的函数名。
·#pragma geometry 名字-作为DX10几何着色器的函数名。有这个选项将自动切换到#pragma target 4.0,如下所述。
·#pragma hull 名字-作为DX11 hull着色器的函数名。有这个选项将自动切换到#pragma target 5.0,如下所述。
·#pragma domain 名字-作为DX11 domain着色器的函数名。有这个选项将自动切换到#pragma target 5.0,如下所述。
其他编译指令:
·#pragma target 名字-要编译到的shader目标,查看shader编译目标页面获取更多消息
·#pragma only_renderers 空格分隔的名字-只为给定的渲染器编译shader。默认为所有渲染器编译shader。查看下文的渲染器获取细节。
·#pragma exclude_renderers 空格分隔的名字-不为给定的渲染器编译shader。默认为所有渲染器编译shader。查看下文的渲染器获取细节。
·#pragma multi_compile …-用于多个工作变体。
·#pragma enable_d3d11_debug_symbols-为DirectX11生成shader编译的调试信息,这将允许您通过VS2012或更高版本的Graphics debugger来调试shader。
·#pragma hardware_tier_variants 渲染器名字-为每个编译好的shader的每个可以运行所选渲染器的硬件等级生成多个硬件shader变体,查看下文的渲染器获取细节。
渲染平台
Unity支持一些渲染API(比如Direct3D11和OpenGL),并且默认所有shader编程被编译进所有支持的渲染器。您可以用#pragma only_renderers或者#pragma exclude_renderers指令指明要编译到哪个渲染器。这在您明确的知道在一些平台上使用某些shader语言功能不被支持的情况下非常有用。支持的渲染器名字是:
·d3d11 - Direct3D 11/12
·glcore - OpenGL 3.x/4.x
·gles - OpenGL ES 2.0
·gles3 - OpenGL ES 3.x
·metal - iOS/Mac Metal
·vulkan - Vulkan
·d3d11_9x - Direct3D 11 9.x功能级别,与WSA平台上通常使用的功能一样
·xboxone - Xbox One
·ps4 - PlayStation 4
·psp2 - PlayStation Vita
·n3ds - Nintendo 3DS
·wiiu - Nintendo Wii U
比如,这一行命令将只把shader编译到D3D11模式:
#pragma only_renderers d3d11