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的执行顺序. 看一段三个指令嵌套的 ...
随机推荐
- Java多线程-----线程池详解
1. 线程池的实现原理 提交一个任务到线程池中,线程池的处理流程如下: 判断线程池里的核心线程是否都在执行任务,如果不是(核心线程空闲或者还有核心线程没有被创建)则创建一个新的工作线程来执行任务.如果 ...
- OpenVPN 服务端(pritunl)的一些运维经验
1.当服务端部署在docker中,重启机器之后,docker服务会启动,pritunl的docker容器也会跟着自动启动.但此时,一些系统服务还未完全启动成功,导致会有一些pritunl server ...
- NGINX的几个应用场景
NGINX的几个应用场景 两个参考地址: NGINX的百度百科:https://baike.baidu.com/item/nginx/3817705?fr=aladdin NGINX的中文网站:htt ...
- urllib2 post请求方式,带cookie,添加请求头
#encoding = utf-8 import urllib2import urllib url = 'http://httpbin.org/post'data={"name": ...
- springboot 接收post和get请求
接收post请求: @RequestMapping(value = "/api/v1/create_info", method = RequestMethod.POST) publ ...
- [转载]PowerDesigner生成的ORACLE 建表脚本中去掉对象的双引号,设置大、小写
若要将 CDM 中将 Entity的标识符都设为指定的大小写,则可以这么设定: 打开cdm的情况下,进入Tools-Model Options-Naming Convention,把Name和Code ...
- python初学者必看的学习路线
Python是近几年比较火的编程语言之一,因为人工智能的火爆,让很多人都想从事python开发.很多零基础学员在学习python的时候都会走一些弯路,下面小编就为大家分享python学习路线图,帮助零 ...
- The Little Prince-12/05
The Little Prince-12/05 "When a mystery is too overpowering, one dare not disobey. Absurd as it ...
- 怎样从外网访问内网Django?
本地安装了一个Django,只能在局域网内访问,怎样从外网也能访问到本地的Django呢?本文将介绍具体的实现步骤. 准备工作 安装并启动Django 默认安装的Django端口是8000. 实现步骤 ...
- 学写网页 #06# table
A B E C D <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> & ...