欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

shader学习笔记(一)

程序员文章站 2022-06-10 21:12:19
...

开始shader学习:
1、shader语言分类:
(1)GLSL OpenGL语言
(2)HLSL DirectX语言
(3)CG 跨平台语言
(4)ShaderLab Unity中对上述语言的通用封装
2、 shader基本属性定义:

//属性
(1) _Color("Color",Color)=(1,1,1,1)        //颜色float4
(2) _Vector("Vector",Vector)=(1,2,3,4)    //向量float4
(3) _Int("Int",Int)=1234                //整数float
(4) _Float("Float",Float)=4.5            //小数float
(5) _Range("Range",Range(1,11))=6        //随机数float
(6) _2D("Texture",2D)="white"{}            //图片sampler2D(其中white代表当未指定图片时默认其未一张白色的图片,也可改为其他颜色)
(7) _Cube("Cube",Cube)="White"{}        //立方体纹理samplerCube(其中white代表当未指定图片时默认其未一张白色的图片,也可改为其他颜色)用于天空盒子等
(9) _3D("Texure",3D) = "White"{}        //3D贴图sampler3D(其中white代表当未指定图片时默认其未一张白色的图片,也可改为其他颜色)

3、float half fixed 的区别

        //一般小数这三个都可以声明定义
        float t1;
        half t2;
        fixed t3;
        half2 t4;
        fixed2 t5;
        //区别在于范围不同 
        //float 32位
        //half 16位  -6万 -- +6万
        //fixed 11位  -2 -- +2 (一般颜色用fixed)

4、shader中的常用语义
1.从应用程序传递到顶点函数的语义有哪些a2v
    POSITION 顶点坐标(模型空间下的)
    NORMAL 法线( 模型空间下)
    TANGENT 切线(模型空间)
    TEXCOORD0 ~n 纹理坐标
    COLOR 顶点颜色  
  2.从顶点函数传递给片元函数的时候可以使用的语义
    SV_POSITION 剪裁空间中的顶点坐标(一般是系统直接使用)
    COLOR0 可以传递一组值 4个
    COLOR1 可以传递一组值 4个
    TEXCOORD0~7 传递纹理坐标  
  3.片元函数传递给系统
    SV_Target 颜色值,显示到屏幕上的颜色
5、函数声明:
//顶点函数声明 //基本作用 完成顶点坐标从模型空间到剪裁空间的转换(从游戏环境到相机视野屏幕上)
#pragma vertex vert
//片元函数声明//基本作用 返回模型对应的屏幕上的每一个像素的颜色值
#pragma fragment frag

float4 vert(float4 v : POSITION) : SV_POSITION{//通过语义来告诉系统我这个参数是干嘛的
        //比如POSITION是告诉系统我需要顶点坐标
        //比如SV_POSITION用来解释说明返回值,返回值是剪裁空间下的顶点坐标

        //转换剪裁空间坐标的算法,也可直接调用包装好的方法
        float4 pos=mul(UNITY_MATRIX_MVP,v);
        return pos;
        
        }
        fixed4 frag() : SV_Target{
        return fixed4(0.5,0.5,1,1);
        }

6、结构体存储传递数据

	//a2v 即 application to vertex

        struct a2v{ 
            float4 vertex:POSITION;//告诉Unity把模型空间下的顶点坐标填充给vertex
            float3 normal:NORMAL;//告诉Unity把模型空间下的法线方向填充给normal
            float4 texcoord:TEXCOORD0;//告诉Unity把第一套纹理坐标填充给texcoord
        };
        
        //使用结构体存储
        struct v2f{
            float4 position:SV_POSITION;//告诉Unity存储剪裁空间下的顶点坐标
            float3 temp:COLOR0;//临时测试顶点到片元函数之间的数据传递,此处将顶点中的法线作为颜色传递给片元函数显示
        };

        v2f vert(a2v v){
            v2f f;
            f.position=mul(UNITY_MATRIX_MVP,v.vertex); 
            f.temp=v.normal;
            return f;
        }
        fixed4 frag(v2f f) : SV_Target{
        return fixed4(f.temp,1);
        }
相关标签: shader