Unity3D Shader教程二 基础颜色

今天讲解下最基本的如何通过一个shader来渲染一个物体,教程结束的时候将会看到一个纯色的立方体。如果代码部分有不清楚的地方,建议看一下上一篇讲解HLSL的教程。

result.png

Shaderlab 的结构

在开始写shader之前,我们先要搞清楚shaderlab的结构。Shader文件第一行 以Shader开头,后面跟着的是shader文件的路径和名字,后面会在Inspector中选择shader的时候显示出来。接下来是Subshader.。一个shader可以包含多个Subshader,可以针对不同的情况使用不同的Subshader。

Shader "Tutorial/02_Simple"{
    Subshader{

    }
}

在subshader里面是 Pass, 同样可以有多个。当Subshader被渲染的时候,将会依次渲染里面的每个pass,这里我们只用了一个pass。在Pass里面我们通过Tag告诉unity如果去处理当前的Pass。比如下面的,我们希望物体被渲染为不透明,并且和其他不透明物体一起渲染。

Shader "Tutorial/02_Simple"{
    Subshader{
        Pass{
            Tags{
                "RenderType"="Opaque"
                "Queue"="Geometry"
            }

        }
    }
}

HLSL Code

上面的都准备好之后,我们可以开始写HLSL代码部分了。我们来看一下Shader中的数据流程是怎样的。首先 3D模型的数据信息给到vertex shader, 变换为相对于屏幕的一些信息。然后通过光栅化,把顶点及三角面转化为像素信息给到fragment shader,fragment shader通过一系列的差值及其他操作,讲最终颜色输出到屏幕上。

Shader Pipeline

通过CGPROGRAM 开始 和 ENDCG 结束 告诉unity我们使用HLSL来书写代码。为了使用unity提供的一些工具函数,我们引入 “UnityCG.cginc“ 文件.

Shader "Tutorial/02_Simple"{
    Subshader{
        Pass{
            Tags{
                "RenderType"="Opaque"
                "Queue"="Geometry"
            }

            CGPROGRAM
            #include "unityCG.cginc"

            ENDCG
        }
    }
}

通过一个结构体来引入输入数据,一般命名为appdata ,这里我们只获取物体的顶点位置,通过POSITION属性来标明为物体的局部空间位置信息。

struct appdata{
    float4 vertex : POSITION;
}

我们再声明一个结构体,这个结构体是vertex shader的输出值。现在我们只需要顶点的屏幕坐标,我们通过SV_POSITION属性来标明。

struct v2f{
    float4 position : SV_POSITION;
}

接下来是vertex shader,它接受appdata中的物体信息,输出v2f的结构体给到fragment shader。首先我们生成一个v2f的新实例,然后把顶点的屏幕坐标赋值给它。UnityObjectToClipPos函数定义在UnityCG.cginc 文件中,将顶点从局部空间坐标变化到屏幕坐标,我们直接使用就行了。

v2f vert(appdata v){
    v2f o;
    o.position = UnityObjectToClipPos(v.vertex);
    return o;
}

最后我们来写一下fragment shader。这里我们仅仅返回一个红色,在后续的教程里将会对它做更多其他的操作。我们将函数标明为SV_TARGET,这样unity就知道函数的返回值将被渲染到屏幕上。

fixed4 frag(v2f i) : SV_TARGET{
    return fixed4(0.5, 0, 0, 1);
}

完成上面这些之后,我们还需要告诉unity,vertex shader对应的函数 以及 fragment shader 对应的函数。通过 #pragma vertex 函数名 #pragma fragment 函数名 来实现。

Shader "Tutorial/01_Basic"{
    SubShader{
        Tags{
                "RenderType"="Opaque" 
                "Queue"="Geometry"
            }
        Pass{

            CGPROGRAM
            #include "UnityCG.cginc"

            #pragma vertex vert
            #pragma fragment frag

            struct appdata{
                float4 vertex : POSITION;
            };

            struct v2f{
                float4 position : SV_POSITION;
            };

            v2f vert(appdata v){
                v2f o;
                o.position = UnityObjectToClipPos(v.vertex);
                return o;
            }

            fixed4 frag(v2f i) : SV_TARGET{
                return fixed4(0.5, 0, 0, 1);
            }

            ENDCG
        }
    }
}

现在我们可以把新创建的这个Shader赋给一个材质,将会看到立方体显示fragment shader返回的颜色。


Apply

from:https://www.ronja-tutorials.com/2018/03/21/simple-color.html

Unity技术交流 微信公众号 UnityAsk,QQ群:891920228


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,012评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,589评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,819评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,652评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,954评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,381评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,687评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,404评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,082评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,355评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,880评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,249评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,864评论 3 232
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,007评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,760评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,394评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,281评论 2 259

推荐阅读更多精彩内容

  • 转载注明出处:点击打开链接 Shader(着色器)是一段能够针对3D对象进行操作、并被GPU所执行的程序。Shad...
    游戏开发小Y阅读 3,235评论 0 4
  • Basic Shaderlab unity 使用一个叫做 shaderlab 的语言用来包装和组织整个shader...
    goteet阅读 3,014评论 0 12
  • Unity shader 官网文档全方位学习(一)What?? Shader,看起来好高级的样子,是的,这是Uni...
    狼之独步阅读 5,898评论 0 12
  • 此次泛泛地读了一遍,把自己喜欢的认真地咀嚼回味了一番。还清晰地记得在高中时,语文老师让我们每节语文课轮流每个...
    晴天先生阅读 453评论 0 5
  • 海棠社(35) 文/寒霜 【原创】 归自遥·梦惊 星光莹, 稚子帐中入梦轻, 眉眼如丝慧智映。 时蹙眉头时嘤咛, ...
    刘寒霜阅读 368评论 25 20