编写顶点片段shader

2019-01-05  本文已影响0人  Bonging

原文链接: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

上一篇下一篇

猜你喜欢

热点阅读