UnityShader之固定管线命令Combine纹理混合【Shader资料4】

Combine,纹理混合。

我们先看圣典上给的解释。

  纹理在基本的顶点光照被计算后被应用。在着色器中通过SetTexture 命令来完成。

  SetTexture 命令在片面程序被使用时不会生效;这种模式下像素操作被完全描述在着色器中。

  

  材质贴图可以用来做老风格的混合器效果。你能在一个通道中使用多个SetTexture 命令 - 所有纹理被顺序的应用,如同绘画程序中的层一样。SetTexture 命令必须放置在通道的末尾

Texture block combine command 纹理块合并命令

combine src1 * src2
Multiplies src1 and src2 together. The result will be darker than either input.
将源1和源2的元素相乘。结果会比单独输出任何一个都要暗
combine src1 + src2
Adds src1 and src2 together. The result will be lighter than either input.
将将源1和源2的元素相加。结果会比单独输出任何一个都要亮
combine src1 - src2
Subtracts src2 from src1.
源1 减去 源2
combine src1 +- src2
Adds src1 to src2, then subtracts 0.5 (a signed add).
先相加,然后减去0.5(添加了一个符号)
combine src1 lerp (src2) src3
Interpolates between src3 and src1, using the alpha of src2. Note that
the interpolation is opposite direction: src1 is used when alpha is
one, and src3 is used when alpha is zero.
使用源2的透明度通道值在源3和源1中进行差值,注意差值是反向的:当透明度值是1是使用源1,透明度为0时使用源3
combine src1 * src2 + src3
Multiplies src1 with the alpha component of src2, then adds src3.
源1和源2的透明度相乘,然后加上源3
combine src1 * src2 +- src3
Multiplies src1 with the alpha component of src2, then does a signed add with src3.
源1和源2的透明度相乘,然后和源3做符号加
combine src1 * src2 - src3
Multiplies src1 with the alpha component of src2, then subtracts src3.
源1和源2的透明度相乘,然后和源3相减

All the src properties can be either one of previous, constant, primary or texture.

所有源属性都可以是previous, constant, primary or texture其中的一个。

  • Previous is the the result of the previous SetTexture.
    上一次SetTexture的结果
  • Primary is the color from the lighting calculation or the vertex color if it is bound.
    来自光照计算的颜色或是当它绑定时的顶点颜色
  • Texture is the color of the texture specified by [_TextureName] in the SetTexture (see above).
    在SetTexture中被定义的纹理的颜色
  • Constant is the color specified in ConstantColor.
    被ConstantColor定义的颜色

Modifiers 解释:

  • The formulas specified above can optionally be followed by the keywords Double or Quad to make the resulting color 2x or 4x as bright.
    上述的公式都均能通过关键字 Double 或是 Quad 将最终颜色调高亮度2倍或4倍。
  • All the src properties, except lerp argument, can optionally be preceded by one - to make the resulting color negated.
    所有的src属性,除了差值参数都能被标记一个-符号来使最终颜色反相。
  • All the src properties can be followed by alpha to take only the alpha channel.
    所有src属性能通过跟随 alpha 标签来表示只取用alpha通道。

Texture block constantColor command (纹理块constantColor 命令)

ConstantColor color
Defines a constant color that can be used in the combine command.
定义在combine命令中能被使用的不变颜色

Texture block matrix command (纹理块matrix命令)

matrix [MatrixPropertyName]
Transforms texture coordinates used in this command with the given matrix.
使用给定矩阵变换纹理坐标 
这个矩阵纹理坐标,官网没有给明确说明,百度谷歌也没有找到相关的资料,我个人的猜想可能是UV的设置。
看到这里,我们大概了解了Combine的用法,它的作用就是将颜色或者纹理相互融合的一个指令。
示例如下:
示例中的previous 表示上一个SetTexture计算的结果,texture表示当前SetTexture的参数纹理,Primary则是当前光照的颜色。如果你的Shader打开了光照,如若参数中不使用Primary的话也是不会有光照效果的。

Shader "Examples/Self-Illumination" {
    Properties {
        _MainTex ("Base (RGB) Self-Illumination (A)", 2D) = "white" {}
    }
    SubShader {
        Pass {
            // Set up basic white vertex lighting
            //设置白色顶点光照
            Material {
                Diffuse (1,1,1,1)//漫反射颜色设置
                Ambient (1,1,1,1)//环境光反射颜色设置
            }
            Lighting On

            // Use texture alpha to blend up to white (= full illumination)
            // 使用纹理Alpha来混合白色(完全发光)
            SetTexture [_MainTex] {
                constantColor (1,1,1,1)    //自定义颜色
                combine constant lerp(texture) previous
            }
            // Multiply in texture
            // 和纹理相乘
            SetTexture [_MainTex] {
                combine previous * texture
            }
        }
    }
}

另外,我们也能只针对取透明度进行计算,如下所示:

缺省情况下,混合公式被同时用于计算纹理的RGB通道和透明度。,如下所示:

SetTexture [_MainTex] { combine previous * texture, previous + texture }

