shader

Unity 镜头烟雾特效的笔记贴

匿名 (未验证) 提交于 2019-12-03 00:22:01
效果:烟雾缭绕 实现思路的探索: 最直接的思路就是用粒子模拟,粒子特效特效跟随摄像机,然后布拉布拉的往外喷。效果还可以接受,但是用默认shader实现的粒子特效,会跟墙体地面等场景物品产生明显的接缝。这个问题起始解决起来也比较方便,把默认的粒子shader复制一遍,然后关闭ZTest。 但是,虽然这个效果也可以接受,但是,为了压缩这一点点的性能开销,还是像尝试使用UV实现。 PS4上看到一款游戏《路弗兰的什么什么什么魔女旅团》,在进入迷宫以后,就会根据当前迷宫,产生不同的烟雾效果。但是它的实现方式很简单,直接在摄像机前贴了几张贴图,然后让UV滚起来。静止条件下效果还是可以,但是在摄像机转动和移动的过程中,这个贴图始终是跟随摄像机的。这就尴尬了,完全是白内障效果啊! 本人对效果要求是比较高的,虽然这种实现方式的性能开销完全可以忽略不计,但是本人还是要追求效果的。 首先,我们的要求是 1,烟雾是会变形的 2,烟雾是跟随场景的,而不是摄像机没擦干净的效果 烟雾的形变,用噪声图做扰动就好了。准备一张四方连续的噪声图,然后按照网上的代码,用时间_Time参与uv运算。 half2 offsetColor = tex2D(_NoiseTex, i.texcoord + _Time.zx * _NoiseSpeed).rg; i.texcoord.x += ((offsetColor.r +

shader3――shader编程语言

匿名 (未验证) 提交于 2019-12-03 00:22:01
缺点,发展迟缓,更新技术少,只支持移动端平台。SGI(美国硅图公司)的产品。 NVIDIA 公司和 微软 公司相互协作在标准硬件光照语言的语法和语义上达成了一致开发。所以,HLSL和CG其实是一种语言。 学习哪一种语言 unity 里面 CG 跟 HLSL 、GLSL的关系 显卡主要有3个实现商 nv( 英伟达 ) amd intel( 英特尔 ) 图形API 实现主要有 pc上 dx, opengl core, vulkan vulkan Metal shader 实现主要两个: dx的 hlsl , opengl opengles 的 glsl nv 为了统一,搞了一个 cg 语法类似hlsl ,但早起只能在nv的卡上跑,现在不知道 微软的HLSL移植性较差,在windows平台上可谓一家独大,可一出自己的院子(还好院子够大),就是落地凤凰不如鸡。这一点在很大程度上限制了 HLSL的推广和发展。目前HLSL多半都是用于游戏领域。我可以负责任的断言,在Shader language领域,HLSL可以凭借微软的老本成为割据一方的诸侯,但,决不可能成为君临天下的霸主。这和微软现在的局面很像,就是一个被带刺鲜花簇拥着的大财主,富贵已极,寸步难行。 上面两个大佬打的很热烈,在这种情况下可以用一句俗话来形容,“鹬蚌相争,渔翁得利”。NVIDIA是现在当之无愧的显卡之王

shader1――图形硬件历史

匿名 (未验证) 提交于 2019-12-03 00:22:01
最枯燥的东西,看了忘,忘了还不想看......了解一下吧。 一、GPU发展简史 GPU英文全称Graphic Processing Unit,中文翻译为“图形处理器”,在现代计算机系统中的作用变得越来越重要。 20世纪六七十年代,人们只是从软件实现的角度考虑图形用户界面的规范问题,并没有GPU的概念。 20实际70年代末,GPU概念被提出,使用单片集成电路(mobilithic)作为图形芯片,GPU被用于视频游戏方面,只能够快速合成多张图片。80年代末,基于数字信号处理芯片(digital signal processor chip)的GPU被研发出来,速度更快,功能更强,价格昂贵。1991年,S3 Graphics 公司研制出第一个单芯片2D加速器,1995年,主流的PC图形芯片厂商都在自己的芯片上增加了对2D加速器的支持。 1998年NVIDIA公司宣布modern GPU的研发成功,标志着GPU的研发的历史性成为现实。20世纪70年代末到1998年的这一段时间称之为pre-GPU时期,而自1998年往后的GPU称之为 modern GPU。在pre-GPU时期,一些图形厂商,入SGI、Evans &Sutherland,都研发了各自的GPU,这些GPU在现在并没有被淘汰,依然在持续改进和被广泛的使用,当然价格比较昂贵。 modern GPU 使用晶体管(transistors

Shader基础

匿名 (未验证) 提交于 2019-12-03 00:22:01
pass块: //相当与一个主方法(函数) CGPROGRAM ENDCG unity着色器基础属性类型: //颜色 0~1 struct } //向量 R struct } //纹理 2D、3D、Cube //其他类型 Int、Float、Range(min,max) CGPROGRAM内基础属性类型: float:32λ;half:-6w~6w;fixed:-1~1; 函数定义: //顶点函数声明 ,顶点函数用于处理模型顶点,模型空间=>剪裁空间(从游戏转换为摄像机的位置的屏幕上) #pragma vertex 函数名 //片元函数声明,片元函数用于像素渲染处理,返回屏幕对应的每一个像素颜色值 # pragma fragment 函数名 关于语义 作用:拿到系统的值、给系统做解释说明 使用语法:在函数参数中 【变量:语义】 如:POSITION:获取顶点坐标;SV_POSITION:返回值作为剪裁空间下的坐标 float4 vert(float4 v:POSITION):SV_POSITION{ //顶点处理代码} 其他语义列表: SV_Target:方法返回值作为屏幕像素颜色 NORMAL:获取模型空间的法线方向值 float4 TEXCOORD0~ TEXCOORDN :获取纹理坐标,纹理上的一个点 用语义时最好全部提取到结构体中 注意有的函数只能用特定的数据(语义)

Android学习之OpenGL ES概述基础

匿名 (未验证) 提交于 2019-12-03 00:21:02
最近写一个有关视频的项目,需要用到GLSurfaceView,先自己琢磨琢磨。 在Android平台上使用OpenGL ES主要有两种方式:NDK和SDK。通过NativeActivity,应用在native(c/c++)中管理整个activity的声明周期,以及绘制过程。由于爱native代码中,可以访问OpenGL ES的代码,因此,可以认为NativeActivity提供了一个OpenGL ES的运行环境。同时,Android提供了两个可以运行在OpenGL ES的类:GLSurfaceView和TextureView。由于真正的OpenGL ES仍然运行在native在层,因此在performance上,使用SDK并不比NDK差。而避免了JNI,客观上对于APP开发者来说使用SDK要比NDK容易。而GLSurfaceView和GLSurfaceView.Renderer是使用OpenGL ES的基础: GLSurfaceView: 这个是我们使用OpenGL ES来进行绘制和操作的view,它和SurfaceView在功能上相似。 GLSurfaceView.Renderer: 这个接口定义了在GLSurfaceView上绘制的方法,我们必须将它实例化attach到GLSurfaceView。 onSurfaceCreated()

Unity DC优化技巧

匿名 (未验证) 提交于 2019-12-03 00:18:01
1 :粒子大小,如果可以的话,粒子的 size 应该尽可能地小。因为 Unity 的粒子系统的 shader 无论是 alpha test 还是 alpha blending 都是一笔不小的开销。同时,对於非常小的粒子,建议粒子纹理去掉 alpha 通道。大块的特效最好在模型上面做,不好用粒子。 2 :大面积使用的粒子,或者模型,尽量使用 add 模式,因为 blend 模式会渲染通道,消耗比较大的内存。 3 :如果粒子叠加层次比较多,尽量使用中空模型,会大大降低渲染的压力。 如图,如用到大面的环形效果,建议用右边的模型,中空,降低渲染压力。 4 : shader 的使用方面,特效一般情况使用 mobile 模式下的 shader ,如有特殊需求,可以用 shader forge 做 shader ,并由程序优化至确认可以使用。 5: 粒子系统的使用方面,每个发射器发射多少个粒子,最大粒子数就写多少个,因为最大粒子数默认的 1000个是粒子池,会占用内存。粒子特效基本不接收光影和产生光影,故光影的效果选项去掉。如下图: 6: 大部分特效不要加入灯光,如想表现灯光效果,可以用 glow模拟光照效果。 7: 特效中需要用的模型资源能合并,尽量在 max中合并,因为在unity中,模型只要k了动画就算一个dc,如果模型事先没在max中合并,几个模型就有几个dc,例如翅膀特效。

Unity中的几种渲染队列

匿名 (未验证) 提交于 2019-12-03 00:18:01
在渲染阶段,引擎所做的工作是把所有场景中的对象按照一定的策略(顺序)进行渲染。最早的是画家算法,顾名思义,就是像画家画画一样,先画后面的物体,如果前面还有物体,那么就用前面的物体把物体覆盖掉,不过这种方式由于排序是针对物体来排序的,而物体之间也可能有重叠,所以效果并不好。所以目前更加常用的方式是z-buffer算法,类似颜色缓冲区缓冲颜色,z-buffer中存储的是当前的深度信息,对于每个像素存储一个深度值,这样,我们屏幕上显示的每个像素点都会进行深度排序,就可以保证绘制的遮挡关系是正确的。而控制z-buffer就是通过ZTest,和ZWrite来进行。但是有时候需要更加精准的控制不同类型的对象的渲染顺序,所以就有了渲染队列。今天就来学习一下渲染队列,ZTest,ZWrite的基本使用以及分析一下Unity为了Early-Z所做的一些优化。 Unity中的几种渲染队列 首先看一下Unity中的几种内置的渲染队列,按照渲染顺序,从先到后进行排序,队列数越小的,越先渲染,队列数越大的,越后渲染。 Background(1000) 最早被渲染的物体的队列。 Geometry (2000) 不透明物体的渲染队列。大多数物体都应该使用该队列进行渲染,也是Unity Shader中默认的渲染队列。 AlphaTest (2450) 有透明通道,需要进行Alpha Test的物体的队列

资源重复问题、针对shader和Unity自带资源

匿名 (未验证) 提交于 2019-12-03 00:14:01
1.资源重复问题:项目的资源可以通过AssetBundle Browser找出 2.针对shader和Unity自带资源; 主要存在的问题: (1)使用默认shader,材质,会导致shader的重复打包,增大包体。 Shader:项目中使用到的shader都需要放入shader的AssetBundle中,有两种方式: (1)改名放入到项目(需要都重新指定,不方便使用) (2)不改名直接放入 不改名的方式放入项目内,新指定的在项目已有的shader,都会指定为项目内的路径,不会造成重复打包。 但之前创建的Material不会自动指定为项目内路径,还是会重复打包,需要重新指定Shader 现在默认shader项目内路径为:Assets/Resources/GameRes/shaders/default/ 旧的shader可以使用代码一键重新指定,会自动指定为项目内路径,不会重复打包,但部分参数可能会修改,需要检查一下 所有使用默认的资源的都要放到项目内,避免重复打包。建议这些默认的材质都在项目内Copy一份,放到单独一个AssetBundle中 (1)Particle System 默认使用的材质和shader都是内置的,会重复打包。 (2)场景里天空盒设置使用默认SkyBox材质会每个场景重复打包 来源:博客园 作者: wayne1984 链接:https://www

UnityShader基础效果-Surface Shader

匿名 (未验证) 提交于 2019-12-03 00:13:02
Ox00 Surface Shader Syntax 常用的三种输出数据格式: //Standard output structure of surface shaders is this: struct SurfaceOutput { fixed3 Albedo; // diffuse color fixed3 Normal; // tangent space normal, if written fixed3 Emission; half Specular; // specular power in 0..1 range fixed Gloss; // specular intensity fixed Alpha; // alpha for transparencies }; struct SurfaceOutputStandard { fixed3 Albedo; // base (diffuse or specular) color fixed3 Normal; // tangent space normal, if written half3 Emission; half Metallic; // 0=non-metal, 1=metal half Smoothness; // 0=rough, 1=smooth half Occlusion; // occlusion