zoukankan      html  css  js  c++  java
  • Unity Shader 顶点/片元着色器的基本结构

    Shader "MyShaderName"{
        Properties{
            //属性
        }
        SubShader{
            //针对显卡A的SubShader
            Pass{
                //设置渲染状态和标签
                
                //开始CG代码片段
                CGPROGRAM
                //该代码片段的编译指令,例如:
                #pragma vertex vert
                #pragma fragment frag
                
                //CG代码写在这里
                
                ENDCG
                
                //其他设置
            }
            //其它需要的Pass
        }
        SubShader{
            //针对显卡B的SubShader
        }
        
        //上述SubShader都失败后用于回调的Unity Shader
        Fallback "VertexLit"
    }
    

    一个简单的顶点/片元着色器代码:

    Shader "Custom/SimpleWhiteShader"{
        SubShader{
            Pass{
                CGPROGRAM
                #pragma vertex vert //指定vert函数是顶点着色器代码
                #pragma fragment frag //指定frag函数是片元着色器代码
                float4 vert(float4 v:POSITION):SV_POSITION{
                    return UnityObjectToClipPos(v);
                }
                fixed4 frag():SV_Target{
                    return fixed4(1.0,1.0,1.0,1.0);
                }
                ENDCG
            }
        }
        Fallback "VertexLit"
    }
    

    传递法线、纹理坐标给片元着色器:

    Shader "Custom/SimpleStructShader"{
        SubShader{
            Pass{
                CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
                
                struct a2v{
                    float4 vertex:POSITION;		//模型空间顶点坐标
                    float3 normal:NORMAL;		//模型空间顶点的法线
                    float4 texcoord:TEXCOORD0;	//模型空间顶点的纹理0坐标
                };
                
                struct v2f{
                    float4 pos:SV_POSITION;
                    float3 color:COLOR0;
                };
                
                v2f vert(a2v v){
                    v2f o;
                    //v.normal包含了顶点的法线方向,其分量范围在[-1.0,1.0]
                    //下面的代码把分量范围映射到了[0.0,1.0]
                    //存储到o.color中传递给片元着色器
                    o.pos=UnityObjectToClipPos(v.vertex);
                    o.color=v.normal*0.5+fixed3(0.5,0.5,0.5);
                    return o;
                }
                fixed4 frag(v2f i):SV_Target{
                    //将插值后的i.color显示到屏幕上
                    return fixed4(i.color,1.0);
                }
                ENDCG
            }
        }
        Fallback "VertexLit"
    }
    
  • 相关阅读:
    python操作mysql数据库
    Turtle绘制带颜色和字体的图形(Python3)
    Windows单机最大TCP连接数的问题
    This network connection does not exist
    python3 条件判断,循环,三元表达式
    基于SolidWorks设计算例的柴油机飞轮平衡孔的研究
    VOC2007数据集转换成CSV格式[
    xml -> csv
    目标检测 – 解析VOC和COCO格式并制作自己的数据集
    什么是电磁阀,电磁阀常见故障与解决方法
  • 原文地址:https://www.cnblogs.com/kingBook/p/12698966.html
Copyright © 2011-2022 走看看