Unity3D学习笔记(三十五):Shader着色器(2)- 顶点片元着色器
AlphaTest Great 0.5 //表示只渲染alpha值大于0.5的部分
AlphaTest Less 0.5 //表示只渲染alpha值小于0.5的部分
Blend Zero One //仅仅显示背景的颜色,自身的效果不会显示
Blend One Zero //显示贴图的RGB颜色,即使有透明通道的部分也显示原色,不会透过去
Blend One One //贴图色与背景色叠加,没有透明通道处理,结果可能更趋近于(1,1,1)
Blend SrcAlpha Zero //没有透明通道部分显示的是贴图的原色,有透明通道0的部分,显示黑色,0.5部分更趋近于黑色
Blend SrcAlpha OneMinusSrcAlpha //最终颜色 = 新颜色 * 当前透明度 + 旧颜色 * (1 - 当前透明度),最常用的透明混合方式
Shader "Lesson/AlphaTest" {
Properties {
_Tex("纹理", 2D) = "white"{}
_Alpha("透明度", Range(,)) = }
SubShader {
Pass
{
//表示只渲染alpha值大于0.5的部分
AlphaTest Greater 0.5
AlphaTest Greater [_Alpha] //Blend SrcAlpha OneMinusSrcAlpha
Blend SrcAlpha zero SetTexture[_Tex]
{
Combine texture
}
}
}
FallBack "Diffuse"
}
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Lesson/VFColor" {
Properties {
_Color("颜色", Color) = (,,,)
}
SubShader { //1.顶点片元程序也要写在Pass块里
Pass
{
//2.把Cg语言的开始和结束写出来
//表示Cg语言程序的开始
CGPROGRAM
//3.定义顶点函数和片元函数的名字
//#pragma 不变 vertex 关键字,后跟的是顶点函数的名字,vert顶点函数的名字
#pragma vertex vert //定义函数名为vert的函数为顶点函数
//#pragma 不变 fragment 关键字
#pragma fragment frag //定义函数名为frag的函数为片元函数
fixed4 _Color;//如果要在Cg语言中去使用属性面板定义的一些变量,需要在Cg语言中进行重定义
//4.实现顶点函数
//POSITION修饰的是顶点函数参数vet,证明vet是顶点坐标
//SV_POSITION修饰的是vet函数的返回值,证明返回值是转换之后的坐标
float4 vert(float4 vet : POSITION, float3 normal : NORMAL) : SV_POSITION
{
//顶点函数的核心作用必须做的是空间坐标转换
//mul是Cg语言的提供的API,计算向量与矩阵相乘
float4 position = UnityObjectToClipPos(vet); //
return position;
}
//5.实现片元函数
fixed4 frag() : SV_Target
{
//最重要的必须的做到就是返回一个颜色
return _Color;
}
//表示Cg语言程序的结束
ENDCG
}
}
FallBack "Diffuse"
}
#ifndef UNITY_SHADER_UTILITIES_INCLUDED
#define UNITY_SHADER_UTILITIES_INCLUDED
// This file is always included in all unity shaders.
#include "UnityShaderVariables.cginc"
// Tranforms position from object to homogenous space
inline float4 UnityObjectToClipPos(in float3 pos)
{
// More efficient than computing M*VP matrix product
return mul(UNITY_MATRIX_VP, mul(unity_ObjectToWorld, float4(pos, 1.0)));
}
inline float4 UnityObjectToClipPos(float4 pos) // overload for float4; avoids "implicit truncation" warning for existing shaders
{
return UnityObjectToClipPos(pos.xyz);
}
#endif

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Lesson/VFNormal" {
Properties {
}
SubShader {
Pass
{
CGPROGRAM #pragma vertex vert
#pragma fragment frag
//定义一个结构体,作为顶点函数的参数
struct m2v
{
float4 vex : POSITION;//告诉应用程序把模型空间下的顶点坐标放在这
float3 normal : NORMAL;//告诉应用程序把模型空间下的法线放在这
float3 tangent : TANGENT;//告诉应用程序把模型空间下的切线放在这
};
//定义一个结构体,作为顶点函数的返回值和片元函数的参数
struct v2f
{
float4 position : SV_POSITION;//转换之后的顶点坐标
float3 normal : COLOR0;//法线
float3 tangent : COLOR1;//切线
};
//结构体作为参数和返回值
v2f vert(m2v v)
{
v2f f;
f.position = UnityObjectToClipPos(v.vex); //必须变换顶点坐标
f.normal = v.normal;//法线赋值
f.normal = mul(UNITY_MATRIX_M, v.normal);
//f.tangent = v.tangent;//切线赋值
return f;
}
fixed4 frag(v2f f) : SV_Target
{
return fixed4(f.normal.x, f.normal.y, f.normal.z, );//把法线作为颜色输出
//return fixed4(f.tangent.x, f.tangent.y, f.tangent.z, 1);//把切线作为颜色输出
}
ENDCG
}
}
FallBack "Diffuse"
}
UV坐标,可以通过顶点的UV坐标去获取纹理对应的颜色。对于图片的纹理来说UV的(0,0)点在左下角,UV的(1,1)点在右上角
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Lesson/VFTexture" {
Properties{
//定义一个图片
_MainTex("纹理", 2D) = "white"{}
}
SubShader{
//透明的纹理处理要把渲染队列调高
Tags{ "Queue" = "Transparent" }
Pass
{
//Cull off
//处理带有透明通道贴图的混合
Blend SrcAlpha OneMinusSrcAlpha CGPROGRAM
#pragma vertex vert
#pragma fragment frag
//重定义纹理
sampler2D _MainTex; //定义结构体,作为顶点函数的参数
struct m2v
{
float4 vex : POSITION;
float2 uv : TEXCOORD0;//告诉应用程序要UV信息
}; //定义一个结构体,作为顶点函数的返回值和片元函数的参数
struct v2f
{
float4 position : SV_POSITION;
float2 uv : TEXCOORD0;
}; v2f vert(m2v v)
{
v2f f;
//转换顶点坐标
f.position = UnityObjectToClipPos(v.vex);
f.uv = v.uv;
return f;
} fixed4 frag(v2f f) : SV_Target
{
//通过顶点的uv坐标去访问纹理对应的颜色
fixed4 color = tex2D(_MainTex, f.uv);
//return fixed4(f.uv.x,f.uv.y, 0, 1);
return color;
}
ENDCG
}
}
FallBack "Diffuse"
}

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Lesson/VFDiscard" {
Properties{
_MainTex("纹理", 2D) = "white"{}
_Radius("半径", Range(, 0.75)) =
}
SubShader{
Pass
{
CGPROGRAM #pragma vertex vert
#pragma fragment frag sampler2D _MainTex;
float _Radius; struct m2v
{
float4 vex : POSITION;
float2 uv : TEXCOORD0;
}; struct v2f
{
float4 position : SV_POSITION;
float2 uv : TEXCOORD0;
}; v2f vert(m2v v)
{
v2f f;
f.position = UnityObjectToClipPos(v.vex);
f.uv = v.uv;
return f;
} fixed4 frag(v2f f) : SV_Target
{
//discard;//裁剪命令
fixed4 color = tex2D(_MainTex, f.uv); //0.2圆的半径
//圆心是0.5 0.5
float2 current = f.uv;
float2 center = float2(0.5, 0.5); float dis = pow((current.x - center.x), ) + pow((current.y - center.y), ); if (dis < pow(_Radius, ))
{
//在圆内
discard;
} return color;
}
ENDCG
}
}
FallBack "Diffuse"
}

