shader

shader学习笔记一

好久不见. 提交于 2020-03-03 04:19:09
shader分为两种: 顶点shader:顶点shader是计算每个三角面上的顶点,并为像素渲染做准备 片元shader:以片断为单位,计算光照,颜色的一系列算法 1.Standard Surface Shader:标准表面着色器,基于物理的着色系统,以模拟真实的方式模拟材质灯光之间的关系。 2.unlit Shader 最基本的顶点片元着色器,不受光照影响的shader shader与材质之间的关系 一个shader可以跟无数个材质关联 一个材质同一时刻只能关联一个shader 材质可以赋予模型,但是shader不行 材质可以说是shader的实例,shader改变时材质就会改变 shader可以分成几个部分 Shader “name”//这个shader的名字Custom是shader存放的位置 Properties//属性,材质球面板的参数 SubShaders//在这里面存放cg语言 FallBack//备胎,当这个shader运行不了就会运行"这里面的shader名" CustomEditor//自定义界面 来源: CSDN 作者: f_TaoYuHu 链接: https://blog.csdn.net/f_TaoYuHu/article/details/104612948

NGUI 渲染流程深入研究 (UIDrawCall UIGeometry UIPanel UIWidget)

喜你入骨 提交于 2020-03-02 21:15:16
上图是一个简要的 NGUI 的图形工作流程, UIG eometry被UIWidget实例化之后,通过 UIW idget的子类,也就是UISprit,UILabel等,在 OnFill() 函数里算出所需的Geometry缓存(顶点数, UV , Color ,法线,切线 )。PS:之所以要生成这些数据,是为了之后生成mesh来渲染 而 UIP anel,通过遍历自己子类下所有的 UIW idget组件(已经按深度排序),先创建一个 UID rawCall,然后把该Widget的material,texture,shader对象以及Geometry的缓存传给UIDrawCall,如此反复循环搜索该UIPanel下的每一个Widget,只要是material,texture,shader都和上一个 Widget 一样的 Widget,他们的缓存都传给同一个 UID rawCall,直到循环结束或者碰到一个材质球,贴图,shader对象任一不相同的Widget。当遇到这种 W idget,循环会再创建一个新的 UID rawCall,然后传递material,texture,shader,缓存,如此这般,直到循环完全结束。 每次有新的 UID rawCall产生,UIPanel就会调用上一个 UID rawCall的UpdateGeometry()函数,来创建渲染所需的对象

ogre的材质与unity的材质的相似性

∥☆過路亽.° 提交于 2020-03-02 13:13:37
最近研究了火炬之光的游戏资源,这款游戏采用ogre引擎,也就促使我研究了一下ogre的材质文件格式,发现和我经常使用的unity的材质格式有很多相似之处,因此分享出来给大家。 ogre的材质文档可以参考这里 http://www.ogre3d.org/docs/manual/manual_16.html , 而unity的shader文档参考这里 http://docs.unity3d.com/Manual/SL-Shader.html unity的shader语言分为3种,即shaderlab,类似于固定管线语法;cg shader,比较经典的shader语法,相当于对shaderlab的扩展可编程语法;以及surface shader,这个是另外一种系统,没有pass的概念,相当于 基于某种光照模型,然后调整光照模型的参数。 第三种语法不是很熟悉, 如果有了解这第三种模型渊源的朋友可以告诉我。 继续将ogre和unity的对比: 类似的两者的材质语言 都有固定管线和 可编程管线 语法。 其中unity中的shaderlab 标准语法和ogre 相比很类似,但是ogre比unity的shaderlab强大一些。 两者都有基本的Pass概念,基本语法形式都是在Pass中操作texture的混合方式,以及配置标准的光照参数。 ogre有一个 scroll anim的功能

从零开始写一个武侠冒险游戏-6-用GPU提升性能(1)

