真假比特派钱包怎么区分|blin
哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
首页番剧直播游戏中心会员购漫画赛事下载客户端上B站看两会动态热门番剧电影国创电视剧综艺纪录片动画游戏鬼畜音乐舞蹈影视娱乐知识科技资讯美食生活汽车时尚运动动物圈VLOG搞笑单机游戏虚拟UP主公益公开课更多专栏直播活动课堂社区中心新歌热榜正在直播LPL:JDG vs UP!110.1万97801:15语文课本中那些让你意难平的课文小时候de记忆_· 2-2973.1万53605:58刺激!女友半夜让我进屋...我害怕了起来!三十六贱笑· 3-191.2万57202:31两万买的国际航班报废了!德国机场为啥罢工啊?西班牙陈挺· 3-341.5万19102:45一条视频,广州土著带你吃遍广州~干饭大番薯· 3-355.8万125104:42《登山是你的谎言》郑凯伦伦伦· 3-426.2万192009:23城中村的快餐真便宜,吃完去新网吧通宵,键盘竟然还是曼巴定制款小A在上网· 3-528.3万7702:23缺斤少两的烤羊腿 后续出结果了灰鸽子美食排雷· 3-37.8万18105:46第166集:天骄柳自如?小小赖狗· 20小时前78.2万93004:01刚开学,老师被抓了怎么办啊哈哈哈哈哈哈一只大哈鱼· 3-220.4万11902:53配色舒适!这些秀场穿搭就很适合日常借鉴!会唱跳Rap的胖虎· 3-2
入门Shading,详解Blinn-Phong和Phong光照模型 - 知乎
入门Shading,详解Blinn-Phong和Phong光照模型 - 知乎切换模式写文章登录/注册入门Shading,详解Blinn-Phong和Phong光照模型小菠萝的IT之旅淡泊名利,宁静致远;不念过往,不畏将来;滴水之恩,涌泉相报。ShadingShading 的定义Shading 中文译为着色,可以为某个物体的,某一个区域进行上色以及对其明暗程度的操控。我们看到不同的物体可以呈现出不同的材质以及明暗程度,正是因为 Shading,使物体表面每一个像素点都能够呈现出不同的颜色。Shading 理解成为一个物体应用上某种材质。Blinn-Phong 反射光模型该模型能够简单地描述物体表面对光的吸收和反射,使物体表面呈现出不同的明暗程度,但其不是最真实的一种反射光模型。引入该模型的原因:它能够用尽量简单的数学原理尽可能解释物体表面呈现出不同颜色及明暗程序的原因。在现实世界中有三种光照类型:「高光」:物体完全反射光源照射到表面的光照到人眼「漫反射光」:物体朝着任意方向反射相同亮度的光照到人眼「环境光」:物体表面完全背对光源,但其它物体反射光照照射到该物体表面上,再通过该物体反射光照到人眼同样,在图形学中也需要讨论这三种光照,Bling-Phong 模型可以近似地模拟漫反射光照,但不完全准确。我们聚焦在物体局部上的某一个点,Shading 是对物体上的每一个点进行着色。在计算机中的计算目标是:从物体表面的每一个点通过反射光到摄像机呈现的颜色值。我们能看到上面有三个向量:Light Direction:向量 l 代表光源的直射方向Surface Normal:向量 n 代表物体表面的法线方向View Direction:向量 v 代表视线方向漫反射光漫反射光是物体表面向四面八方反射相同强度的能量,所以:无论从哪个视角看同一个点,都应该呈现出相同的颜色。我们首先两种考虑特殊情况:法线方向与光照方向平行或垂直注意下图黑色边框表示物体表面。上图左边是平行关系,此时表面着色点可以接收到所有的漫反射光进行反射,而右图相反,物体表面完全与光线没有任何接触,此时漫反射光的能量为 0考虑到一般情况,涉及到一个定理:Lambert's cosine law(朗伯特余弦定律)该定律表明:物体表面接收到光的能量与法线方向、光照方向两者夹角的余弦值成正比关系。此时我们已经知道物体的每一个着色点能够接收多少的光能量了:cosθ = l · n。 值得注意的地方是由于 l 和 n 都只表示方向,所以采用单位向量,所以它们的长度都为 1,即:|l| = |n| = 1,所以上面的式子才成立。 接下来我们需要知道:从光源到物体表面发射的能量光是多少?忽略其它能量损失,假设有一个点光源,发射出来的能量光在单位球上的能量表示为 I,同一个点上的能量随着光不断向外传播而逐渐减少, 根据能量守恒定律,每一个球面上的总能量都是相同的。光在传播了半径为 r 的球表面上,此时该表面上的光强度I'是多少?由于存在能量守恒定律,且假定各点上的光能量强度是相同的,所以可以得到一个比例关系:1^24ΠI = r^24ΠI' => I' = \frac{I}{r^2} \\所以,我们可以得到无论在任何远的地方,只要有点光源的单位强度I和传播距离r,即可计算出发射在物体表面的光强度。最后还需要计算:物体表面着色点反射多少能量光给摄像机接收?每一个着色点都有不同的光吸收率,这与该着色点的颜色相关,这里举一个例子会很好理解: 我们平时在生活中穿黑色衣服,被太阳光照射时还是黑色,但是当我们穿着白色衣服的时候,如果太阳光是黄色的,那么衣服上也会反射出黄色的光,被人眼接收,看到黄色的衣服。 对应着在计算机里面也是一样的,用一个系数K_d表示该着色点的光吸收率,范围是[0, 1],如果该系数是 0,证明该着色点完全吸收能量,反之,如果是 1,代表该店完全不吸收能量。再抽象一些,我们可以把这个系数看作是:「RGB颜色值」当K_d = 0时,此时对应着RGB值是:[0, 0, 0],在计算机里表示为黑色,黑色正是完全吸收光的颜色,反之,当K_d = 1时,对应着 [255, 255, 255],在计算机里表示为白色,白色正是完全反射光的颜色。上图可以看到,点光源在左上角处,随着K_d越来越大,左上角的物体表面反射光能量越来越多,而右下角处于背光处,所以完全没有光,越往中间部分,法线方向与光照方向的夹角越来越大,所以接收的光能量越来越少,符合 Blinn-Phong 模型。高光高光的产生:在物体表面的观察角度与光源角度正好是镜面对称时,即可看到高光抽象到计算机图形学中,我们定义向量R是镜面反射方向,当观察方向V与R越接近时,高光部分越明显。我们可以通过计算R和V的接近程度来确定看到的高光强度,但是:在计算机中计算反射向量R的计算量非常大。所以,Blinn-Phong光照模型提出使用另一种计算方法:「半程向量」通过上图可以发现,物体表面一点的法线方向正好是光源方向l和镜面反射方向R的角平分向量。同样,我们知道视角V和光源l,可以很容易的计算出它们的角平分向量h,而该向量就称为半程向量。通过比对法向量n和半程向量h的接近程度,用角度α表示:cosα = \frac{n·h}{|n||h|} = n·h \\由于cosα∈[0, 1]可以表示物体表面该点反射的高光强度,所以我们可以得到计算高光的公式:L_s = K_s(\frac{I}{r^2})max(0, cosα)^p = K_s(\frac{I}{r^2})max(0, n·h)^p \\注意:K_s依旧表示物体表面该点对光的吸收率,在计算机中用RGB值表示。最后带有一个指数p,该指数用于加快函数的衰减程度,由于在物理世界中高光存在于物体表面很小的一部分,而cosα的衰减速度太慢,通过携带指数,可以促进衰减速度,使得高光只能在与法线向量n非常接近的情况下才能被视角看见。 实际上允许使用视角向量v和镜面反射向量R的接近程度来计算高光,而这种计算方式就称为 Phong 模型,Phong模型与Bling-Phong模型产生的高光效果不一样,Bling-Phong产生的高光更加柔和。 环境光环境光是照射在其它物体上的光先反射到观察物体上,通过观察物体表面再反射至视角中。在 Blinn-Phong 模型中,举出了一个非常大胆的假设:物体表面接收到的各种环境光都是相同强度的。当然,这并不符合常理,但是可以大大简化了计算环境光的步骤,强度相同,意味着反射光的强度也相同,而由于环境光来自四面八方的物体反射,所以该物体表面反射环境光的方向也是四面八方的,那么:环境光与光源的角度无关,与观察角度也无关,所以它是一个常数。计算环境光的公式非常简单,只需要得到物体表面的环境光吸收率和环境光的强度即可:L_a = K_a I_a \\三种光的叠加效果最后,将漫反射光、高光和环境光作用在物体表面上的效果叠加在一起,就可以得到近似于物理光照的效果。L = L_a + L_d + L_s \\我们可以拆分来看:第一幅图:由于环境光是常数,所以作用在物体的每一个点上都有相同的光强度效果。第二幅图:漫反射光与观察视角相关,所以观察视角与物体表面顶点法线越接近,光强度越大。第三幅图:高光和观察的视角密切相关,只有半程向量与顶点法线偏差非常小时,才能看到高光效果。Blinn-Phong 和 Phong 的高光我自己画了两幅图来分别计算Blinn-Phong模型和Phong模型的高光项。半程向量的计算非常简单:只需要将ViewDir和LightDir相加,根据平行四边形法则就可以得到办成向量h,然后进行规范化。Phong模型的反射向量计算消耗虽然说不上非常大,但个人感觉还是比Blinn-Phong的计算量要大些,因为反射向量涉及到向量的点乘等操作,这里不过多解释了,可以搜一下:如何计算反射向量。总结Phong 模型与Blinn-Phong 模型的本质区别在于高光项的计算,它们营造出的图形效果是不相同的,Blinn-Phong会更加柔和贴近真实一些。而造成这种原因的关键就在于高光项的计算方式不同,可以细细体会一下上面我画的两幅图的计算方式。而 Blinn-Phong 模型是一种理想化的经验模型,忽略各种能量损失,模拟物体表面着色点对光的三种反射叠加效果,它奠定了后面其它所有光照着色模型的基础。参考资料B站:彦令琪老师《Games101-现代计算机图形学入门》教程:Learning OpenGL 如有任何侵权嫌疑,请务必联系作者,立即删除本文!编辑于 2021-05-18 11:12计算机图形学物理光学赞同 603 条评论分享喜欢收藏申请
Blinn-Phong光照模型从定义到实现,一文就够了(1.5w字) - 知乎
Blinn-Phong光照模型从定义到实现,一文就够了(1.5w字) - 知乎首发于计算机图形学切换模式写文章登录/注册Blinn-Phong光照模型从定义到实现,一文就够了(1.5w字)Ruyi YUnity光照基础为什么可以看到颜色从物理学的角度来看,没有光就没有色,牛顿在1666年的时候做过一个著名的色散实验,使用三棱镜将阳光散射成七色光,并且之后大量的科学实验也证明,色彩是以色光为主体的客观存在,对于人则是一种视象感觉,产生这种感觉基于三种因素:一是光二是物体对光的反射三是人的视觉器官——眼睛(三维世界中的摄相机)不同频率的可见光投射到物体上,有一部分频率的光被吸收,一部分频率的光被反射出来刺激人的眼睛,经过视神经传递到大脑,形成对物体的色彩信息,即人的色彩感觉。用人话说就是能看到颜色是因为物体对光的反射进入了人眼。Blinn-Phong模型Blinn-Phong光照模型,又称为Blinn-phong反射模型(Blinn–Phong reflection model)或者 phong 修正模型(modified Phong reflection model),是由 Jim Blinn于 1977 年在文章中对传统 phong 光照模型基础上进行修改提出的。它是一个经验模型,并不完全符合真实世界中的光照现象,但由于实现起来简单方便,并且计算速度和得到的效果都还不错,因此在早期被广泛的使用。它将进入摄像机的光线分为三个部分,每个部分使用一种方法来计算它的贡献度,这三个部分分别是环境光(Ambient)、漫反射(Diffuse)和高光反射(Specular)。也就是说,只要将上述的三种光计算出来,就可以实现Blinn-Phong模型的效果了。在计算之前,我们先定义一些基本的向量,因为只表示方向,默认它们都为单位向量。Viewer direction,观察方向,使用v表示Surface normal,法线方向,使用n表示Light direction,光线方向,使用l(小写的L)表示环境光(Ambient)环境光也称间接光,是光线经过周围环境表面多次反射后形成的,利用它可以描述一块区域的亮度,在光照模型中,通常用一个常量来表示。漫反射(Diffuse)当光线照射到一个点时,该光线会被均匀的反射到各个方向,这种反射称为漫反射。也就是说,在漫反射中,视角的位置是不重要的,因为反射是完全随机的,因此可以认为漫反射光在任何反射方向上的分布都是一样的,如下图所示那影响漫反射光照强度的因素有哪些呢?入射光线与法线的夹角(入射光线角度)入射光线自身的强度入射光线与法线的夹角假设有一块很小的区域dA。当法线向量n与光照向量L平行时,区域dA受到的光线照射最多。随着n和L之间的夹角θ逐渐增大,区域dA*受到的光线照射量会越来越少 (因为很多光线都无法照射到dA表面上了)。冬天的时候我们觉得很冷,夏天又非常热,主要也是太阳光线与地面形成的夹角变化造成的。兰伯特余弦定律(Lambert Consine Law)中指出,漫反射的大小取决于表面法线和光线的夹角,当夹角越大时,漫反射分量越小,当夹角接近90度时,我们认为漫反射几乎为零。也就是说,反射光线的强度与表面法线和光源方向之间夹角的余弦值成正比。当表面法线与光线的夹角大于90度,它们的余弦值小于0,这没有实际意义,因此将其置为0,可以用下面的公式表示f(θ) = max(0,cosθ) = max(0,L•n)\\ L•n就是求L在n上的投影,下面是该函数的图像表示入射光线强度灯光的强度会随着距离的增加而衰减,这是显而易见的。假设我们有一个光源,在距离它单位1的圆上(图中最内圈)每一个点接收到光的强度是I。那么根据能量守恒定律,且不考虑衰减,在距离光源r位置的圆上每个点接收到光的强度就是I/r2。现在我们可以得出漫反射的公式L_d = k_d(I/r^2)max(0,n·L)\\其中Ld为漫反射光照,kd为物体表面的反射系数(reflection coefficient),I/r2是当前点接受的光照强度,max(0,L•n)是当前点接受到的能量。什么是反射系数?反射系数指光(入射光)投向物体时,其表面反射光的强度与入射光的强度之比值(有多少入射光能够被反射出去,其值介于0~1之间),受入射光的投射角度、强度、波长、物体表面材料的性质以及反射光的测量角度等因素影响。一般来讲,在颜色系列中,黑色的反射系数较小,为0.03,白色的反射系数较大,为0.8。(百度百科)高光反射(Specular)高光反射也称为镜面反射,若物体表面很光滑,当平行入射的光线射到这个物体表面时,仍会平行地向一个方向反射出来。下图中一根入射光线l,照射在光滑的平面上,会沿着R方向反射,由于平面并非完全光滑,所以反射光的方向并非只有R一个点,而是R周边的一小块区域,只要眼睛(摄像机)在R附近都可以看得到,越靠近R反射光照强度越大。我们可以得出一条结论:高光反射和观察角度有关。phong模型中认为,高光反射的强度与反射光线R和观察角度v之间夹角的余弦值成正比。计算它的强度,相当于是求向量v在R上的投影。怎么求R呢?设l与n之间的夹角为θ,将m与l的顶部相连,并且m垂直n,向量p的绝对值|p|是l在n上的投影根据一些已有的知识容易得出R = 2m - l\\ 现在变成了怎么计算mm = l - p\\ 因为|p|是l在n上的投影p = |p| · \frac{n}{|n|}\\ |p| = |l|cosθ\\ cosθ = \frac {l · n}{|l|·|n|}\\ 结合上面三个公式可得:p = |l|\frac {l · n}{|l|·|n|} · \frac{n}{|n|} = \frac{l·n}{|n|^2}·n\\ 因为n是单位向量,所以|n|=1,现在已经具备求出投影R的条件了R = l - 2(l·n)·n\\ 完整的高光反射公式可以表示为:L_s = k_s (I/r^2)max(0,cosα)^p = k_s (I/r^2)max(0,v·R)^p\\ 其中ks是高光反射系数,I/r2是当前点接受的光照强度。为什么要加一个p次方呢?这是为了控制高光反射面积的大小和能够看到高光的范围。当p的值越大,反射面积(能看到高光的范围)越小,如下图所示下图中许多小球,展示了反射系数和p值变动对高光反射效果的影响。使用半程向量(Bisector)计算反射光线R虽然不是很难,但还是有点繁琐,有没有其他方法计算呢?Blinn提出了一个简单的修改方法来得到类似的效果,通过对向量l和向量v取平均然后归一化得到一个新的向量h,其中h被称为半程向量(bisector),使用h与法线n点乘来计算高光,这样就可以避免计算R了。h = \frac{l + v}{|l| + |v|}\\ 使用半程向量计算的公式和之前类似,不过计算的时候简单了一些,具体公式如下。L_s = k_s (I/r^2)max(0,cosα)^p = k_s (I/r^2)max(0,n·h)^p\\ Unity Shader语法入门基本概念已经讲完了,在用代码实现光照之前我们需要对Unity的Shader有个基本的了解,可以跟着我一起实现效果。开始请的准备 首先创建一个场景,并且在场景中原点的位置放置一个小球,调整摄像机位置,如下所示将天空盒关闭,因为天空盒会用作背景,并且拥有环境光等属性,会对场景中的效果有一定的影响。在Window -> Rendering -> Lighting Settings -> Scene中,先去掉Skybox Material,然后将Environment Lighting的Source选择为Color,调整Ambient Color为纯黑色。正如你看到的那样,球体会变更暗,背景变为深蓝色,这颜色从哪里来的呢?这其实是Main Camera的背景(Background)颜色。为了进一步简化,我们将场景中的直接光(Directional Light)删除或禁用,这时小球将完全变成黑色Unity怎么知道如何绘制一个物体呢?这得了解网格(Mesh)的相关概念Mesh:模型的网格,包括顶点坐标,法线,纹理坐标,三角形绘制序列等其他有用属性和功能。Mesh Filter:网格过滤器,它包含一个Mesh组件,并且会将这个Mesh传递给Mesh Renderer组件进行渲染。Mesh Renderer:网格渲染器,获取Mesh Filter传过来的Mesh,按照所在游戏物体变换组件(Transform,用来更改网格的位置、方向和大小)定义的位置渲染Mesh。也就是说,Unity通过Mesh Filter获取物体的Mesh,并且将该Mesh传递给Mesh Renderer进行绘制。Unity Shader 基础知识先创建一个Shader,通过"Assets -> Cretae -> Shader -> Unlit Shader"创建一个脚本文件,将其命名为“First Shader”。Unity提供了四种Shader模板,它们有什么区别?Standard Surface Shader会产生一个包含了标准光照模型(使用了Unity 5中新添加的基于物理的渲染方法)的表面着色器模板Unlit Shader则会产生一个不包含光照(但包含雾效)的基本的顶点/片元着色器Image Effect Shader则为我们实现各种屏幕后处理效果提供了一个基本模板Compute Shader会产生一种特殊的Shader文件,这类Shader旨在利用GPU的并行性来进行一些与常规渲染流水线无关的计算接着创建一个材质(Material),通过"Assets -> Cretae -> Materail"创建一个材质球,命名为“FirstMat”,用刚刚创建的Shader文件给它赋值,并且将材质球赋值给小球。shader名称打开“First Shader”文件,首先我们看到的是shader名称Shader "Unlit/FirstShader"
名字由一个字符串来定义,可以通过‘/’控制它在材质面板中显示的位置属性(Properties)Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
声明属性是为了方便在材质面板中调整它的值,属性名称通常以下划线('_')开始,基本格式为属性名("在材质球(Material)上展示的名称",属性类型) = 默认值。Properties中支持的属性类型如下图所示对于Int、Float、Range这些数字类型的属性,其默认值就是一个单独的数字;对于Color和Vector这类属性,默认值是用圆括号包围的一个四维向量;对于2D、Cube、3D这3种纹理类型,默认值的定义稍微复杂,它们的默认值是通过一个字符串后跟一个花括号来指定的,其中,字符串要么是空的,要么是内置的纹理名称,如“white”、“black”、“gray”或者“bump”。例如声明如下属性Properties
{
_MainTex ("Texture", 2D) = "" {}
_MainColor("Main Color",Color) = (1,1,1,1)
_NoiseMap("NoiseMap", 2D) = "" {}
_Cutout("Cutout", Range(0.0,1.1)) = 0.0
_Speed("Speed", Vector) = (.34, .85, .92, 1)
}
其在材质球面板显示为子着色器(SubShader)SubShader用于将 Shader 对象分成多个部分,分别兼容不同的硬件、渲染管线和运行时(Runtime)设置。当Unity需要加载这个Unity Shader时,会扫描所有的SubShader语义块,然后选择第一个能够在目标平台上运行的SubShader。如果都不支持的话,Unity就会根据Fallback语义使用指定的Unity Shader。一个SubShader通常包含下面内容:有关此SubShader与哪些硬件、渲染管线和运行时设置兼容的信息标签(Tags),用来提供有关SubShader相关信息的键值对一个或多个通道(Pass)SubShader
{
//标签属性,分两种,一种是SubShader层级,另一种是Pass层级
Tags { "RenderType"="Opaque" }
//Level of Detail,当LOD的值小于设定值时,相应的shader不会工作
//https://blog.csdn.net/zx1091515459/article/details/104488774/
LOD 100
Pass
{
...
}
}
通道(Pass)Pass是Shader对象的基本元素,一个Pass对应一个真正意义上运行在GPU上的完整着色器(Vertex-Fragment Shader) ,一个SubShader中至少包含一个Pass,但也可以包含多个。Pass语句块中的内容与渲染管线的流程是近似对应的:首先定义需要的模型数据appdata将数据类型传递给顶点Shader(vert函数)进行处理顶点着色器处理完的数据v2f返回进行图元装配和光栅化(硬件实现)将结构体v2f的数据传递给片元着色器(frag函数)处理比如要渲染一个小球,至少要先知道小球的位置(顶点),因为顶点的值是使用模型空间的坐标表示的,所以需要将它输入给顶点着色器进行坐标转换,接下来通过图元装配将顶点组合成三角面等图元,光栅化之后传递给片元Shader进行着色 当然这个只是一个大致的过程,并不完成,详细内容可以在笔者的前一篇文章渲染管线基础中查看。手动用代码实现一下//详见: https://docs.unity3d.com/cn/current/Manual/SL-Pass.html
Pass
{
//Shader代码正式开始 与ENDCG对应
CGPROGRAM
//指定一个名为"vert"的函数为顶点Shader
#pragma vertex vert
//指定一个名为"frag"函数为片元Shader
#pragma fragment frag
// 雾效开关
#pragma multi_compile_fog
//引用内置文件库,里面提供了很多现成的函数
#include "UnityCG.cginc"
//定义结构体
//CPU向顶点Shader提供的模型数据,比较重要,后面会具体讲
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
//自定义数据结构体,顶点着色器输出的数据,也是片元着色器输入数据
struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
};
//Shader内的变量声明,与Properties模块内的参数对应
sampler2D _MainTex;
//声明一个变量,固定写法 纹理名_ST(Scale , Translation)
//用来获取该纹理的缩放和平移,其中_MainTex_ST.xy是缩放值,_MainTex_ST.zw是偏移值
//可以在材质面板的Tiling和Offset中进行调节,后续文章讲纹理的话会详细讲解
float4 _MainTex_ST;
//顶点函数
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}
//片元处理函数
fixed4 frag (v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv);
// apply fog
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
//Shader代码块结束
ENDCG
}
Unity支持的语义上面Pass语句块的结构体里面定义了许多语义,比如POSITION、TEXCOORD0、SV_POSITION等,它们都具有特殊的含义。CPU传递数据给顶点着色器的常用语义这些语义主要是告诉程序自己需要哪些数据,比如代码float4 vertex : POSITION;就是告诉程序将模型空间中顶点的位置赋值给vertex变量。顶点着色器传递数据给片元着色器的常用语义上面的语义中,除了SV_POSITION具有特别含义,其他语义对变量的含义没有明确要求,也就是说,我们可以存储任意值到这些语义描述变量中。通常,如果我们需要把一些自定义的数据从顶点着色器传递给片元着色器,可以选用TEXCOORD0等。片元着色器的输出语义Shader数据类型和精度float:高精度浮点值,一般是32位。完整的 float 精度通常用于世界空间位置、纹理坐标或涉及复杂函数(如三角函数或幂/取幂)的标量计算。half:中等精度浮点值,通常为16位(范围为 –60000 至 +60000,精度约为 3 位小数)。半精度对于短矢量、方向、对象空间位置、高动态范围颜色非常有用。fixed:低精度定点值,通常是 11 位,范围从 –2.0 到 +2.0,精度为 1/256,对于常规颜色(通常存储在常规纹理中)以及对它们执行简单运算非常有用。int:整数类型,通常用作循环计数器或数组索引。矢量:使用基本类型创建的矢量,例如float3表示float组成的三维矢量,包括x、y和z三个分量,half4表示half组成的四维矢量,包含x、y、z和w分量,在处理颜色的时候,通常使用r、g、b和a来表示四个分量。纹理:sampler类型,例如sampler2D _MainTex; samplerCUBE _Cubemap;具体内容参照Unity官方文档:着色器数据类型和精度从头开始我们将之前创建的Shader文件中的内容清空,写一个可以手动调节材质颜色的简单Shader,加深对Shader代码的理解Shader "Unlit/FirstShader"
{
}
现在小球变成了粉红色,这是因为Shader代码出现了错误,希望使用这种颜色来引起开发者的注意(不得不说,很有少女心 )。接下来在代码中添加一个包含通道(Pass)的子着色器(SubShader)模块SubShader
{
Pass
{
}
}
现在我们的Shader已经没有错误信息了,小球也变成了白色。接下来在Pass块中写具体的代码,实现顶点着色器和片元着色器。Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
//SV : 系统值(System Value)
float4 vert(float4 pos : POSITION) : SV_POSITION
{
return pos;
}
//SV_TARGET:顶点程序的输出将用作片段程序的输入。
float4 frag(float4 position : SV_POSITION) : SV_TARGET
{
return (1,1,1,1);
}
ENDCG
}
顶点着色器函数后面添加了SV_POSITION,这是CG/HLSL固定的语义,告诉系统输出的是顶点位置。片元着色器也有SV_TARGET语义,这是为了告诉系统颜色输出的位置。我们得到的效果是什么样的呢?可以看到,小球变成了椭圆形的,哪里出了问题呢?在上一节中讲过,顶点着色器的任务之一是坐标转换,我们自己实现的vert函数并没有对顶点做任何处理,而是将其直接返回,顶点坐标不对当然会出现错误啦。Unity为我们提供了坐标转换函数UnityObjectToClipPos(),它可以将顶点从模型空间转换到裁剪空间。修改vert函数为float4 vert(float4 pos : POSITION) : SV_POSITION
{
return UnityObjectToClipPos(pos);
}
ok,小球回到了原来的样子 形状可以正常展示,接下来给小球上色。首先需要定义属性(Properties),方便在材质面板中调整它的值。Properties
{
_Tint("MainColor",Color) = (1,1,1,1)
}
在Pass块定义_Tint变量,定义的变量名称和属性名一致时,将可以得到属性的值,修改frag函数float4 _Tint;
float4 frag(float4 position : SV_POSITION) : SV_TARGET
{
return _Tint;
}
现在我们调整材质面板中MainColor的值,小球的颜色也会跟着变化了。想要进一步了解Shader,推荐阅读书籍《Unity Shader入门精要》。标准光照模型的实现环境光环境光最简单了,可以直接在Window -> Rendering -> Lighting Settings -> Scene中进行设置。漫反射先来回顾一下漫反射的公式L_d = k_d(I/r 2)max(0,n·L)\\ 也就是说,要计算出漫反射的值,我们需要知道反射系数(kd,可以自行模拟)当前点接受的光照强度(I/r2),在Unity中,使用Direction Light时不需要考虑强度衰减物体表面法线以及入射光照的方向漫反射有两种实现方式,可以在顶点着色器中进行计算,也可以在片元着色器中计算。逐像素光照创建一个Unlit Shader,命名为“Diffuse Shader“,我们用一个Color类型的值模拟漫反射扩散系数kd,再定义一个值模拟光照强度,代码如下:Properties
{
_Diffuse("Diffuse",Range(0,1)) = 1
_Intensity("Intensity",float) = 1
}
然后在子着色器(SubShader)的定义光照模式(LightMode),只有定义了正确的光照模式,才能得到一些Unity内置的光照变量。 SubShader
{
Pass
{
Tags{"LightMode" = "ForwardBase"}
接着声明顶点函数和片元函数,引用Unity内置文件(内置文件可以在Unity安装目录 -> Data -> CGIncludes文件夹中查看)。CGPROGRAM
#pragma vertex vert
#pragma fragment frag
//引用Unity内置文件
#include "Lighting.cginc"
定义结构体保存顶点和片元着色器需要的数据//application to vertex
//定义顶点着色器需要的数据
struct a2v
{
float4 pos : POSITION;
float3 normal : NORMAL;
};
//vertex to fragment
//定义片元着色器需要的数据
struct v2f
{
float4 pos : SV_POSITION;
float3 normal : TEXCOORD0;
};
获取属性的值,并实现顶点、片元着色器float _Diffuse;
float _Intensity;
//SV : 系统值(System Value)
v2f vert(a2v a)
{
v2f v;
//将顶点由模型空间转为裁剪空间
v.pos = UnityObjectToClipPos(a.pos);
//将法线由模型空间转换为世界空间
v.normal = mul(a.normal,(float3x3)unity_WorldToObject);
return v;
}
//顶点程序的输出将用作片段程序的输入。
float4 frag(v2f v) : SV_TARGET
{
//将法线归一化
float3 worldNormal = normalize(v.normal);
//对世界坐标下的灯光方向进行归一化
float3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
//点乘法线和光照
float3 diffuse = max(0, dot(worldLightDir,worldNormal));
//_LightColor0 平行光(Directional Light)的颜色
//颜色*颜色? 颜色也是用向量表示,即各个分量相乘后得到的值
return float4(_Diffuse * diffuse * _LightColor0.rgb * _Intensity,1);
}
大功告成,可以看到现在已经可以接收到太阳光照了,但不够真实,没用太阳的地方完全是黑色的。把环境光加进去,情况能有所好转,修改片元着色器float4 frag(v2f v) : SV_TARGET
{
...//省略相同代码
//获取环境光的值
float3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
//返回环境光与漫反射相加的值
return float4(_Diffuse * diffuse * _LightColor0.rgb * _Intensity + ambient,1);
}
现在,可以通过调整环境光的值动态改变小球颜色,稍微有点改善,但效果依然不咋地逐顶点光照逐顶点光照与逐像素类似,只是将颜色计算放在了顶点着色器中,有兴趣可以自行查阅资料,这里就不详细讲解了 半兰伯特(Half Lambert)模型在兰伯特模型中计算光照时,通过光照方向与法线方向的点乘值来计算一个点的光照结果,dot值为负数,说明该点不会受到光的照射,所以对于该光源,该点无光,直接使用max(0,diffuse)来将不应该受光的位置全都置为黑色。现实世界中,一个物体虽然不被光直接照射,但仍然可以看见它,这是由于光的反射照成的,也就是环境光(或者间接光)。半兰伯特模型简单修改了漫反射计算公式,将max(0,n·L)修改为α(n·L) + β*(α和β的值通常都为0.5),这样既保证了兰伯特模型计算出来的光照结果大于0,又整体提升了亮度,使非直接受光面不是单纯的置为黑色。这里使用了区间转化的思想,将n·L的取值范围从[-1, 1]映射到[0, 1]范围内。也就是说,对于模型的背光面,在原兰伯特光照模型中点积结果将映射到同一个值,即0值处;而在半兰伯特模型中,背光面也可以有明暗变化,不同的点积结果会映射到不同的值上。原本亮度为1的地方,乘以0.5变成了0.5,加上0.5就又成了1,而原本光照强度为0的地方,就变成了0.5,原本为负数的地方,也能保证为大于0了。实现起来也不复杂,只需要简单修改光照的计算。float4 frag(v2f v) : SV_TARGET
{
//将法线归一化
float3 worldNormal = normalize(v.normal);
//对世界坐标下的灯光方向进行归一化
float3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
//点乘法线和光照
float3 diffuse = 0.5 * dot(worldNormal,worldLightDir) + 0.5;
return float4(_Diffuse * diffuse * _LightColor0.rgb * _Intensity,1);
}
可以看到,即使不添加环境光,小球没有被光照射的地方也亮了许多。高光反射前面讲了高光反射可以直接计算反射光线与法线的余弦,也能通过半程向量计算,是回顾一下使用半程向量的公式L_s = k_s (I/r^2)max(0,cosα)^p = k_s (I/r^2)max(0,n·h)^p\\ 和漫反射一样,反射系数以及光照强度都可以通过变量自行模拟,p次方还需要另外一个变量来表示。除此之外,还需要知道该点法线和半程向量的值,其中半程向量h可以通过观察方向和光线方向求出。Shader "Unlit/SpecularShader"
{
Properties
{
_Specluar("Specular",Color) = (1,1,1,1) //反射系数
_Intensity("Intensity",Range(0,5)) = 1 //强度
_Gloss("Gloss",Range(0,20)) = 5 //光泽度,公式中的变量p
}
SubShader
{
Tags { "LightMode" = "ForwardBase" }
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
struct a2v
{
float4 pos : POSITION;
float3 normal : NORMAL;
};
struct v2f
{
float4 pos : SV_POSITION;
float3 normal : TEXCOORD0;
float3 worldPos : TEXCOORD1;
};
v2f vert(a2v a)
{
v2f v;
//将顶点从模型空间转裁剪空间
v.pos = UnityObjectToClipPos(a.pos);
//将法线由模型空间转换为世界空间
v.normal = mul(a.normal,(float3x3)unity_WorldToObject);
//将顶点从模型空间转换为世界空间
v.worldPos = mul(unity_ObjectToWorld,a.pos).xyz;
return v;
}
float4 _Specluar;
float _Intensity;
float _Gloss;
float4 frag(v2f v) : SV_Target
{
//归一化法线坐标
float3 worldNormal = normalize(v.normal);
//归一化光线坐标
float3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
//归一化视角向量,
float3 viewDir = normalize(_WorldSpaceCameraPos.xyz - v.worldPos.xyz);
//半程向量,法线和视角向量的和
float3 halfDir = normalize(worldLightDir + viewDir);
//根据公式进行填充即可
float3 specular = _Specluar * _Intensity * pow(max(0,dot(reflectDir,viewDir)),_Gloss);
return float4(specular,1);
}
ENDCG
}
}
}
效果如下图,没有高光的地方,默认是黑色的,这是因为只计算了高光,没有环境光和漫反射。上述代码中使用的是半程向量进行计算,当然也可以通过计算反射方向来得到高光反射,但计算过程比较复杂,幸运的是,ShaderLab为我们提供了计算反射方向的函数reflection(i,n),其中l 是入射方向,n是法线方向,如下图所示。其他的不变,修改vert函数,将计算半程向量修改为反射光。float4 frag(v2f v) : SV_Target
{
//归一化法线方向
float3 worldNormal = normalize(v.normal);
//归一化光线方向
float3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
//归一化视角方向
float3 viewDir = normalize(_WorldSpaceCameraPos.xyz - v.worldPos.xyz);
//世界坐标下的反射光方向
float3 reflectDir = normalize(reflect(-worldLightDir,worldNormal));
//saturate(x)函数:若x大于0,返回x,否则返回0
float3 specular = _Specluar * _Intensity * pow(saturate(dot(reflectDir,viewDir)),_Gloss);
return float4(specular,1);
}
与半程向量计算出来的效果稍有不同,不同的计算方式得到不同的结果,这属于正常现象,而且可以通过调节_Gloss参数让它们看起来比较接近。三者结合将环境光、漫反射和镜面反射的结果相加,在小球即可以看到高光,也能看到环境光和漫反射,任务完成,有兴趣的话可以在代码中加入颜色属性控制小球的颜色。总结这是图形学系列的第二篇文章,第一篇是渲染基础,收到了不错的反馈,下一节计划讲贴图相关内容。 彦祖们点个赞再走呀 引用[1] Jasper Flick rendering教程[2] 闫令祺 Games101[3] Unity官方文档[4] UnityShader入门精要编辑于 2022-01-14 20:44计算机图形学shaderUnity(游戏引擎)赞同 789 条评论分享喜欢收藏申请转载文章被以下专栏收录计算机
Bridgeline Digital(BLIN)股票股价_股价行情_财报_数据报告 - 雪球
geline Digital(BLIN)股票股价_股价行情_财报_数据报告 - 雪球首页行情行情中心筛选器新股上市买什么交易A股交易基金交易私募中心下载App扫一扫,下载登录/注册公司概况公司简介公司高管内部持股所属指数股票交易盘前交易盘后交易历史价格期权交易空仓数据内部交易市场预期财报公告SEC文件财报公告(中)财报公告(英)电话会议实录财务数据主要指标分红派息利润表资产负债表现金流量表雪球选股器研究分析收益预估评级变化研究报告APP专享大盘异动股价提醒购买指数相关ETF扫码下载雪球App查看详情Bridgeline Digital(NASDAQ:BLIN)可卖空$1.13+0.01 +0.89% 511 球友关注盘前交易 03-06 15:59:20 美东时间最高:1.15今开:1.10成交量:22905股换手:0.22%最低:1.09昨收:1.12成交额:2.57万振幅:5.36%52周最高:1.43量比:0.16市盈率(TTM):亏损市净率:1.0852周最低:0.70委比:33.33%市盈率(静):亏损市销率:0.76每股收益:-0.96股息(TTM):--每手股数:1总市值:1177.19万每股净资产:1.05股息率(TTM):--最小价差:0.01总股本:1041.76万机构持股:--Beta:--空头回补天数:--货币单位:USD分时五日日K周K月K季K年K120分60分30分15分5分1分区间统计全屏显示股票对比前复权前复权后复权不复权MABOLL成交量MACDKDJPEPSPCF总市值WRRSIBIASCCIPSY近1月近3月近6月近1年近3年近5年今年以来上市以来-简介Bridgeline Digital, Inc.是根据美国特拉华州法律注册成立于2000年8月28日。该公司帮助客户最大化其从网站和intranet到电子商务体验的完整数字体验的性能。Bridgeline的Unbound平台是一个数字体验平台,深度整合了网络内容管理、电子商务、市场营销、社交媒体管理和网络分析,目标是帮助营销人员提供卓越的数字体验,吸引、参与、培养和转换所有渠道的客户。Bridgeline提供了一个核心加速器框架,用于在Bridgeline Unbound平台上快速实现数字体验,除了市场速度外,还为客户提供了具有成本效益的解决方案。公司网站:http://www.bridgeline.com公司地址:100 Sylvan RoadSuite G700
Woburn
Massachusetts公司电话:1-781-3765555收起Bridgeline Digital, Inc.是根据美国特拉华州法律注册成立于2000年8月28日。该公司帮助客户最大化其从网站...展开
哔哩哔哩下载中心
哔哩哔哩下载中心
关注我们
官方微博
@哔哩哔哩智能机
@哔哩哔哩弹幕网
安卓用户讨论群
147695150
148472853
342220554
iOS用户讨论群
164842482
304959851
272606513
TV用户讨论群
754651517
PC客户端用户讨论群
905241224
751032830
安卓版(64位)
适合大部分的设备
安卓版(32位)
适合部分配置较低的设备
更新情报
安卓版
iPhone版
PC客户端
TV版
iPad HD版
车机版
blin是什么意思_blin的翻译_音标_读音_用法_例句_爱词霸在线词典
是什么意思_blin的翻译_音标_读音_用法_例句_爱词霸在线词典首页翻译背单词写作校对词霸下载用户反馈专栏平台登录blin是什么意思_blin用英语怎么说_blin的翻译_blin翻译成_blin的中文意思_blin怎么读,blin的读音,blin的用法,blin的例句翻译人工翻译试试人工翻译翻译全文blin英 [blɪn]美 [blɪn]释义n.(与鱼子酱、酸乳酪等同吃的)俄式薄煎饼大小写变形:Blin点击 人工翻译,了解更多 人工释义实用场景例句全部Go to Blin or Veronique for your clothes.您的衣服可以到勃林或维罗尼克那儿去订做.互联网收起实用场景例句释义实用场Blin_百度百科
_百度百科 网页新闻贴吧知道网盘图片视频地图文库资讯采购百科百度首页登录注册进入词条全站搜索帮助首页秒懂百科特色百科知识专题加入百科百科团队权威合作下载百科APP个人中心收藏查看我的收藏0有用+10Blin播报上传视频英语单词blin,英语单词,主要用作名词,作名词时译为“(Blin)人名;(法)布兰;(西、德、英)布林”。 [1]外文名blin词 性名词发 音[blin]释 义(Blin)人名;(法)布兰;(西、德、英)布林属 性英语单词目录1单词用法2短语搭配单词用法播报编辑ADJ → a scot word for blind [1]短语搭配播报编辑Blin City 比邻同城blin method blin法Bernadette Blin 师贝尔纳黛特·布兰Frederic Blin 白蝴蝶blin blIn 俄式薄煎饼blin photinia 短叶石楠Philippe Blin 牧师布林Roger Blin 罗歇·布兰 [1]新手上路成长任务编辑入门编辑规则本人编辑我有疑问内容质疑在线客服官方贴吧意见反馈投诉建议举报不良信息未通过词条申诉投诉侵权信息封禁查询与解封©2024 Baidu 使用百度前必读 | 百科协议 | 隐私政策 | 百度百科合作平台 | 京ICP证030173号 京公网安备110000020000BLIN(BLIN)股票股价,实时行情,新闻,财报,研报评级_新浪财经_新浪网
BLIN(BLIN)股票股价,实时行情,新闻,财报,研报评级_新浪财经_新浪网
财经首页 | 新浪首页 | 新浪导航
财经首页
美股首页
滚动
评论
美股列表
中国概念股
美股行情中心
美股自选
退出
您好! 请登录
北京DD日 H:M:S | 美东DD日 H:M:S
新浪财经 > 行情中心 > 美股 >
互联网 >
BLIN
行情
新闻
中概股财报
BLIN导航
行情
该浏览器不支持Flash版行情。
HTML5版行情
HTML5版行情支持火狐、谷歌等最新版本浏览器。
图片版行情
历史价格
期权
空仓
股价提醒
新闻资讯
公司新闻
行业新闻 Press Releases
SEC Filings
电话会议
中概股财报
股东
主要股东
内部人交易
财务
资产负债表
利润表
现金流量表
分红派息
相关信息
公司简介
高管
董事会
互联网行业
中国概念股
BLIN NASDAQ:BLIN
Bridgeline Digital,
添加自选
在APP中查看
普通版
极速版
盘后 :
@hourTradingPrice@ @hourTradingChange@(@hourTradingChangeP@%)
成交量:@hourTradingVolume@
@hourTradingDateTime@
使用极速版请先登录登录,极速版行情更新速度比标准版快若干倍。为达到更好的体验,建议使用火狐、谷歌等最新版本浏览器。
详细行情
基本面摘要
开盘:
@open@
前收盘:
@preClose@
市盈率:
@pe@
市值:
@totalShare@
成交量:
@volume@
区间:
@low@-@high@
每股收益:
@eps@
股本:
@shares@
10日均量:
@averageVolume@
52周区间:
@low52@-@high52@
贝塔系数:
@beta@
股息/收益率:
@dividend@/@income@
行情对比:
大盘指数
纳斯达克
道琼斯
标普500
当日
5日
日K
周K
月K
当日
5日
收盘线
日K
周K
月K
YTD
5分
15分
30分
最近访问股
自选股
名称
最新价
涨跌幅
以下为热门股票
查看自选股请先
登录
名称
最新价
涨跌幅
添加股票
公司资讯
(03-07 17:04)诺和诺德盘前涨3.5% 将举行活动介绍Wegovy战略更新及供应情况(03-07 16:23)分析师:苹果放弃造车不无道理,转向AI恐仍难实现降本(03-07 16:41)台积电严重超买,分析师仍高喊:还能涨(03-07 17:11)美股中概股盘前普跌 达达集团跌超7%(03-07 16:05)美国一州议会提议用政府雇员退休基金投资比特币(03-07 16:11)懂王“金主梦”破灭?马斯克澄清:不会给任何总统候选人捐款!(03-07 16:01)华侨银行:欧洲央行今日料按兵不动,未来降息时机有提前的空间(03-07 16:57)韩国比特币散户投资者正在回归,“泡菜溢价”创两年新高
(03-07 17:15)
日元兑美元涨1% 薪资数据强于预期促使市场押注
(03-07 17:11)
美股中概股盘前普跌 达达集团跌超7%
(03-07 17:04)
诺和诺德盘前涨3.5% 将举行活动介绍Wego
(03-07 16:58)
SK海力士今年将投资10亿美元发展高带宽内存技
(03-07 16:57)
韩国比特币散户投资者正在回归,“泡菜溢价”创两
(03-07 16:53)
摩根大通:首予华住“增持”评级 目标价40美元
(03-07 16:48)
裕信银行:若欧央行预测经济大幅下滑,欧元高收益
(03-07 16:44)
大摩:美元将在年底走强,不看好短期内升值
更多
(03-07 14:31)特斯拉推出专为法国市场开发的单排座Model Y(03-07 16:58)SK海力士今年将投资10亿美元发展高带宽内存技术(03-07 15:52)受德国罢工影响 欧央行官员需远程出席今晚议息会议(03-07 15:55)美银证券:Alphabet 2月搜寻市场份额按月改善 维持“买入”(03-07 15:40)WTI原油技术分析: 有很大机会重回80美元上方(03-07 12:54)放弃电动汽车?奔驰:从未放弃,只是目标推迟五年(03-07 16:04)欧股集体低开 欧洲斯托克50指数跌0.36%(03-07 15:33)马斯克称FSD软件不适合改装到其他品牌的已有车型上
展开网友评论
收起网友评论
多空看板
买入
增持
持有
减持
卖出
网友评论
您好,
您好,发言请先进行微博授权
已有21条评论,共有6人参与
还可以输入137个字符
到 微博 查看您的发言
更多...
可能感兴趣的人
换一换
认证微博
关注BLIN的好友
(@num@)
上一页 下一页
关注BLIN的还关注
名称
最新价
涨跌幅
更多网友正在看
名称
最新价
涨跌幅
正在查看当前页的好友
美股行情(含NASDAQ、NYSE、AMEX)为实时行情,由纳斯达克提供。沪深股市、港股、外汇、黄金、原油等行情均为实时行情;其他市场指数行情至少延时15分钟。新浪财经免费提供的行情数据以及其他资料均来自合作方,仅作为用户获取信息之目的,并不构成投资建议。新浪财经以及其合作机构不为本页面提供的信息错误、残缺、延时或因依靠此信息所采取的任何行动负责。市场有风险,投资需谨慎。
客户服务热线:4000520066
欢迎批评指正
常见问题解答
互联网违法和不良信息举报
新浪财经意见反馈留言板
新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 通行证注册 | 产品答疑新浪公司 版权所有
新浪财经免费提供股票、基金、债券、外汇等行情数据以及其他资料均来自相关合作方,仅作为用户获取信息之目的,并不构成投资建议。新浪财经以及其合作机构不为本页面提供信息的错误、残缺、延迟或因依靠此信息所采取的任何行动负责。市场有风险,投资需谨慎。
用户名:
密 码:
记录登录状态一个月
登录
找回密码
登录帮助
还不是新浪会员?
新用户注册
×