![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
UnityShader入门学习
文章平均质量分 71
基于《UntiyShader入门精要》的个人研习手册和内容,持续更新
米芝鱼
苦b大学牲,向着unity游戏开发努力中。分享知识,共进!
展开
-
UnityShader(十九) AlphaBlend
Blend SrcFactor DstFactor(开启混合,并设置混合因子。源颜色【该片元产生的颜色】会乘以SrcFactor,而目标颜色【已经存在于颜色缓存中的颜色】会乘以DstFactor,最后两者相加)而对于第一个Pass是开启了深度写入和颜色遮罩进行不输出颜色操作,这样可以解决复杂模型间存在深度的问题效果。当设置为0时意味着该Pass不写入任何颜色通道,即不会输出任何颜色。ColorMask RGB|A|0|任何其它的R、G、B。原创 2024-03-19 10:30:00 · 323 阅读 · 0 评论 -
UnityShader(十七)透明效果
在实时渲染中实现透明效果,通常会在渲染模型时控制它的透明通道(Alpha Channel)。当开启透明混合后,一个物体被渲染到屏幕上时每个片元除了颜色值和深度值外,还有一个透明值,1表示像素完全不透明,0表示完全透明。原创 2024-03-18 14:22:33 · 808 阅读 · 0 评论 -
UnityShader(十八) 透明度测试
其中核心的一块是clip(float x)函数,当x的值小于0时这块偏远会被舍弃,根据一个阈值参数我们进行调控AlphaTest的阈值。(贴图需要有透明度通道)从效果我们也可以看到,AlphaTest的透明效果很极端,要么完全不透明,要么完全透明。原创 2024-03-19 08:00:00 · 174 阅读 · 0 评论 -
UnityShader(十六)凹凸映射
纹理的一种常见应用就是凹凸映射(bump mapping)。凹凸映射目的就是用一张纹理图来修改模型表面的法线,让模型看起来更加细节,这种方法不会改变模型原本的顶点位置(也就是不会修改模型的形状),只是让模型看起来凹凸不平而已。原创 2024-03-17 20:08:45 · 1249 阅读 · 0 评论 -
UnityShader(十五)纹理的属性
它们得到的图片滤波效果依次提升,但需要消耗的性能也依次增大。纹理滤波会影响放大或者缩小纹理时得到的图像的质量。其中有一个WrapMode属性,这个是对于超过纹理边界时使用的模式,默认时Repeat。Filter Mode支持三种模式:Point,Bilinear,Trilinear。对于Filter Mode属性,决定了当纹理变换产生拉伸时将采用何种滤波模式。在Unity中导入一些纹理资源后可以在它的材质面板上调整其属性。在这个面板上有许多可以调整的属性,如纹理类型,纹理形状等。原创 2024-02-04 17:01:17 · 373 阅读 · 0 评论 -
UnityShader(十四)纹理
纹理最初的目的是用一张图片来控制模型的外观。使用纹理映射技术我们可以把一张图“贴”在模型表面,逐纹素(文素的名字是为了和像素进行区分)控制模型颜色。在建模时候,通常会在建模软件中利用纹理展开技术把纹理映射坐标存储到每个顶点上,通常这些坐标用一个二维变量(u,v)表示,其中u为横坐标,v为纵坐标,纹理映射坐标也叫做。原创 2024-02-03 18:00:09 · 341 阅读 · 0 评论 -
UnityShader(十三)Unity内置的函数
normalize(_WorldSpaceCameraPos.xyz-i.worldPosition.xyz) 得到视角方向。normalize(_WorldSpaceLight0Pos.xyz) 得到光源方向(这种方法实际只适用平行光)但是如果需要处理更复杂的光照类型(如点光源和聚光灯),之前的计算方式是错误的。Unity提供了一些内置函数来帮助我们计算这些信息,在之前的章节我们也谈及过。在计算光照模型时我们需要得到许多数据,比如光源方向、视角方向这种基本信息。原创 2024-02-02 20:09:20 · 584 阅读 · 0 评论 -
UnityShader(十二)实现标准光照模型中的高光反射
从公式可以看出 要计算高光反射需要知道四个参数:入射光线的颜色和强度,材质的高光反射系数,视角方向以及反射方向。其中,反射方向r可以由表面法线和光源方向计算得到即:上述公式很简单,Cg也提供了计算反射方向的函数reflecti:入射方向;n:法线方向。可以是float,float2,float3等类型。当给定入射方向i和法线方向n时,reflect函数可以返回反射方向。原创 2024-02-01 14:17:16 · 547 阅读 · 0 评论 -
UnityShader(十一)半兰伯特模型
在平面某点漫反射光的光强与该反射点的法向量和入射光角度的余弦成正比。原创 2024-02-01 12:36:36 · 294 阅读 · 0 评论 -
UnityShader(十)实现标准光照模型中的漫反射光照
从公式可以看出,要计算漫反射需要知道四个参数:入射光线的颜色和强度,材质的漫反射系数,表面的法线和光源方向。为了防止点积的结果为负数,需要使用max操作,Cg提供了这样的函数,使用另一个函数也可以达到同样的目的,即函数。为用于操作的标量或者矢量,可以是等类型。把截取在范围内,如果是一个矢量,那么会对它的每一个分量进行这样的操作。原创 2024-01-31 15:03:11 · 529 阅读 · 0 评论 -
UnityShader(九)Unity中的基础光照(下)
标准光照模型仅仅是一个经验模型,它不完全符合现实世界的光照现象,但是它具有易用性、计算速度和得到的效果都比较好,也被广泛使用。因为广泛使用,它有许多称呼,一些资料会称它为Phong光照模型,在Blinn的方法简化下它也被称为Blinn-Phong光照模型。但这种模型有很多局限性。首先有很多重要的物理现象无法表现,如菲涅尔反射。其次,Blinn-Phong模型时各项同性的,当我们固定视角和光源方向旋转这个表面时反射不会发生任何变化。而有些表面是具有各项异性的。原创 2024-01-31 13:03:45 · 1117 阅读 · 0 评论 -
UnityShader(八)Unity中的基础光照(上)
渲染时如何决定一个像素的颜色呢?从宏观来说,渲染包含两大部分:决定一个像素的可见性和决定这个像素的光照计算,而光照模型就是用于决定在一个像素上进行怎样的光照计算。我们要模拟真实的场景,就需要考虑3中物理现象:1)光线从光源中被发射出来2)光线和场景中的一些物体相交:一些光线被物体吸收,另一些光线被散射到其他方向3)摄像机吸收了一些光产生了一张图像。原创 2024-01-06 12:43:08 · 448 阅读 · 0 评论 -
UntiyShader(七)Debug
(调试),是程序员检查问题的一种方法,对于一个Shader调试更是一种噩梦,这也是Shader难写的原因之一——如果效果不对,我们可能要花费很多时间去查找问题所在。造成这种状况的原因便是Shader中可以选择的调试方法非常有限。原创 2023-12-31 20:20:02 · 731 阅读 · 0 评论 -
UntiyShader(六)Unity提供的Cg/HLSL语义
在之前的案例中我们可以看到,我们编写Shader时会用到一些语义,例如S等。语义实际上就是一个赋给Shader输入和输出的字符串,这个字符串表达了这个参数的含义。通俗来讲,这些语义可以让Shader知道从哪里读取数据,并把数据输出到哪里,它们在Cg/HLSL的Shader流水线中是不可或缺的,但需要注意的是Unity并没有支持所有的语义。通常情况下,这些输入输出变量并不需要有特别的意义,也就是说我们可以自行决定这些变量的用途。原创 2023-12-31 19:12:51 · 1048 阅读 · 0 评论 -
UntiyShader(五)属性、内置文件和变量
目录一、如何使用属性例子ShaderLab中的属性的类型和Cg中的变量的类型之间的匹配关系二、Unity提供的内置文件和变量内置的包含文件内置的变量在一开始我们提到过,材质和UnityShader之间有着密切的练习,我们可以通过材质面板调节属性来达到我们需要的效果,而这些属性就需要写在Properties语义块中。在上一节的例子基础上,现在我们有这样一个需求,需要在材质面板中显示一个颜色拾取器来调节模型在屏幕上显示的颜色,我们修改上一节的代买如下:效果:代码解释:在上面的代码中,我们先添加了Prope原创 2023-12-31 18:04:37 · 1102 阅读 · 0 评论 -
UnityShader(四)一个最简单的顶点/片元着色器
一个模型通常包含了一组三角面片,每个三角面片由三个顶点构成,而每个顶点又包含了一些数据【比如顶点位置,法线,切线,纹理坐标,顶点颜色等】)就是我们指定的函数名,这个函数名不一定是vert和frag,它们可以是任意自定义的函数名(一般我们使用vert和frag这两个函数名,因为它们很直观,但这不是必须的)需要注意的是,顶点着色器时逐顶点调用,而片元着色器是逐片元调用,片元着色器中的输入实际上是把顶点着色器的输出进行插值后得到的结果。顶点着色器只包含了一行代码,这一步就是把顶点坐标从模型空间转换到裁剪空间中,原创 2023-12-31 16:37:30 · 1205 阅读 · 0 评论 -
UnityShader(三)数学基础
一个矩阵可以把一个矢量从一个坐标空间转换到另一个坐标空间,从外观上就是一个长方形的网格,每个格子都放有一个数字。它是由m*n个标量组成的长方形数组。只有一行的成为行矩阵,只有一列的成为列矩阵。变换,指的是我们把一些数据(如点、方向矢量甚至是颜色等)通过某种方式进行转换的过程。原创 2023-12-31 13:27:39 · 1439 阅读 · 0 评论 -
UnityShader(二)Shader基础
总体来说,在Unity中我们需要配合使用材质(Material)和UnityShader才能达到需要的效果一般流程如下:1)创建一个材质2)创建一个UnityShader,并赋给上一步创建的材质上3)把材质赋给渲染的对象4)在材质面板中调整UnityShader的属性UnityShader定义了渲染所需要的各种代码(如顶点着色器和片元着色器)。属性(如纹理等)和指令(如渲染和标签设置等),而,材质允许我们调节这些属性并其最终赋予给相应的模型。原创 2023-12-30 18:02:12 · 1331 阅读 · 0 评论 -
UnityShader(一)渲染流水线
流水线在工厂生产中是一个极为重要的概念,一个完整产品的制作一般会分成许多工序,由不同的部门进行制作,在流水线未被提及时,一般一个产品会一直生产直至生产完成,第二个产品才会继续开始。所谓流水线,就是一个产品进行第一个工序后传递给第二个工序,此时第二个产品进入到第一个工序,这样就提高单位时间的生产量。而渲染流水线的工作任务在于由一个三维场景出发,生成(或者说是渲染)一张二维图像,换句话说,计算机需要从一系列的顶点数据、纹理等信息出发,把这些信息最终转换成一张人眼可以看到的图像。原创 2023-12-30 15:06:03 · 1332 阅读 · 0 评论