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);
            }

最终效果:


插值得到的新结果
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • <转>我也忘了转自哪里,抱歉,感谢原作者 什么是Shader Shader(着色器)是一段能够针对3D对象进行操作...
    星易乾川阅读 5,655评论 1 16
  • 几何着色器 首先用一张图来回顾一下渲染管线的各个阶段,目前为止我们接触的着色器有顶点着色器和像素着色器,而接触到的...
    久伴必知情深阅读 888评论 0 1
  • 转载注明出处:点击打开链接 Shader(着色器)是一段能够针对3D对象进行操作、并被GPU所执行的程序。Shad...
    游戏开发小Y阅读 3,459评论 0 4
  • Spark程序之间调度资源分配策略分为两种情况: 所谓分配,简单来说就是Spark集群管理器为每个Spark程序,...
    麦子星星阅读 731评论 0 0
  • 清晨从初中校园走到大学校园,一路打滑,因为这不时的应激,零度的雪天里升腾起温暖,街上的行人汽车依旧有序。蒋勋的红楼...
    蓑衣札记阅读 85评论 0 0