专栏首页Unity游戏开发Shader-简单的顶点/片元着色器

Shader-简单的顶点/片元着色器

实现一个简单地Shader

简单的Shader

Shader "Unlit/SimpleShader"
{
    SubShader{
        Pass{
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            float4 vert(float4 v : POSITION) :SV_POSITION{
                return mul(UNITY_MATRIX_MVP,v);
            }
            float4 frag() : SV_TARGET{
                return fixed4(1.0,1.0,0.5f,1.0);
            }
            ENDCG
        }
    }
}

在CGPROGRAM到CGEND中间添加代码片段的编译指令和Cg代码.

#pragma vertex vert
#pragma fragment frag

告诉编译器那个函数执行顶点着色器,那个函数执行片元着色器.

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

使用顶点着色器代码,它是逐顶点进行,输入的参数包含了顶点位置,通过POSITION语义指定. 返回一个float4,它是该顶点在裁剪空间中的位置,通过SV_POSITION定义,UNITY_MATRIX_MVP是Unity内置的模型-观察-投影矩阵.

float4 frag() : SV_Target{
                return fixed4(1.0,1.0,0.5f,1.0);
            }

frag没有任何输入,输出一个float4,用SV_Target定义,等同于告诉渲染器,用户输出的颜色存储到一个渲染目标.


当我们需要更多的模型数据的时候,我们将为顶点着色器定义一个新的参数,这个参数将是一个结构体,结构体中包含了法线 切线 纹理坐标等诸多数据

struct a2v {
                float4 vertex : POSITION;
                float3 normal : NORMAL;
                float4 texcoord : TEXCOORD0;
            };

这里的a2v表示a(application) v(vertex shader),表示数据从应用阶段传递到顶点着色器中 POSITION等语义中的数据从MeshRender中传递过来,每帧调用DrawCall的时候,MeshRender将他负责渲染的数据传递给UnityShader. 在给顶点着色器传参数的时候传a2v结构体

我们声明一个结构体v2f,用于在顶点着色器和片元着色器之间进行传递数据,

struct v2f {
                float4 pos : SV_POSITION;
                fixed3 color : COLOR0;//COLOR0语义用于存储颜色信息
            };

在顶点着色器中我们返回v2f的结构体,此结构体中包含了SV_POSITION,在顶点着色器中,我们给color值,来进行逐顶点的color插值,数值选用法线的相关值。

v2f vert(a2v v) {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.color = v.normal*0.5 + fixed3(0.5,0.5,0.5);
                return o;
            }

在fragment中我们只用返回插值后的color

fixed4 frag(v2f i) : SV_Target{
                return fixed4(i.color,1.0);
            }

最终效果:

插值得到的新结果

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 游戏渲染

    由CPU收集美术的资源信息,传递给GPU,通知GPU进行一次渲染过程叫DrawCall

    祝你万事顺利
  • 热更新

    什么是热更新? 不停机更新,实时更新。HotUpdateHotFix Unity中需要APP重启 真正热更新不重启就做更新

    祝你万事顺利
  • OpenGL自制游戏引擎-HelloTriangle

    Pipeline: 开始绘制图形之前,我们必须先给OpenGL输入一些顶点数据,OpenGL不是简单地把所有的3D坐标变换为屏幕上的2D像素;OpenGL仅当...

    祝你万事顺利
  • 实现 iOS 前台时的推送弹窗效果EBForeNotification

    或许很多童鞋还不知道,在 iOS 中收到推送通知时,如果 App 处于前台运行的情况下,推送的顶部弹窗是不会弹出来的。

    freesan44
  • 实现 iOS 前台时的推送弹窗效果

    原文链接:http://www.jianshu.com/p/67864e1c2085

    freesan44
  • JQuery.JCShare 0.2 发布(加入弹窗功能)

    周末没事,就在家里改进了下JCShare这个插件,此次加入了弹窗功能。 先说明下,JCShare的名字纯属是自己的英文名和老婆的英文名第一个字母,并无其他含义:...

    脑洞的蜂蜜
  • 使用ELK分析Windows事件日志

    这是ELK入门到实践系列的第三篇文章,分享如何使用ELK分析Windows事件日志。

    Bypass
  • TLB和MMU的区别

    MMU是Memory Management Unit的缩写,中文名是内存管理单元,它是中央处理器(CPU)中用来管理虚拟存储器、物理存储器的控制线路,同时也负责...

    233333
  • 腾讯入局物业管理,欲改造传统服务?

    12月22日,腾讯对外发布了智慧社区开放平台“腾讯海纳”,这也是继腾讯觅影、腾讯慧眼、腾讯慧聚之后,腾讯又一款将“互联网+”与传统行业深度融合的产品。 “腾讯海...

    企鹅号小编
  • 一份走心的runloop源码分析

    对iOS开发者而言,runloop是一个老生常谈的话题,但凡是iOS开发者,在工作中必然直接或间接的接触过runloop。而对于面试者而言,runloop又几乎...

    VV木公子

扫码关注云+社区

领取腾讯云代金券