https://blog.youkuaiyun.com/lfanyize/article/details/104087184
上一篇编写shader需要具备的知识储备,在这篇博客中如果有迷茫的可以去这里看一看
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Custom/My_shader"
{
//属性,可以在编辑器里面绑定和修改
Properties
{
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Glossiness("Smoothness", Range(0,1)) = 0.5
_Metallic("Metallic", Range(0,1)) = 0.0
}
SubShader{
Pass{
CGPROGRAM //插入Cg代码开始,必须有 然后指定shader的入口在哪里
//Cg的语法与c、c#相似
fixed4 _Color;//定义同样名字的变量
sampler2D _MainTex;//定义同样名字的变量
#pragma vertex my_vert//编译指令,将那个函数作为着色器的入口,在这里是my_vert函数
//并且要告诉编译器,这是什么着色器
//顶点着色器的声明是 #pragma vertex+ 函数名称
//顶点着色器的优点是控制灵活,缺点是无法参与光照计算
//片元着色器的声明是 #pragma fragment +函数名称
//只有绑定了之后,编译的时候才会把上一个工位的position传过来(传到pos)
//前面的那个POSITION是将上一个工位的位置绑定到pos上,第二个冒号是将修改后的pos传递到下一个工位
//GPU渲染流程工位图在上一篇博客里面
float4 my_vert(float4 pos :POSITION):POSITION//怎样获得的上一个工位的参数——》语义绑定
{
return UnityObjectToClipPos(pos);//将pos坐标变换到投影空间,然后传递到下一个工位
}
#pragma fragment my_frag//进行片元着色器的编程
fixed4 my_frag(float2 uv:TEXCOORD0) :COLOR//第一套纹理也可以是第二套第三套,只需要将最后面的0修改即可
{
//return fixed4(1.0, 0.0, 0.0, 1.0);
return _Color; //返回的这个是修改后的默认颜色值
//return tex2D(_MainTex,uv);//前面是需要修改的纹理,后面是查找的像素坐标颜色,函数在上一篇博客中
}
//相当于四个float x、y、z、常量
ENDCG //插入Cg代码结束,必须有,两者都存在了之后,在中间就可以编辑着色器代码
//在子着色器中,必须要有通道属性,在通道属性中,只要有顶点着色器与片元着色器其中的一个,可以同时有两个
}
}
FallBack "Diffuse"
}
实现效果
开始
运行
希望这篇博客可以对您有些启发,嗯,如果在这些代码中有看不懂的函数或者知识的话,可以去上一篇博客看一看https://blog.youkuaiyun.com/lfanyize/article/details/104087184