编写顶点片段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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • <转>我也忘了转自哪里,抱歉,感谢原作者 什么是Shader Shader(着色器)是一段能够针对3D对象进行操作...
    星易乾川阅读 10,955评论 1 16
  • Basic Shaderlab unity 使用一个叫做 shaderlab 的语言用来包装和组织整个shader...
    goteet阅读 8,378评论 0 12
  • 首先,非常感谢大家当天的配合!同时,也很抱歉,让你们陪我进行了一场不太成功的实验。 我留意到:几乎所有的孩子在“玩...
    山间竹音阅读 2,325评论 0 0
  • 股市,世界杯博彩
    马克扎克化云腾阅读 910评论 0 0
  • 1 民以食为天,吃饭可以说是很重要的一件事了。 上学的时候,是没啥机会可以自己做饭的,一则学生宿舍杜绝一切高功率电...
    Pingzi就是瓶子阅读 4,545评论 13 21