↘锁芯ラ 提交于 2020-03-01 09:56:32
从零开始写一个武侠冒险游戏-6-用GPU提升性能(1) 概述 我们之前所有的绘图工作都是直接使用基本绘图函数来绘制的, 这样写出来的代码容易理解, 不过这些代码基本都是由 CPU 来执行的, 没怎么发挥出 GPU 的作用, 实际上现在的移动设备都有着功能不弱的 GPU (一般都支持 OpenGL ES 2.0/3.0 ), 本章的目标就是把我们游戏中绘图相关的大部分工作都转移到 GPU 上, 这样既可以解决我们代码目前存在的一些小问题, 同时也会带来很多额外好处: 首先是性能可以得到很大提升, 我们现在的帧速是40左右, 主要是雷达图的实时绘制拖慢了帧速; 方便在地图类上实现各种功能, 如大地图的局部显示, 地图平滑卷动; 保证地图上的物体状态更新后重绘地图时的效率; 帧动画每次起步时速度忽然加快的问题, 反向移动时角色动作显示为倒退, 需要镜像翻转; 状态栏可以通过 纹理贴图 来使用各种中文字体( Codea 不支持中文字体); 最大的好处是: 可以通过 shader 来自己编写各种图形特效. 在 Codea 里使用 GPU 的方法就是用 mesh 和 shader 来绘图, 而 mesh 本身就是一种内置 shader . 还有一个很吸引人的地方就是: 使用 mesh 后续可以很容易地把我们的 2D 游戏改写为 3D 游戏, 这也是我们这个游戏的一个尝试: 玩家可以自由地在

Flutter Widgets 之 ShaderMask

老子叫甜甜 提交于 2020-02-29 22:40:48
ShaderMask可以让我们将Shader用于任何一个控件上,比如在Text上使用渐变就可以使用ShaderMask来实现: ShaderMask( shaderCallback: (Rect bounds) { return RadialGradient( center: Alignment.topLeft, radius: 1.0, colors: <Color>[Colors.yellow, Colors.deepOrange], tileMode: TileMode.mirror, ).createShader(bounds); }, blendMode: BlendMode.srcATop, child: Text('老孟,一枚有态度的程序员',style: TextStyle(fontSize: 30),), ) 效果: shaderCallback 需要返回一个Shader对象,可以通过渐变相关类直接生成Shader: RadialGradient(...).createShader(rect) blendMode 属性是融合方式,child是目标图像(dst),Shader是源图像(src),融合方式介绍: 英文官方介绍 中文 不错的翻译 更多相关阅读: Flutter系列文章总览 Flutter Widgets 之 Expanded和Flexible

Flutter Widgets 之 ShaderMask

自闭症网瘾萝莉.ら 提交于 2020-02-29 22:40:36
ShaderMask可以让我们将Shader用于任何一个控件上,比如在Text上使用渐变就可以使用ShaderMask来实现: ShaderMask( shaderCallback: (Rect bounds) { return RadialGradient( center: Alignment.topLeft, radius: 1.0, colors: <Color>[Colors.yellow, Colors.deepOrange], tileMode: TileMode.mirror, ).createShader(bounds); }, blendMode: BlendMode.srcATop, child: Text('老孟,一枚有态度的程序员',style: TextStyle(fontSize: 30),), ) 效果: shaderCallback 需要返回一个Shader对象,可以通过渐变相关类直接生成Shader: RadialGradient(...).createShader(rect) blendMode 属性是融合方式,child是目标图像(dst),Shader是源图像(src),融合方式介绍: 英文官方介绍 中文 不错的翻译 更多相关阅读: Flutter系列文章总览 Flutter Widgets 之 Expanded和Flexible

在Unity中使用Shader

荒凉一梦 提交于 2020-02-29 18:16:52
1、Material 和 Shader 的关系。一个材质包括一个 Shader 程序。在 Shader 中设置的属性能够通过 Material 可视化设置 2、内建 Shader, 在 5.0 之后的版本号中大部分旧的 Shader 都集成在了 Standard Shader 中了,能够通过设置 Standard Shader 的属性达到不同的须要的渲染效果。 Albedo: 反光率 Specular: 镜面反射 Smoothness: 镜面反射的光滑度 NormalMap: 法线贴图 为什么叫法线贴图。我们知道法线 (Normal) 是垂直于一个面的直线。通过计算光线与这条法线的角度就能够知道与面的角度。进而能够计算出面应得到的颜色值。如果我们知道物体每一个面的法线就能实现对这个物体进行光照渲染。可是一堵墙或许仅仅有四个顶点,也就是仅仅有一个面,它终于的渲染效果将会非常单一。如果这堵墙上有很多其它的砖的凹凸痕迹。我们增样实现仅用四个顶点渲染出立体感非常强,细节层次感非常强的这堵墙呢。 使使用方法线贴图。 在法线贴图技术中,我们就是通过把墙面的每一个像素的法线存储在一张纹理中,渲染的时候依据每一个像素的法线确定他们的阴暗程度,而这张法线贴图是能够用 photoshop 软件从一张墙的纹理生成相应的法线贴图的。到此,熟悉法线贴图的朋友会对以上内容非常熟悉的。 HeightMap:

