zoukankan      html  css  js  c++  java
  • Unity Shaders

    推荐!!

    Unity技术人员的博客:

    http://aras-p.info/blog/

    Unity 中的 Shader 按照使用方式来分的话,分为3种:

    • Surface Shader

    受光照影响 Cg/HLSL。如果不受光照  不要使用这种类型。最后这种shader也会自动转化成 vertex/fragment。

    这种 Shader 的存在是由于编写跟光照交互的代码不太好写,Unity专门用这种方式来简化光照Shader的编写。会自动生成代码。

    关于 Surface Shader 推荐阅读:

    http://www.cnblogs.com/flappy/archive/2012/08/10/2631348.html

    http://aras-p.info/blog/2010/07/16/surface-shaders-one-year-later/

    • Vertex/Fragment

    如果不需要受光照的话 就使用这种类型。这种方式最灵活。灵活也就意味着比较麻烦。 Cg/HLSL。

    使用方法:直接在 Pass 中插入 Cg 代码。CGPROGRAM...ENDCG

    • Fixed Function

    老显卡。固定渲染管线。如果你编写过 Direct3D 或者 OpenGL 的固定管线的程序,会发现很像。

    ShaderLab 是什么东西

    Unity自定义的一套shader语法。类似与 CgFX 以及 Direct3D 的 FX 文件,描述了材质。

    不管你选择使用哪一种 Shader (就是上面列出的3种),你都是用 ShaderLab 的语法来写的。

    shader定义属性,可以在Inspector中显示。

    SubShader

    表示适用于某个显卡的 shader。可以写多个,以匹配多种显卡。编写的顺序是 高端->中端->低端。Unity会自动选择第一个可以用的 SubShader。

    Pass

    在一个 SubShader中 可以包含多个 Pass,这些 Pass 会从上到下一个一个执行下去。

    Fallback

    如果你的SHADER中任何一个SubShader都不被当前机器支持。那么你可以使用这个命令让他使用另一个Shader里面的 SubShader。就好像把他的内容拷贝进来了似的。

    引用其他文件的Pass

    如果你的 Pass 别人已经写了跟你一模一样的。可以使用 UsePass 命令去引用另一个文件中的 Pass。

    如何判断是使用固定管线还是编程管线

    如果在 Pass  使用了 vertex或者fragment。固定管线中的相应功能就会被关闭。vertex->3d变换(x).光照(x).纹理坐标自动生成(x)  fragment->SetTexture(x)

    Shader文件的基本组成

    // 定义 Shader 的名字
    Shader "Custom/BasicDiffuse" {
        // 1个 Property 部分
        Properties {
        }
    
        // 若干个 SubShader(至少1个)
        SubShader {
            // 每个 SubShader 中包含若干个 Pass(至少1个)
            Pass {
            }
        }
    
        SubShader {
        }
    }   

     Surface Shader的编写

    这几篇文档需要一起看:

    http://docs.unity3d.com/Manual/SL-SurfaceShaders.html

    http://docs.unity3d.com/Manual/SL-SurfaceShaderExamples.html

    http://docs.unity3d.com/Manual/SL-SurfaceShaderLightingExamples.html

    1. vertex/fragment的 CGPROGRAM...ENDCG 是在 Pass 段中的  而 Surface 是在 SubShader 中的。

    2. 使用 #pragma surface ... 来标识这是一个 Surface Shader

  • 相关阅读:
    PHP下实现两种ajax跨域的解决方案之jsonp
    实际应用中git(合并本地与服务器项目)
    centos7 编译安装nginx
    windows vagrant共享目录设置问题
    shell 需要注意的点
    插入排序(直接插入排序)
    选择排序
    快速排序
    冒泡排序
    centos7.5安装redis-5.0.4
  • 原文地址:https://www.cnblogs.com/answerwinner/p/3795263.html
Copyright © 2011-2022 走看看