unity3d 内部Transparent (透明)shader 代码

这个教程涵盖了各种各样的关于透明纹理贴图的共用,i.e.RGBA 纹理贴图包含了一个A(alpha)部分 是纹理的不透明的值。

它联合了shader的代码关于“Textured sphere”部分的概念,介绍了 “cutaways”和”Transparency”。

如果你没有读过这篇教程,这将会是一个很好的机会来阅读。

丢弃透明片段(Discarding Transparent Fragments)

让我们开始说明丢弃片段的”cutaways”部分。按照这些步骤描述的在”Texture Spheres”部分,并把图像分配给材质球的左边根据以下shader :

Shader "Cg texturing with alpha discard" {
   Properties {
      _MainTex ("RGBA Texture Image", 2D) = "white" {}
      _Cutoff ("Alpha Cutoff", Float) = 0.5
   }
   SubShader {
      Pass {
         Cull Off // since the front is partially transparent,
            // we shouldn't cull the back

         CGPROGRAM

         #pragma vertex vert
         #pragma fragment frag 

         uniform sampler2D _MainTex;
         uniform float _Cutoff;

         struct vertexInput {
            float4 vertex : POSITION;
            float4 texcoord : TEXCOORD0;
         };
         struct vertexOutput {
            float4 pos : SV_POSITION;
            float4 tex : TEXCOORD0;
         };

         vertexOutput vert(vertexInput input)
         {
            vertexOutput output;

            output.tex = input.texcoord;
            output.pos = mul(UNITY_MATRIX_MVP, input.vertex);
            return output;
         }

         float4 frag(vertexOutput input) : COLOR
         {
            float4 textureColor = tex2D(_MainTex, input.tex.xy);
            if (textureColor.a < _Cutoff)
               // alpha value less than user-specified threshold?
            {
               discard; // yes: discard this fragment
            }
            return textureColor;
         }

         ENDCG
      }
   }

   // The definition of a fallback shader should be commented out
   // during development:
   // Fallback "Unlit/Transparent Cutout"
}

片段着色器读取RGBA贴图并与用户指定的范围值大小比较alpha值。如果 alpha值比范围值小,就丢弃着色片段使之透明。注意: 这项指令在某些平台上是非常缓慢的,特别是在移动设备上。因此,混合(blending)通常更有效。

混合(blending)

“Transparency”部分描述了怎样用alpha混合去渲染半透明的物体。在这段代码中用RGBA贴图:

Shader "Cg texturing with alpha blending" {
   Properties {
      _MainTex ("RGBA Texture Image", 2D) = "white" {}
   }
   SubShader {
      Tags {"Queue" = "Transparent"} 

      Pass {
         Cull Front // first render the back faces
         ZWrite Off // don't write to depth buffer
            // in order not to occlude other objects
         Blend SrcAlpha OneMinusSrcAlpha
            // blend based on the fragment's alpha value

         CGPROGRAM

         #pragma vertex vert
         #pragma fragment frag 

         uniform sampler2D _MainTex;
         uniform float _Cutoff;

         struct vertexInput {
            float4 vertex : POSITION;
            float4 texcoord : TEXCOORD0;
         };
         struct vertexOutput {
            float4 pos : SV_POSITION;
            float4 tex : TEXCOORD0;
         };

         vertexOutput vert(vertexInput input)
         {
            vertexOutput output;

            output.tex = input.texcoord;
            output.pos = mul(UNITY_MATRIX_MVP, input.vertex);
            return output;
         }

         float4 frag(vertexOutput input) : COLOR
         {
            return tex2D(_MainTex, input.tex.xy);
         }

         ENDCG
      }

      Pass {
         Cull Back // now render the front faces
         ZWrite Off // don't write to depth buffer
            // in order not to occlude other objects
         Blend SrcAlpha OneMinusSrcAlpha
            // blend based on the fragment's alpha value

         CGPROGRAM

         #pragma vertex vert
         #pragma fragment frag 

         uniform sampler2D _MainTex;
         uniform float _Cutoff;

         struct vertexInput {
            float4 vertex : POSITION;
            float4 texcoord : TEXCOORD0;
         };
         struct vertexOutput {
            float4 pos : SV_POSITION;
            float4 tex : TEXCOORD0;
         };

         vertexOutput vert(vertexInput input)
         {
            vertexOutput output;

            output.tex = input.texcoord;
            output.pos = mul(UNITY_MATRIX_MVP, input.vertex);
            return output;
         }

         float4 frag(vertexOutput input) : COLOR
         {
            return tex2D(_MainTex, input.tex.xy);
         }

         ENDCG
      }
   }
   // The definition of a fallback shader should be commented out
   // during development:
   // Fallback "Unlit/Transparent"
}

未完待续。。。。

by-----wolf96

时间: 2024-10-13 03:06:43

unity3d 内部Transparent (透明)shader 代码的相关文章

【浅墨Unity3D Shader编程】之十三 单色透明Shader &amp; 标准镜面高光Shader