OpenGL ES学习笔记(三)——纹理

此生再无相见时 提交于 2020-02-28 12:40:25
首先申明下,本文为笔者学习《OpenGL ES应用开发实践指南(Android卷)》的笔记,涉及的代码均出自原书,如有需要,请到原书指定 源码地址 下载。 《 OpenGL ES学习笔记(二)——平滑着色、自适应宽高及三维图像生成 》中阐述的平滑着色、自适应宽高是为了实现在移动端模拟真实场景采用的方法,并且通过w分量增加了三维视角,在具体实现上采用了正交投影、透视投影的理论。本文将在此基础上,构建更加精美的三维场景。三维效果本质上是点、直线和三角形的组合,纹理是将图像或者照片覆盖到物体表面,形成精美的细节。在实现上具体分为两步:1)将纹理图片加载进OpenGL;2)OpenGL将其显示到物体表面。(有点像把大象装进冰箱分几步~~~)不过,在实现过程中,涉及到着色器程序的管理,涉及到不同的纹理过滤模式,涉及到顶点数据新的类结构等问题,下面将一一对其阐述: 纹理加载 纹理着色器 更新顶点数据类结构 着色器程序类 纹理绘制 一、纹理加载 将纹理覆盖到物体表面,最终是通对齐坐标来实现的。而OpenGL中二维纹理的坐标与计算机图像的坐标并不一致,因此,首先对比下两者的不同。 可见,两者的差别在于绕横轴翻转180度。另外,OpenGL ES支持的纹理不必是正方形,但每个维度都必须是2的幂。 加载纹理图片的方法参数列表应该包括Android上下文(Context)和资源ID

Unity Shader - 函数整理

倖福魔咒の 提交于 2020-02-28 00:56:43
​​​​​ CG 标准函数 基本函数 功能描述 abs(x) 返回 x 绝对值 。 max(a, b) 返回 a 、 b 的较大值。 min(a,b) 返回 a 、 b 的较小值。 round(x) 返回 x 的四舍五入值。 ceil(x) 向上取整。例如:ceil(float(1.3)) = 2.0; floor(x) 向下取整。例如:floor(float(1.3)) = 1.0; clamp(x,min,max) 返回 x 限制在 [ min , max ] 范围内的值。 lerp(a, b, f) 返回在 [ a , b ] 范围内权值为 f 的插值。(权值为 0 - 1) smoothstep(a, b, x) 返回在 [ a , b ] 范围内插值为 x 的权值。(权值为 0 - 1) saturate(x) 返回 x 限制在 [ 0 , 1 ] 范围内的值。 sign(x) 返回输入值的正负。正值返回 1 ;负值返回 0 ; step(a, x) 如果 x < a ,返回 0 ,否则,返回 1 。 fmod(x, y) 返回 x / y 的浮点余数。( y != 0 ) frac(x) 返回 x 的浮点部分; isfinite(x) 判断 x 是否为有限值。是则返回 true;否则返回 false; isinf(x) 判断 x 是否为无限值。是则返回 true

Unity影响渲染顺序因素的总结

可紊 提交于 2020-02-26 18:49:02
https://blog.csdn.net/u011748727/article/details/68947207 如果不了解Shader中如何使用模板缓冲区,可能看不懂例子。 渲染顺序,我理解为进入显卡流水管线的顺序,会对Z、Stencil和Color Buffer带来影响。 当然,能否最终被绘制到屏幕上,还要看深度检测和模板检测的结果。 能够影响渲染顺序的因素有: 1、Camera Depth 相机组件上设置的相机深度,深度越大越靠后渲染。 2、Sorting Layer 在Tags & Layers设置中可见 3、Order In Layer 相对于Sorting Layer的子排序,用这个值做比较时只有都在同一层时才有效。 4、RenderQueue Shader中对Tags设置的“Queue”。 下面是结果: 1、Camera Depth 永远最高。Camera Depth小的一定先进渲染管线。 2、当Sorting Layer和Order In Layer相同时 RenderQueue小的先进渲染管线。 3、当Sorting Layer和Order In Layer不相同时! 3.1 当两个材质使用了不同的RenderQueue,且这两个RenderQueue都在[0~2500]或[2501~5000]时,SortingLayer和OrderInLayer的排序生效。