关于ShaderLab For Unity3D语法,简单讲解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于ShaderLab For Unity3D语法,简单讲解相关的知识,希望对你有一定的参考价值。
SubShader Pass CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" sampler2D _MainTex; float4 _MainTex_ST; struct v2f float4 pos : SV_POSITION; float2 uv : TEXCOORD; ; v2f vert(appdata_base v) v2f o; o.pos = mul(UNITY_MATRIX_MVP, v.vertex); o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); return o; float4 frag(v2f i) : COLOR float4 texCol = tex2D(_MainTex, i.uv); float4 outp = texCol; return outp; ENDCG
小弟最近刚开始学习Shader,希望得到大侠解答,有如下问题:
float4 pos : SV_POSITION;
变量声明的时候,float4为基本数据类型,pos为名称,这个SV_POSITION东西是什么?
为什么代码中float4 _MainTex_ST;变量声明的时候,没有SV_POSITION呢?
2. 代码中声明了一个#pragma vertex vert函数;
在v2f vert(appdata_base v)...时候进行了使用(即实现方法体);可是这个函数为什么会有参数呢?
(appdata_base v---这个参数是从UnityCG.cginc文件中得到的)
还有,vert函数凭什么返回的是v2f类型的对象呢?
3. mul(UNITY_MATRIX_MVP, v.vertex); mul函数是从哪里得到呢?UnityCG.cginc文件中没有这个函数啊?
谢谢大侠们,呵呵
1.这里的SV_POSITION叫做输出语义,语义是GPU编程里提出的一个概念,对于这个的定义可能比较长,我怕我说不清楚误导你,你可以百度一下一个文章——cg的输入/输出与语义绑定
2.#pragma vertex vert是一个预处理指令,表明一个以vert为名字的函数的顶点程序,这写法是固定的,详细可以参考Unity圣典组件参考手册里编写的顶点和片段着色器那部分
3.在 CGPROGRAM后面的都是cg程序,mul函数是cg标准库函数
p.s.推荐看shader前稍微学一下cg语言,会少绕不少远路本回答被提问者和网友采纳
UnityShader之Shader格式篇Shader资料1
关于Shader,在Unity里面我们一般叫做ShaderLab,只要你的职业是与渲染搭边,Unity就与ShaderLab有着直接的关联,你都应该试着去学会它,其实我们在新手未有入门的时候,我们总是认为这是个很遥远的东西,只要我们有一次理解了,我们就会发现ShaderLab其实并不难。
每一个Shader,我们从最简单的方式去着手理解,你只需要把它想象成一个无限循环执行的函数即可。可能这样也有部分同学还是很难理解。那我写个代码我们试着来理解它。
public void ShaderLab(object parm[])
{
函数体;
SharderLab(parm[]); //递归调用
}
我们再去调用它 ShaderLab(parm[]);。
我们通过类似这种方式的形式去理解它,我们大家理解了吧,这样把ShaderLab函数看作是一个Shader即可,我们由表及里,一步一步往Shader深入的地方去迈,记住步子迈大了就会扯着蛋,我们通过循序渐进的方式来学习。
对于整体的ShaderLab,调用的内部接口实现,Unity已经帮我们做好了,这里不深入探讨,因为笔者也不了解内部实现,同学们也没有必要现在就去深究这个问题,因为现阶段没学会Shader的情况下纠结这个是没有任何意义的,只会对现在的学习造成干扰。
Shader的格式如下,不要问我为什么内容这么少,因为Shader的内容就是这么少,233333:
Shader "------" //这里省略号表示Shader的路径和名字,例如Custom/shaderEg { Properties { _Color ("Main Color", Color) = (1,.5,.5,1) //传入一个颜色 //这片区域是传入参数,目前一共是分为七种类型,我们后来再详说 } SubShader { Pass { //渲染通道,一般Shader的代码主要是写在这片区域 } } }
以上是关于关于ShaderLab For Unity3D语法,简单讲解的主要内容,如果未能解决你的问题,请参考以下文章