本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://blog.csdn.net/poem_qianmo/article/details/50878538 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 本文工程使用的Unity3D版本: 5.2.1  本次更新放出的Shader为透明系列的3个Shader和标准的镜面高光Shader的两个Shader.由易到难,由入门级到应用级,难度梯度合理. 依然是先放出游戏场景的exe

unity3d游戏开发之简单的透明shader技能培训

下面我们开始今天的Unity3D游戏开发技能透明shader技能培训. 我们学习Unity3D培训目标:让U3D初学者可以更快速的掌握U3D技术,自行制作修改素材,可以独立完成2D.3D小规模游戏及网页游戏开发. [plain] view plaincopy // Shader created with Shader Forge Beta 0.34 // Shader Forge (c) Joachim Holmer - http://www.acegikmo.com/shaderforge/

Unity3D教程宝典之Shader篇:第四讲制作一个美丽的地球

原创文章如需转载请注明:转载自风宇冲Unity3D教程学院 Vertex and Fragment Shader例子二,制作一个自动旋转的3D地球. 下载美丽的地球工程 原理是 2张贴图,一张地球图,一张云层分布图(1)通过uv.x即纹理坐标的横轴与时间相乘,产生球在移动的效果 (2)通过地球和云的颜色值叠加形成 层叠 的效果.注意:贴图的'Wrap Mode'属性一定要设置成Repeat                              关于Wrap Mode当Wrap Mode为Cl

Unity3D教程宝典之Shader篇:第一讲Shader总篇

原创文章如需转载请注明:转载自风宇冲Unity3D教程学院 引言,在Unity3d里,所有的图形绘制都必须通过Shader,即着色器.一般的使用过程中,我们用到的都是unity自带的Shader,即build-in shader.学习Shader后,自己写的Shader能做出很多你想要的特殊效果,增强游戏的画面表现.例如 水的倒影. LOGO的光影闪过等等效果等等. Shader的分类 Shader按管线分类一般分为固定渲染管线与可编程渲染管线 1)固定渲染管线 ——这是标准的几何&光照(Tra

Unity3D教程宝典之Shader篇:第二十四讲Reflection Mapping

转载自风宇冲Unity3D教程学院 简介 Reflection Mapping,又叫Environment Mapping.对应TexGen的SphereMap和CubeReflect.是最快的reflect周围环境的算法 最早出现的是Sphere Mapping,之后被Cube Mapping取代.Reflection Mapping比射线追踪(Ray Tracing)高效得多 Reflection Mapping的前提是2个假设 (1)入射线来自无限距离 (2)物体是凸的,没有自身的相互反射

为sharepoint的内部页面添加后台代码

我们知道,存储在数据库里的SharePoint页面是不能直接添加后台代码的,这给我们带来了很多的不方便,比如想要在页面上实现一些东西,都必 须使用Webpart或者自定义控件的方式,哪怕仅仅是很简单的几行后台代码.而WSS 3.0 是基于ASP.NET 2.0的,在ASP.NET站点里使用的任何技术在WSS站点里同样可以使用.因此我们同样可以给WSS站点的页面添加后台代码. 存储在数据库中的sharepoint页面分为两部门,母板页和内容页,我们可以为这两种页面分别添加后台代码.实现方式不一样,

unity3D 游戏开发之工程代码框架设计思路MVC

unity3D 游戏开发之工程代码框架设计思路MVC 设计目的 1.使工程结构更规范. 2.提高代码可读性,封装性,拓展性 3.提高工作效率. 正文内容: 1.Frame的组成结 (1)视图层(View) (2) 控制层(Control) (3)数据层(Model) 整个Frame是由这三个部分组成,每一层管理属于自己的逻辑,核心思想是游戏逻辑和UI 逻辑独立开.目前遇到的项目工程大多数View和Control逻辑都写在一起,这样后期修改 和维护效率会很低,因为耦合性很高而View又是经常要修改

Shader 1:能接受阴影的透明shader

第一次接触Shader,项目需要,直接说需求吧,需要一个透明并且能接受阴影的shader.unity系统自带的shader已经满足不了了.上一段代码吧 Shader "GreenArch/Transparent Plane Shadow2" { Properties { } SubShader { Tags { "RenderType"="Opaque" } Pass { Name "DEFERRED" Tags { &quo

Unity3D教程宝典之Shader篇:第十三讲 Alpha混合

转载自风宇冲Unity3D教程学院 Alpha Blending,中文译作Alpha混合 Blending就是控制透明的.处于光栅化的最后阶段. 这里例如我们给一个模型贴一个材质,那么在某个点计算出来颜色值称为源,而该点之前累积的颜色值,叫目标. 语法 Blend Off     不混合 Blend SrcFactor DstFactor  SrcFactor是源系数,DstFactor是目标系数 最终颜色 = (Shader计算出的点颜色值 * 源系数)+(点累积颜色 * 目标系数) 属性(往