[unity 基础教程]给着色器shader添加透明属性
2013-08-07 21:13
561 查看
我有个shader文件。内容如下
Shader "HSB_HSV_Colorpicker" {
Properties {
_MainTex ("Texture", 2D) = "white" {}
_HueShift("HueShift", Float) = 0
}
SubShader {
Tags { "RenderType" = "Opaque" }
CGPROGRAM
#pragma surface surf Lambert
#pragma target 3.0
float3 rgb_to_hsv_no_clip(float3 RGB)
{
float3 HSV;
float minChannel, maxChannel;
if (RGB.x > RGB.y) {
maxChannel = RGB.x;
minChannel = RGB.y;
}
else {
maxChannel = RGB.y;
minChannel = RGB.x;
}
if (RGB.z > maxChannel) maxChannel = RGB.z;
if (RGB.z < minChannel) minChannel = RGB.z;
HSV.xy = 0;
HSV.z = maxChannel;
float delta = maxChannel - minChannel; //Delta RGB value
if (delta != 0) { // If gray, leave H & S at zero
HSV.y = delta / HSV.z;
float3 delRGB;
delRGB = (HSV.zzz - RGB + 3*delta) / (6.0*delta);
if ( RGB.x == HSV.z ) HSV.x = delRGB.z - delRGB.y;
else if ( RGB.y == HSV.z ) HSV.x = ( 1.0/3.0) + delRGB.x - delRGB.z;
else if ( RGB.z == HSV.z ) HSV.x = ( 2.0/3.0) + delRGB.y - delRGB.x;
}
return (HSV);
}
float3 hsv_to_rgb(float3 HSV)
{
float3 RGB = HSV.z;
float var_h = HSV.x * 6;
float var_i = floor(var_h); // Or ... var_i = floor( var_h )
float var_1 = HSV.z * (1.0 - HSV.y);
float var_2 = HSV.z * (1.0 - HSV.y * (var_h-var_i));
float var_3 = HSV.z * (1.0 - HSV.y * (1-(var_h-var_i)));
if (var_i == 0) { RGB = float3(HSV.z, var_3, var_1); }
else if (var_i == 1) { RGB = float3(var_2, HSV.z, var_1); }
else if (var_i == 2) { RGB = float3(var_1, HSV.z, var_3); }
else if (var_i == 3) { RGB = float3(var_1, var_2, HSV.z); }
else if (var_i == 4) { RGB = float3(var_3, var_1, HSV.z); }
else { RGB = float3(HSV.z, var_1, var_2); }
return (RGB);
}
struct Input {
float2 uv_MainTex;
};
sampler2D _MainTex;
float _HueShift;
void surf (Input IN, inout SurfaceOutput o) {
o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
float3 hsv = rgb_to_hsv_no_clip(o.Albedo.xyz);
hsv.x+=_HueShift;
if ( hsv.x > 1.0 ) { hsv.x -= 1.0; }
o.Albedo = half3(hsv_to_rgb(hsv));
}
ENDCG
}
Fallback "Diffuse"
[/code]
}
我修改
_MainTex ("Texture", 2D) = "white" {}
Tags { "RenderType" = "Opaque" }
[/code]
为
_MainTex ("Color (RGB) Alpha (A)", 2D) = "white"
Tags { "Queue"="Transparent" "RenderType"="Transparent" }
[/code]
.
添加"alpha":
#pragma surface surf Lambert alpha
[/code]
.
在o.Albedo后添加如下...
o.Alpha = tex2D (_MainTex, IN.uv_MainTex).a;
[/code]
.
大功告成。
Shader "HSB_HSV_Colorpicker" {
Properties {
_MainTex ("Texture", 2D) = "white" {}
_HueShift("HueShift", Float) = 0
}
SubShader {
Tags { "RenderType" = "Opaque" }
CGPROGRAM
#pragma surface surf Lambert
#pragma target 3.0
float3 rgb_to_hsv_no_clip(float3 RGB)
{
float3 HSV;
float minChannel, maxChannel;
if (RGB.x > RGB.y) {
maxChannel = RGB.x;
minChannel = RGB.y;
}
else {
maxChannel = RGB.y;
minChannel = RGB.x;
}
if (RGB.z > maxChannel) maxChannel = RGB.z;
if (RGB.z < minChannel) minChannel = RGB.z;
HSV.xy = 0;
HSV.z = maxChannel;
float delta = maxChannel - minChannel; //Delta RGB value
if (delta != 0) { // If gray, leave H & S at zero
HSV.y = delta / HSV.z;
float3 delRGB;
delRGB = (HSV.zzz - RGB + 3*delta) / (6.0*delta);
if ( RGB.x == HSV.z ) HSV.x = delRGB.z - delRGB.y;
else if ( RGB.y == HSV.z ) HSV.x = ( 1.0/3.0) + delRGB.x - delRGB.z;
else if ( RGB.z == HSV.z ) HSV.x = ( 2.0/3.0) + delRGB.y - delRGB.x;
}
return (HSV);
}
float3 hsv_to_rgb(float3 HSV)
{
float3 RGB = HSV.z;
float var_h = HSV.x * 6;
float var_i = floor(var_h); // Or ... var_i = floor( var_h )
float var_1 = HSV.z * (1.0 - HSV.y);
float var_2 = HSV.z * (1.0 - HSV.y * (var_h-var_i));
float var_3 = HSV.z * (1.0 - HSV.y * (1-(var_h-var_i)));
if (var_i == 0) { RGB = float3(HSV.z, var_3, var_1); }
else if (var_i == 1) { RGB = float3(var_2, HSV.z, var_1); }
else if (var_i == 2) { RGB = float3(var_1, HSV.z, var_3); }
else if (var_i == 3) { RGB = float3(var_1, var_2, HSV.z); }
else if (var_i == 4) { RGB = float3(var_3, var_1, HSV.z); }
else { RGB = float3(HSV.z, var_1, var_2); }
return (RGB);
}
struct Input {
float2 uv_MainTex;
};
sampler2D _MainTex;
float _HueShift;
void surf (Input IN, inout SurfaceOutput o) {
o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
float3 hsv = rgb_to_hsv_no_clip(o.Albedo.xyz);
hsv.x+=_HueShift;
if ( hsv.x > 1.0 ) { hsv.x -= 1.0; }
o.Albedo = half3(hsv_to_rgb(hsv));
}
ENDCG
}
Fallback "Diffuse"
[/code]
}
我修改
_MainTex ("Texture", 2D) = "white" {}
Tags { "RenderType" = "Opaque" }
[/code]
为
_MainTex ("Color (RGB) Alpha (A)", 2D) = "white"
Tags { "Queue"="Transparent" "RenderType"="Transparent" }
[/code]
.
添加"alpha":
#pragma surface surf Lambert alpha
[/code]
.
在o.Albedo后添加如下...
o.Alpha = tex2D (_MainTex, IN.uv_MainTex).a;
[/code]
.
大功告成。
相关文章推荐
- untiy 3d ShaderLab_第 2 章Unity中Shader(着色器)的形态_3_Shader的数据接口:属性和 uniform变量
- Unity Shader Example 25 (在ShaderLab Surface 添加顶点颜色与透明效果)
- [UnityShader基础]Properties属性
- Unity3D Shader官方教程翻译(十九)----Shader语法,编写表面着色器
- Python基础教程——9魔法方法、属性及迭代器【总结】
- Unity透明视频播放 所需的Shader脚本
- Android基础教程——在TextView中显示Html 自定义标签,获取标签属性
- unity基础开发--学习EZGUI教程
- Unity3D Shader官方教程翻译(十九)----Shader语法,编写表面着色器
- unity自发光透明shader
- 【Unity3D教程宝典之Shader篇:基础讲学习方法技巧 】
- [Unity] Shader(着色器)输入输出和语义
- Unity Shader入门精要学习笔记 - 第4章 学习 Shader 所需的数学基础
- Unity Shader入门精要学习笔记 - 第6章 开始 Unity 中的基础光照
- HTML基础教程第2课-HTML基本元素和元素属性
- CodeSmith使用基础教程 四 — 控制台与属性编辑器
- Unity Shader 属性及标签
- Unity着色器教程 | 积雪效果
- AR(增强现实) unity+vuforia 基础教程(1)!
- numpy基础教程—矩阵的简单属性和方法