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"
    }
    
  • 相关阅读:
    IDEA的database插件无法链接mysql的解决办法(08001错误)
    window.location.href传参/传值汇总
    toggleClass() 方法
    File file=new File ()
    MultipartFile接口
    @RequestParam注解字参数详解
    在微信下载的浏览器判断问题
    JS可控制的图片自动循环播放查看效果
    PHP接口的声明与引用
    js时间
  • 原文地址:https://www.cnblogs.com/kingBook/p/12698966.html
Copyright © 2011-2022 走看看