UnityShader结构基础

本文介绍了Unity Shader的基础结构,通过一个简单的顶点片元着色器示例,讲解了Shader中CGPROGRAM和ENDCG的作用,以及顶点着色器和片元着色器的工作原理。详细阐述了Unity中模型数据如何传递到顶点着色器,以及顶点着色器和片元着色器之间的通信方式。此外,还探讨了Shader中的语义、内置文件和变量、渲染平台差异以及Shader性能优化策略。
摘要由CSDN通过智能技术生成

一个最简单的顶点片元着色器
顶点片元的基本结构

Shader "ShaderStruct"{
   
	Properties{
   
		//属性
	}

	SubShader
	{
   
		//针对显卡A的SubShader
		Pass
		{
   
			//设置渲染状态和标签

			//开始CG代码片段
			CGPROGRAM
			//代码片段的编译指令
			#pragma vertex vert
			#pragma fragment frag

			//cg代码
			ENDCG

			//其他设置
		}
		//其他Pass
	}

	SubShader
	{
   
		//针对显卡B的SubShader
		
	}

	//上述SubShader都失败后用于回调的UnityShader
	Fallback "VertexLit"
}

增加顶点片段着色器对应的方法

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "SimpleShader"{
   
	Properties{
   
		//属性
	}

	SubShader
	{
   
		//针对显卡A的SubShader
		Pass
		{
   
			//设置渲染状态和标签

			//开始CG代码片段
			CGPROGRAM
			//代码片段的编译指令
			#pragma vertex vert
			#pragma fragment frag

			//cg代码

			float4 vert(float4 v: POSITION): SV_POSITION
			{
   
				return mul(UNITY_MATRIX_MVP,v);
			}

			fixed4 frag() : SV_Target
			{
   
				return fixed4(1.0,1.0,1.0,1.0);
			}
			ENDCG

			//其他设置
		}
		//其他Pass
	}

	//上述SubShader都失败后用于回调的UnityShader
	Fallback "VertexLit"
}

代码第一行通过Shader语义定义UnityShader名字 这个Shader并没有使用Properties块,不是必需的。然后声明了SubShader和Pass语义块,这个例子中不需要任何渲染状态和标签,因此SubShader将使用默认的渲染状态和标签设置,Pass中我们同样没有进行任何自定义的渲染设置和标签设置。接下来是 CGPROGRAM和ENDCG包围的CG片段,首先两个编译指令

#pragma vertex vert
#pragma fragment frag

告诉Unity 哪个函数包含了顶点着色器代码,哪个函数包含了片元着色器代码

接下来具体看一下vert函数的定义

float4 vert(float4 v: POSITION): SV_POSITION
{
   
	return mul(<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值