unityshader自己学习笔记--CG语言--CG框架

CG框架在Unity中用于创建自定义着色器,包含CGPROGRAM和ENDCG包围的代码段。main函数名称可自定义,需用#pragma声明函数类型。顶点和片元函数必须同时声明。语义如POSITION和COLOR指示变量用途。语义混用时要注意数据类型的匹配和顺序。
摘要由CSDN通过智能技术生成

CG框架

基本框架

  1. CG必须要有pass

  2. CG作为一个镶嵌的代码段,在unitylab中能够将它作为cg语言进行编译的话,需要关键词CGPROGRAMENDCG

  3. 正常代码入口都有main函数,而CG中,这个main函数名字不固定,可以自己起名,但是需要在前部分声明#pragma+需要声明的函数种类(比如顶点vertex和片元fragment),而且在shader中声明函数时,必须同时声明顶点和片元,不然不能正常运行

Shader "Custom/111"{
    Subshader{
        pass{
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag    
            
            void vert()
            {
                
            } 
            void frag()
            {
                
            }   
            
            ENDCG    
        }
    }
}

此时的shader没有任何意义,是因为数据需要进入顶点shader计算过后,输出到片元shader进行最终的计算,而此时没有任何数据输入输出

CG关键词

in表述引擎为我们的输入

语义(类似POSITION),是能够被顶点和片元识别的变量的实际意义,就是说明这个变量的用途,后面加语义

out为输出

inout输入输出,可以接受上一个函数输出的变量,也输出这个给变量

CG语义中COLOR和COLOR0是等价的

			void vert(in float2 objPos:POSITION,out float4 pos:POSITION)
            {
                pos=float4(objPos,0,1);
            } 
            void frag(out float4 col:COLOR)
            {
                col=float4(1,0,0,1)
            }   

可以看到,vert的POSITION输出在frag中没有使用,是因为POSITION作为顶点语义输出,是一个非常特殊的语义,不需要直接在片段程序中直接使用它,它会被图形硬件直接做一个正确的处理和显示,所以在frag中我们只需要区关注颜色

也可以这样写

			void vert(in float2 objPos:POSITION,out float4 pos:POSITION,out float4 col:COLOR)
            {
                pos=float4(objPos,0,1);
                col=float4(0,0,1,1)
            } 
            void frag(inout float4 col:COLOR)
            {
                col=float4(1,0,0,1)
            }   

语义混用

本地坐标通过一系列的转换,成为裁剪空间cvv(x为-1到1,y为-1到1)

该cube的x范围为-0.5-0.5,y的范围为-0.5-0.5
在这里插入图片描述

语义只能描述我们在两个处理程序之间的规范,但是如果数据类型相同是可以互相赋值的

void vert(in float2 objPos:POSITION,out float4 col:COLOR,out float4 pos:POSITION)
            {
                pos=float4(objPos,0,1);
                col=pos;
            } 

            void frag(inout float4 col:COLOR)
            {
                
            }   

注意如果有两个输出,而下面的 函数又有输入,记得调整输出顺序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值