zoukankan      html  css  js  c++  java
  • U3D Shader 固定管线着色器

    Shader导论:

       Shader(着色器):是一种短小的程序片段,是用于告诉图形硬件如何计算和输出图像过去由汇编语言编写【Shader是可编程图形管线的算法片段】

       Shader的主要分类为:Vertex Shader(顶点着色)和Fragment Shader(片段着色)

    渲染管线:

          渲染管线也称为渲染流水线,是显示芯片内部处理图形信号相互独立的并行处理单元.一个流水线是一序列可以并行和按照固定顺序进行的阶 段.每个阶段都从它的前一阶段接收输入,然后把输出发给随后的阶段. 就像一个在同一时间内,不同阶段不同的汽车一起制造的装配线,传统 的图形硬件流水线以流水的方式处理大量的顶点,几何图元和片段.

    Shader实际上就是一小段程序,它负责将输入的顶点数据以指定的方 式和输入的贴图或者颜色等组合起来,然后输出.绘图单元可以根据这 个输出来将图像绘制到屏幕上.输入的贴图或颜色等,加上对应的 Shader,以及对Shader的特定的参数设置,将这些内容打包存储到一起 得到的就是一个Material(材质).之后我们便可以将材质赋予三维物 体来进行渲染(输出)了.

    Shader是图形可编程方案的程序片段 

    渲染管线是一种计算机从数据到最终图形成像的描述

     

    三大主流的高级编程语言:

    Shader Language的发展方向是设计出在便捷性方面可以和C++/JAVA 相比较的高级语言,赋予程序员灵活而方便的编程方式,并尽可能的控 制渲染过程,同时利用图形硬件的并行性,提高算法的效率.

    目前Shader Language有三种语言:基于OpenGL的OpenGL Shading Language,简称GLSL.基于DirectX的High Level Shading Language 简称HLSL.还有NVIDIA公司的C for Graphic简称Cg语言.

    Cg语言(C for Graphics)是为GPU编程设计的高级着色器 语言,由NVIDIA公司开发。Cg极力保留C语言的大部分语义, 并让开发者从硬件细节中解脱出来,Cg同时也有一个高级语 言的其他好处,如代码的易重用性,可读性得到提高,编译器代码优化。

     

    Shader的基本结构

     三种着色器:表面着色器、顶点片段着色器、固定管线着色器

     

     

     

     Shader:

    //固定管线着色器,从语法上说是最简单的着色器

    //虽然功能有限,但在3中着色器中运行速度是最快的,几乎在所有硬件上都能运行

    //结构:由 Properties、SubShader、FallBack组成

    Shader "CustomLearn/First"{
        Properties{
    //    属性的语法规则:_Name("DisplayName",Type)=defaultValue
    //    1、_Name是属性的名字,简单说就是变量名,在之后的整个shader
    //    代码中一直通过该名字来获得该属性的内容
    //    2、DisplayName:将显示在Unity材质编辑器中的名称
    //    3、Type:属性的类型,类型可以有以下
    //          1)Color-颜色,有RGBA(红绿蓝和透明)四个两来定义取值0-1之间
    //            2) 2D——表示一个2的幂次方大小的贴图,这样贴图将在采样后背后被转化
    //                为对应模型的UV的每个像素的颜色最终被显示出来
    //                UVMaping:作用是将一个2D贴图上的点映射到3D模型上,是3D渲染中最常见的一种顶点处理手段
    //            3)Rect - 表示的是一个非2的幂次方大小的贴图
    //            4)Cube - 即Cube map texture(立方体为例),即六张带有联系
    //                的2D贴图的组合,主要用来做一些反射效果,比如说天空盒
    //            5)Range - 一个介于最大值和最小值之间的浮点数,这个值可以用来在
    //            材质球的设置面板进行设置,一般用于调整shader某些特定的参数,比如透明度
    //            6)Float - 任意的一个浮点数
    //            7)Vector - 表示一个四维数,格式为(x,y,z,w)
    
            _Color("Main Color",color)=(1,0.5,0.5,1)
        }
        SubShader{
        //SubShader:子着色器,可以有一个或者多个,在实际运行平台当中
        //到底执行那个子着色器,是由运行的平台所决定的
        //子着色器:是Shader代码的主体,每个子着色器包含一个或者多个Pass通道,
        //每个Pass都会渲染一次当前shader所作用的对象,在计算着色器时,平台会优先选用
        //要使用的子着色器,然后运行Pass通道,会得到一个输出的结果,最后将结构渲染在界面上
            Pass{
            //Pass通道:控制被渲染对象的几何体,除了表面着色器以外,其他两种着色器的SubShader下一定要有Pass通道
            //pass通道语法规则
            //{{Name and Tags}[RendererSetup][TextureSetup]}
            //1、Name and Tags:可以定义Pass通道和任意数量的标签,如果为Pass通道命名后,可以在别的着色器中使用该名字(标签)来重用它
            //2、标签的作用可以用来向渲染管线说明Pass的意图
            //3、RenderSetup:渲染设置是用来固定功能管线着色器中,可以设置图形硬件的各种状态
            //        可用的设置命令为:
            //        1)Material{}:材质:定义一个使用顶点着色器光照管线的材质
            //        2)Lighting:光照:取值为On或off
            //        3)Cull:裁剪,设置裁剪模式,有Back,Front、Off
            //          Cull Back:表示不绘制北里观察者的几何面
            //          Cull Front:表示不绘制面向观察者的几何面,用于由内而外的对象
            //          Cull Off:显示所有面,用于特殊效果
            //4、ZTest:深度测试,模式包括:Less、Greater、LEqual、GEqual、Equal、NotEqual、Always
            //          深度测试:当场景中有多个物体需要绘制,这些物体之间通常会存在遮挡的关系,离观察者比较远
            //                的会因为近处物体的遮挡而不可见,或者只有近处可见。这是如果绘制不可见的物体没
            //                有太大意义,所以深度检测可以简化复杂场景的绘制,确保只有场景内最靠近表面的
            //                物体参与绘制 
            //5、ZWrite:深度缓存写入,取值为On或Off;
            //            ZWrite On/Off:用于将要绘制的对象写入深度缓存区中,默认情况下是开启的,如果要
            //            绘制一个纯色的物体,可以将这个选项打开,如果要绘制半透明效果,关闭深度缓存
            //6、Fog():雾效,设置雾效的参数,用于控制雾效的相关渲染
            //        雾化的原理:通过混合已经生成的像素的颜色,和基于到镜头的距离来确定最终的颜色。
            //        雾化不会改变已经混合的像素的透明度值,只是改变了RGB值,我们可以在Unity工程中设置
            //7、Alpha Test:设置Alpha测试,模式包括:Less、Greater、LEqual、GEqual、Equal、NotEqual、Always、Nerver
            //    AlphaTest:表示的是阻止像素被渲染到屏幕的最后机会,在最终渲染出的颜色被计算出来之后,
            //            可以选择通过颜色的透明度值和一个固定值比较,如果比较的结果失败(这里是否失败
            //            取决于上面设置的测试类型:大于、小于。。。)像素就不会被写到显示的输出中
            //8、Bleed:Alpha混合
            //9、Color:颜色,设置顶点光照关闭时设置的颜色值
            //10、ColorMask:颜色通道,当值为0时,关闭所有的颜色通道的渲染,取值为RGB|A|0|或者RGB任意组合
            //11、Offset Factor/Units:表示两个参数来定义深度偏移
            //                Factor:表示z轴缩放的最大斜率的值
            //                units:表示可分辨的最小深度缓冲区的值
            //12、SepatareSpecular:高光颜色,取值为On或Off
            //13、ColorMaterial:颜色集,当计算定点光照时使用每个顶点的颜色 
        //4、TextureSetup:贴图设置的选项:
        //    1)Combine:将两种颜色进行混合,可以是上次SetTexture的处理结果,(previous、constant、primary、Texture中的一种)
        //    2)constantColor:设置一个常量的颜色值
        //    3)matriax:设置矩阵纹理坐标进行变换
                Material{
                    Diffuse[_Color]
                }
                //灯光打开
                Lighting On
                //剔除关闭【Cull Front 剔除正面,不会绘制面向观察者的几何体】
                Cull Off
            }
        }
        //如果用户所用的SubShader都失败了,为了在计算机上能够呈现设定的渲染效果,
        //0一般会使用FallBack,FallBack是Unity自己预制的Shader实现,
        //一般可以在所有显卡上运行,Shaderde的备胎,类似Default语句
        FallBack "Diffuse"
    }
    
    //固定管线着色器
    Shader "CustomLearn/Second"{
        Properties{
            // 主颜色
            _Color("Main color",color) = (1,1,1,0.5)
            //高光
            _SpecColor("Spec color",color) = (1,1,1,1)
            //自发光
            _Emission("Emission",color) = (0,0,0,0)
            //太阳光
            _Shiness("Shiness",Range(0,1)) = 0.7
            //主纹理
            _MainTex("MainTexture",2D) = "white"{}
        }
        SubShader{
            Tags{"Queue"="Transparent" "IgnoreProjector"="true" "ForceNoShadowCasting"="True"}
            //tags:表示输出的是什么,如果输出的是非透明的物体,写在Opaque中,如果想渲染半透明或者透明的物体写在Transparent中
            //其他的一些标签还包括:
            //IgnoreProjector=True:表示不被Project投影影响
            //ForceNoShadowCasting=True:表示不产生阴影
            //"Queue"="XXX":表示指定的渲染队列
            //Queue的值可以有:
            //Background - 最早被调用的渲染,用来渲染天空盒或者北京
            //Geometry - 这是默认值,用来渲染非透明的物体
            //AlphaTest - 用来渲染经过Alpha Test 渲染过的像素
            //Transparent:从后往前的顺序渲染透明的物体
            //Overlay:用来渲染叠加效果,是渲染的最后阶段使用
            //上述设置的Queue中的渲染效果,实际上是一组定义的整数
        //Background=1000,Geometry=2000,AlphaTest=2450,Transpartent=3000,Overlay=4000
            //也可以指定渲染队列为:"Queue"="Transparent+100",表示当前渲染内容在渲染完透明物体之后,
            //在Overlay之前
            //透明度的混合
             Blend srcAlpha OneMinusSrcAlpha
             Pass{
                 Material{
                     //漫反射颜色
                     Diffuse[_Color]
                     //环境光颜色
                     Ambient[_SpecColor]
                     //太阳光的光泽度,值在0-1之间
                     SHininess[_Shiness]
                 }
                 //开启灯光
                 Lighting On
                 //开启顶点光照的平行高光颜色
                 SeparateSpecular On
                 //设置纹理
                 SetTexture[_MainTex]{
                     //设置纹理的颜色
                     constantColor[_Color]
                     //混合效果
                     //纹理*原色的两倍,纹理*常量颜色值
                     Combine texture*primary DOUBLE,texture*constant
                 }
             }
        }
        FallBack "Diffuse"
    }

  • 相关阅读:
    【LeetCode】17. Letter Combinations of a Phone Number
    【LeetCode】16. 3Sum Closest
    【LeetCode】15. 3Sum 三个数和为0
    【LeetCode】14. Longest Common Prefix 最长前缀子串
    【LeetCode】13. Roman to Integer 罗马数字转整数
    【LeetCode】12. Integer to Roman 整型数转罗马数
    【LeetCode】11. Container With Most Water
    【LeetCode】10. Regular Expression Matching
    Models of good programmer
    RSA Algorithm
  • 原文地址:https://www.cnblogs.com/zpy1993-09/p/13161263.html
Copyright © 2011-2022 走看看