Shader "Lesson/VFWatermelon" {
Properties {
_LightColor("浅色条纹", Color) = (,,,)
_DarkColor("深色条纹", Color) = (,,,)
_Number("深色条纹数量", int) =
_Width("深色条纹宽度", Range(0.01, 0.2)) = 0.02
}
SubShader{
Pass
{
CGPROGRAM fixed4 _LightColor;
fixed4 _DarkColor;
int _Number;
float _Width;
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc" struct m2v
{
float4 vex : POSITION;
float3 uv : TEXCOORD0;
}; struct v2f
{
float4 position : SV_POSITION;
float3 uv : TEXCOORD0;
}; v2f vert(m2v v)
{
v2f f;
f.position = UnityObjectToClipPos(v.vex);
f.uv = v.uv;
return f;
} fixed4 frag(v2f f) : SV_Target
{
//实现1
//浅色条纹的宽度
float width = 1.0 / _Number - _Width;
for (int i = ; i < _Number; i++)
{
if (f.uv.x > i * (width + _Width) && f.uv.x < width + i * (width + _Width))
{
return _DarkColor;
}
}
return _LightColor;
/*
//实现2
//每对条纹的宽度(1深1浅)
float wid = 1.0 / _Number;
float x = fmod(f.uv.x, wid); //对wid取模(余)
if (x < _Width)
{
return _DarkColor;
}
return _LightColor;
*/
} ENDCG
}
}
FallBack "Diffuse"
}
Unity3D学习笔记(三十五):Shader着色器(2)- 顶点片元着色器的更多相关文章
- 【Unity 3D】学习笔记三十五:游戏实例——摄像机切换镜头
摄像机切换镜头 在游戏中常常会切换摄像机来观察某一个游戏对象,能够说.在3D游戏开发中,摄像头的切换是不可或缺的. 这次我们学习总结下摄像机怎么切换镜头. 代码: private var Camera ...
- PHP学习笔记三十五【Try】
<?php function AddUser($name) { if($name=="张三") { echo "add success"; return ...
- Unity3D学习笔记(十五):寻路系统
动画生硬切换:animation.play();//极少使用,常用融合方法 动画融合淡入:animation.CrossFade(“Idle”, 0.2f);//0.2f为与前一动画的融合百分比为20 ...
- angular学习笔记(三十)-指令(6)-transclude()方法(又称linker()方法)-模拟ng-repeat指令
在angular学习笔记(三十)-指令(4)-transclude文章的末尾提到了,如果在指令中需要反复使用被嵌套的那一坨,需要使用transclude()方法. 在angular学习笔记(三十)-指 ...
- angular学习笔记(三十)-指令(5)-link
这篇主要介绍angular指令中的link属性: link:function(scope,iEle,iAttrs,ctrl,linker){ .... } link属性值为一个函数,这个函数有五个参数 ...
- VSTO学习笔记(十五)Office 2013 初体验
原文:VSTO学习笔记(十五)Office 2013 初体验 Office 2013 近期发布了首个面向消费者的预览版本,我也于第一时间进行了更新试用.从此开始VSTO系列全面转向Office 201 ...
- Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例
目录 前言 搭建项目及其它准备工作 创建数据库 创建Koa2项目 安装项目其它需要包 清除冗余文件并重新规划项目目录 配置文件 规划示例路由,并新建相关文件 实现数据访问和业务逻辑相关方法 编写mys ...
- [转]Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例
本文转自:https://www.cnblogs.com/zhongweiv/p/nodejs_koa2_webapp.html 目录 前言 搭建项目及其它准备工作 创建数据库 创建Koa2项目 安装 ...
- angular学习笔记(三十)-指令(10)-require和controller
本篇介绍指令的最后两个属性,require和controller 当一个指令需要和父元素指令进行通信的时候,它们就会用到这两个属性,什么意思还是要看栗子: html: <outer‐direct ...
- angular学习笔记(三十)-指令(7)-compile和link(2)
继续上一篇:angular学习笔记(三十)-指令(7)-compile和link(1) 上一篇讲了compile函数的基本概念,接下来详细讲解compile和link的执行顺序. 看一段三个指令嵌套的 ...
随机推荐
- 【转】查看sqlserver被锁的表以及如何解锁
查看被锁表: select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sys. ...
- mybatis oracle -批量插入,存在则更新
<insert id="batchUpdatePBWUserInfo" parameterType="java.util.List"> MERGE ...
- 【Linux学习三】VI/VIM全屏文本编辑器
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 一.打开关闭文件打开文件:vim /path/to/somefilev ...
- 【Redis学习之十一】Java客户端实现redis集群操作
客户端:jedis-2.7.2.jar 配置文件两种方式: properties: redis.cluster.nodes1=192.168.1.117 redis.cluster.port1=700 ...
- OpenCV-3.3.0测试
安装包目录下/samples/cpp里是各种例程 其中example_cmake里CMakeLists.txt已写好,直接cmake,make就可以,example.cpp是一个调用笔记本摄像头并显示 ...
- 仿照admin的stark自定义组件的功能实现
仿照admin的stark自定义组件的功能实现:其中最主要的就是增删改查的实现 1.查:首先页面中显示表头和数据,都是动态的,而不是写死的. (1) 先看表头和表单数据:这个是查看的视图函数,但是为了 ...
- 【转载】unittest参数化(paramunittest)
前言 paramunittest是unittest实现参数化的一个专门的模块,可以传入多组参数,自动生成多个用例 前面讲数据驱动的时候,用ddt可以解决多组数据传入,自动生成多个测试用例.本篇继续介绍 ...
- FCoin优势
FCoin优势 顶级技术金融级别的速度和稳定,交易高效有保障:国际顶尖团队自主研发撮合系统,能够每秒处理200万笔交易:证券级先进算法,支持GTT.GTC.FOK.IOC等多种专业交易指令,为交易者提 ...
- Linux:编译安装boost 1.69库
Boost库是为C++语言标准库提供扩展的一些C++程序库的总称,由Boost社区组织开发.维护.在C++的地位感觉可以和Spring在Java中相比. boost向来有准标准库之称,很多新特性例如智 ...
- zabbix 服务端安装(server)
zabbix版本:Zabbix 2.2 LTS 备注:Linux下安装zabbix需要有LAMP或者LNMP运行环境 准备篇: 一.Web环境:Nginx+MySQL+PHP CentOS 7.0编译 ...