逗号后面的previous + texture表示光照和当前图片纹理混合后的透明度,这个时候输出的结果的透明度就不会再是previous * texture的透明度了。
时间: 2024-10-29 19:08:19

UnityShader之固定管线命令Combine纹理混合【Shader资料4】的相关文章

UnityShader之固定管线Fixed Function Shader【Shader资料3】

Fixed function shader简介:  属于固定渲染管线 Shader, 基本用于高级Shader在老显卡无法显示时的情况.使用的是ShaderLab语言,语法与微软的FX files 或者NVIDIA的 CgFX类似. 1.使用固定管线来显示单一的颜色 Shader "Custom/1_1color" { // 属性 Properties { //定义一个颜色 _Color ("Main Color", Color) = (1,0.5,0.5,1) }

【浅墨Unity3D Shader编程】之三 光之城堡篇:子着色器、通道与标签的写法 & 纹理混合

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/41175585 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] 本文介绍了Unity中子着色器.通道和标签相关的详细概念与写法,以及纹理的设置方法,基本的纹理混合写法,写了5个Shader作为本文Shader讲解的实战内容,最后创建了一个梦幻的光之

Unity3d之Shader编程:子着色器、通道与标签的写法 & 纹理混合

一.子着色器 Unity中的每一个着色器都包含一个subshader的列表,当Unity需要显示一个网格时,它能发现使用的着色器,并提取第一个能运行在当前用户的显示卡上的子着色器. 我们知道,子着色器定义了一个渲染通道的列表,并可选是否为所有通道初始化所需要的通用状态.子着色器的写法如下: Subshader{ [Tags] [CommonState] Passdef [Passdef ...] } 也就是通过可选标签,通用状态 和 一个Pass 定义的列表构成了子着色器. 当Unity选择用于

[Unity] Shader(着色器)之固定管线

在Unity中,固定管线Shader的性能是最好的. 什么是固定管线呢? 固定渲染管线 —— 这是标准的几何&光照(T&L)管线,功能是固定的,它控制着世界.视.投影变换及固定光照控制和纹理混合.T&L管线可以被渲染状态控制,矩阵,光照和采制参数. 下面是一个固定管线Shader的示例: Shader "Sbin/ff1" { // 固定管线 properties { // 变量名("描述名",类型)=值 _Color("主体&qu

第十一章、认识与学习 BASH 管线命令 (pipe)

管线命令使用『 | 』界定符号 [[email protected] ~]# ls -al /etc | less 管线命令『 | 』仅能处理经由前面一个命令传来的正确信息,也就是 standard output 的信息,对于 stdandard error 并没有直接处理的能力. 图 6.1.1. 管线命令的处理示意图 管线命令仅会处理 standard output,对于 standard error output 会予以忽略 管线命令必须要能够接受来自前一个命令的输出数据成为 standa

Linux管线命令 - cut,grep,sort,uniq,wc,tee,tr,col,join,paste,expand,split,xargs

在每个管线后面接的第一个数据必定是『命令』喔!而且这个命令必须要能够接受 standard input 的数据才行,这样的命令才可以是为『管线命令』,例如 less, more, head, tail 等都是可以接受 standard input 的管线命令啦.至于例如 ls, cp, mv 等就不是管线命令了!因为 ls, cp, mv 并不会接受来自 stdin 的数据. 也就是说,管线命令主要有两个比较需要注意的地方: 管线命令仅会处理 standard output,对于 standar

Direct2D开发:纹理混合

转载请注明出处:http://www.cnblogs.com/Ray1024 一.概述 我们都知道Direct2D可以加载并显示图片,但是不知道你有没有想过,这个2D的图形引擎可以进行纹理混合吗?如果可以进行纹理混合,那我们2D的图形引擎就可以做更多的事情,比如蒙版这个概念,我们可以对图片进行更加丰富的操作. 接触过3D渲染知识的人都知道着色器这个东西,在3D渲染中,着色器分为顶点着色器和像素着色器,这里我们主要实现的是类似于3D渲染中的像素着色器的功能,即纹理(图片)混合. 二.思路解析 在D

火云开发课堂 - 《Shader从入门到精通》系列 第七节:在Shader中实现纹理混合

<Shader从入门到精通>系列在线课程 第七节:在Shader中实现纹理混合 视频地址:http://edu.csdn.net/course/detail/1441/22669?auto_start=1 交流论坛:http://www.firestonegames.com/bbs/forum.php 工程下载地址:请成为正式学员获取工程 课程截图: 版权声明:本文为博主原创文章,未经博主允许不得转载.

Linux学习资料-管线命令 ( pipe )

管线命令 ( pipe ) 就如同前面所说的, bash 命令执行的时候有输出的数据会出现!那么如果这群数据必需要经过几道手续之后才能得到我们所想要的格式,应该如何来设定?这就牵涉到管线命令的问题了( pipe ),管线命令使用的是『 | 』这个界定符号!另外,管线命令与『连续下达命令』是不一样的呦!这点底下我们会再说明.底下我们先举一个例子来说明一下简单的管线命令. 假设我们要读取 last 这个指令中,那个 root 登入的『次数』应该怎么作?注意呦!我们只需要『次数』.那么我所进行的步骤是