关于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文件中没有这个函数啊?
谢谢大侠们,呵呵

参考技术A 同样是刚刚接触Shader的小菜鸟,表示刚开始学这个真是一头雾水,才有一点头绪,以下是一些自己的理解,不知道能不能帮助到你
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语法,简单讲解的主要内容,如果未能解决你的问题,请参考以下文章

Unity3D ShaderLab 修改渲染队列进行深度排序

猫都能学会的Unity3D Shader入门指南

Unity-ShaderLab入门 Shader是什么?

转 猫都能学会的Unity3D Shader入门指南

Unity3D shader专题

关于语法的问题