有没有颈舒颗粒 筒子们颈椎使用过Unity的ComputeShader

Unity5.0_计算着色器_软件教程_翼狐网
Unity资源下载
下载次数:384
下载次数:260
下载次数:256
下载次数:239
下载次数:231
下载次数:198
Unity热门视频教程
共有71498人学习了该教程
共有43129人学习了该教程
共有39601人学习了该教程
共有33903人学习了该教程
共有28640人学习了该教程
共有23829人学习了该教程
提供最专业、体验最好的在线教育培训服务,让学设计的你享受最权威与最便利的学习环境!
微信号:yihuwang2012
摘要:Unity5.0_计算着色器_软件教程_翼狐网计算着色器 & & & &计算着色器 (compute shaders) 是在普通渲染管道外的图形卡上运行的程序。可用于大规模并行通用图形处理器 (gpgpu) 算法,或提高部分游戏渲染速度。要高效利用这些着色器,需要对 gpu 架构和并行算法有深入了解;并对 directcompute、opencl 或 cuda 有一定了解。unity 中的计算着色器是基于 directx 11 directcompute 技术构建而成;并且目前需要 windows vista 或更高版本的系统,以及支持 shader model 5.0 的 gpu。计算着色器资源计算着色器与普通着色器类似,是工程中含 *.compute 文件扩展名的资源文件。使用 directx 11 样式的 hlsl 语言编写而成,含有最少数量的 #pragma 编译指令,可指示将哪个函数编译为计算着色器内核。以下是一个最小的计算着色器文件示例:// test.compute#pragma kernel fillwithredrwtexture2d&float4&[numthreads(1,1,1)]void fillwithred (uint3 dtid :sv_dispatchthreadid){res[dtid.xy] = float4(1,0,0,1);}上述示例未以远程方式执行任何有趣的操作,只是使用红色填充输出纹理。此示例使用标准的 dx11 hlsl 语言,#pragma kernel fillwithred 除外。一个计算着色器资源文件必须至少包含一个可调用的“计算内核”,并且此函数由 #pragma 指令指示。文件中可有多个内核;只需添加多行 #pragma kernel。编译此内核时,#pragma kernel 行后面可跟着一系列待定义的预处理器宏,例如:#pragma kernel kernelone some_define define_with_value=1337#pragma kernel kerneltwo other_define// ...调用计算着色器在脚本中,定义computeshader 类型的变量,将引用分配至此资源,然后使用 computeshader.dispatch 函数调用这些着色器。有关更多详细信息,请参阅 computeshader 类的脚本组件手册。computebuffer 类与计算着色器紧密相关,可定义任意数据缓冲区(用 dx11 的专业术语表示为“结构缓冲区”)。如果渲染纹理 (render textures) 拥有“随意访问”标志设置(dx11 中的“无序访问视图”),也可使用计算着色器编写渲染纹理,请参阅 rendertexture.enablerandomwrite。计算着色器中的纹理采样器纹理和采样器在 unity 中不是独立的对象,要在计算着色器中使用这两者,必须遵守一些 unity 的特定规则:使用与纹理名称相同的名称,以 &sampler& 开头(例如 texture2 samplerstate samplermytex)。在这种情况下,程序会将采样器初始化为纹理的过滤/循环/各向异性设置。或使用一个“预定义”采样器;名称必须包含“线性 (linear)” 或“点 (point)”(适用于过滤模式)和“强制拉伸 (clamp)” 或“重复 (repeat)”(适用于循环模式)。例如,&samplerstate mylinearclampsampler& - 这将包含线性过滤和强制拉伸循环模式。
行业教程引导
软件教程引导《Unity Shader入门精要》【摘要 书评 试读】- 京东图书
京 东 价:
[定价:¥]
PLUS会员专享价
您购买此商品可享受专属价
增值业务:
重  量:
搭配赠品:
所 在 地:北京 东城区
服务支持:
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
Unity Shader入门精要
商品介绍加载中...
扫一扫,精彩好书免费看
服务承诺:
京东平台卖家销售并发货的商品,由平台卖家提供发票和相应的售后服务。请您放心购买!
注:因厂家会在没有任何提前通知的情况下更改产品包装、产地或者一些附件,本司不能确保客户收到的货物与商城图片、产地、附件说明完全一致。只能确保为原厂正货!并且保证与当时市场上同样主流新品一致。若本商城没有及时更新,请大家谅解!
权利声明:京东上的所有商品信息、客户评价、商品咨询、网友讨论等内容,是京东重要的经营资源,未经许可,禁止非法转载使用。
注:本站商品信息均来自于合作方,其真实性、准确性和合法性由信息拥有者(合作方)负责。本站不提供任何保证,并不承担任何法律责任。
印刷版次不同,印刷时间和版次以实物为准。
价格说明:
京东价:京东价为商品的销售价,是您最终决定是否购买商品的依据。
划线价:商品展示的划横线价格为参考价,并非原价,该价格可能是品牌专柜标价、商品吊牌价或由品牌供应商提供的正品零售价(如厂商指导价、建议零售价等)或该商品在京东平台上曾经展示过的销售价;由于地区、时间的差异性和市场行情波动,品牌专柜标价、商品吊牌价等可能会与您购物时展示的不一致,该价格仅供您参考。
折扣:如无特殊说明,折扣指销售商在原价、或划线价(如品牌专柜标价、商品吊牌价、厂商指导价、厂商建议零售价)等某一价格基础上计算出的优惠比例或优惠金额;如有疑问,您可在购买前联系销售商进行咨询。
异常问题:商品促销信息以商品详情页“促销”栏中的信息为准;商品的具体售价以订单结算页价格为准;如您发现活动商品售价或促销信息有异常,建议购买前先联系销售商咨询。
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
浏览了该商品的用户还浏览了
加载中,请稍候...
价 格: 到
   
iframe(src='//www.googletagmanager.com/ns.html?id=GTM-T947SH', height='0', width='0', style='display: visibility:')有没有shader高手?求教一个错误。【unity吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:26,308贴子:
有没有shader高手?求教一个错误。收藏
variable *o* used without having been completely initialized我把项目升级到5.0之后shader就报了这个错误。求教怎么办。
shader代码Shader &Hidden/AVProLiveCamera/CompositeMono8_2_RGBA& { Properties
_MainTex (&Base (RGB)&, 2D) = &white& {} } SubShader
ZTest Always Cull Off ZWrite Off
Fog { Mode off }
CGPROGRAM#pragma vertex vert#pragma fragment frag#pragma exclude_renderers flash xbox360 ps3 gles//#pragma fragmentoption ARB_precision_hint_fastest#pragma fragmentoption ARB_precision_hint_nicest#pragma multi_compile SWAP_RED_BLUE_ON SWAP_RED_BLUE_OFF#include &UnityCG.cginc&uniform sampler2D _MainTfloat _TextureWfloat4 _MainTex_ST;float4 _MainTex_TexelSstruct v2f { float4 pos : POSITION; float4 uv : TEXCOORD0;};v2f vert( appdata_img v ){ v2 o.pos = mul (UNITY_MATRIX_MVP, v.vertex); o.uv.xy = TRANSFORM_TEX(v.texcoord, _MainTex);
// On D3D when AA is used, the main texture & scene depth texture // will come out in different vertical orientations. // So flip sampling of the texture when that is the case (main texture // texel size will have negative Y). #if SHADER_API_D3D9 if (_MainTex_TexelSize.y & 0) {
o.uv.y = 1-o.uv.y; } #endif
o.uv.z = v.vertex.x * _TextureWidth * 0.25;}float4 frag (v2f i) : COLOR{ float4 uv = i.
float4 col = tex2D(_MainTex, uv.xy );#if defined(SWAP_RED_BLUE_ON) col = col.#endif
float l = col.a; if (frac(uv.z) & 0.25)
l = col.b; else if (frac(uv.z) & 0.5)
l = col.g; else if (frac(uv.z) & 0.75)
l = col.r; col.rgb = col.a = 1.0;} ENDCG
FallBack Off}
错误出现在v2f vert( appdata_img v )方法里。求大神指导。是不是Unity的5.0的shader写法有什么新的要求吗?
float4 uv : TEXCOORD0;这个uv是 float4 ,你没有完全初始化看你的代码,用float3 uv : TEXCOORD0;
v2改成v2f o = (v2f)0;
登录百度帐号Unity 5.6+版本中GPU Instance 研发实操Unity 5.6+版本中GPU Instance 研发实操科学殿堂百家号作者:程序媛Adele文章来自: Unity 研发大牛姚霄凌关于UniteUnite大会是由Unity举办的全球开发者大会,至今已有10年的历史。Unite现已成为游戏行业,VR/AR行业中最具有权威性和影响力的活动。来的人比我想象中多一点,早上很早,自己也很早起来。我看大家今天有一整天都在这里。我就讲一下发布一年多来,我们做了什么。将来还准备做哪些。先介绍一下我们自己,Terrain Team有两个人,都是在上海,我还有蔡原新,今年我还是要自己讲一下。我们Terrain Team最近就集中在这个上面,新的功能暂时就不做了,就只是修一下Bug。平时的话做一些引擎底层的优化。一、GPU Instancing:The past year…过去一年Unity 5.4刚发布,5.5快要发布的时候,那个时候是我们GPU Instancing第一次在5.4里面发布,那个时候大家用得比较少。这些新的功能为什么要去做?也是因为在Unity官方论坛上收集到了很多,主要是国外开发者他们用了Instancing之后,他们的一些问题。然后其实开发者那边比较难解决,还是需要我们自己引擎这边需要为大家做一些事情。其实就相当于大家提问题,我们帮着做。、新API:DrawMeshInstanced最重要的就是5.5添加了新的API(DrawMeshInstanced),是大家呼声最高的一个,它本身很简单,就是从函数的签名可以看到,这种材料是shader,关键是你提供了一个数组,这个数组就是每个Instance的变换矩阵的取证。其实很简单。变换矩阵大家应该很熟悉,可以用TRS这个函数来生成出来,我们为什么要去做它?好处有很多,原来5.4刚刚发布Instancing的时候,纯粹是靠renderloop里面,我们添加了一个Instancing。意思就是说你要画五百个Instancing,你就必须要画五百个GameObject,这个开销是非常非常大的。很多情况下你放了那么多GomeObject,你的CPU开销就上去了。这样整体来说CPU这边会有一点点提升,但是会很小。有了这个GPU Instancing,首先renderloop不是很稳定,经常哪一个点就break了,也不知道为什么。但是新的版本里面加了一个功能,可以知道上一个和下一个没有连在一起的原因。那么多的Instancing如果放在renderloop里面,每一帧会去跟,这个开销也全都省了,用一个API就好了。我们肯定是保证它的GPU性能是一样的。有了这个之后,至少看到论坛上大家真正想用Instancing去做一些系统的,比如说我看到一个游戏是太空中很多飞船战斗的一个场面,有很多激光biu biu biu的那种,然后很多飞船都是用Instancing来做。他们反馈下来是CPU可以节省非常多的时间。坏处就是这个API不是那么好用,你需要自己手工来写代码。因为就只是其中Unity一个数组,这个里面Unity引擎是不知道的,所以它视锥剃除不会去做。比如说照相机转开了,看到五百个Instancing里面只有五十个。如果你需要消除这方面的影响,你需要自己做完剔除再提交,就比较麻烦一点。然后z-efficiency就是排序的问题,一般的话它可以遮挡住后面的物体。如果你想要获得比较好的z-efficiency,你需要自己去做排序。还有就是每一帧要去调开,之前的逻辑很长,开销也是蛮大的。、新API:DrawMeshInstancedIndirect这些是问题,然后以后会解决,大家可以看到我们最后我们会有一个新的系统尝试去解决一些新问题。现在暂时网上我们asset store里面各种示例可以参考一下,它们做得很好。刚刚那个是5.5的,5.5应该有蛮多的用户。5.6里面新加了这个,就是Indirect。Indirect在于两点:一个是不直接从GPU去生成Instancing的数据,不再是由CPU去告诉GPU数据是怎么样;另外一个是也不由CPU去告诉GPU要画多少个Instancing。这些CPU全都不知道,CPU只是告诉GPU这里可以看到ComputeBuffer对象。你从这个里面去拿参数。五个参数,所以这块ComputeBuffer很小,CPU只是告诉GPU你去从这一块buffer里面生成一个drawcall出来,其他的Instance数据从哪里来都是shader会自己算出来。所以这个函数的签名就是这样子,可以看到,这个aabb其实对于API本身来说不是很需要,现在只能暂时放在里面,以后renderloop重构之后就可以去除了。aabb你们开发者可以知道,你们可以把这个包围盒告诉unity,然后可以做一个很简单的camera的视锥剔除。它是需要API去支持的,所以需要你跑在D3D11以上。包括openGL4.3是不支持的,然后安卓的话需要GLES3.1。我相信一年半年以后就可以了,然后IOS Metal应该是支持的。这个函数跟刚才那个相比,它主要的每个Instancing数据不是CPU告诉它的,而是通过shader里面过程化地去生成。里面包含两个点,一个是用Instancing 0、1、2、3、4你需要过程化地去算出来。你一排的cube,地理坐标一个一个排序,用Instance Id可以去乘20。或者是你可能会有另外一块buffer,这一块是里面放了Instancing的数据,你的shader只是去读这个数据,然后把它附给每一个Instance。所以这个整合GPU Compute是最合适的,不需要CPU和GPU之间互相读来读去。原来那个就很没有效率,如果你真的能去掉这一块,相当于你去CPU、GPU做同步,就浪费了一帧两帧的时间。另外移动平台芬兰那边同事测出来,用Compute还太早。Compute本身可以,但是切换时间还比较久。PC上可以,安卓大多数不支持。、新的工作流程:5.65.6里面还有一个新的变化,就是新的work flow,原来你要用的话就比较要建一个shader,5.6里面一般来说不需要。你点上去,最底下会有选项,你勾上就有Instancing。你如果使用standard shader或surface shader就可以。相关的还有shader variant stripping。你比如说player的时候,本身shader保存在磁盘上还是蛮费空间的。现在5.6里面相当于你不用的话都可以被strip掉。策略很简单,build player的时候会去分析你build的场景。用了这个shader的material,只要用了任意一个,Instancing的variant就会被包含在最后的里面。在Graphics settings里面,这些都放在一起会有一个全局的控制。你可以把它强制给strip掉,这样最终出来的就不支持Instancing。刚才说那些都是在在线的文档里面。第一个草稿其实就是我们原来的5.4的文档。现在是一个草稿,就算是草稿,你也可以去这个网址上去找,专门有一个草稿栏。关键是这个新的API的这个文档我丹麦同事帮着写了,里面有很多的例子,大家可以看一下。二、GPU Instancing:2017 and forward、“GPU Instacing 2.0”接下来就是讲除了这些之外,那些是已经发布的功能。接下来是我现在正在做的,可能在下一个版本,下一个版本2017.1可能delay。2017.1之后的版本,我讲的这个应该会上去。GPU Instancing 2.0就是我们在论坛上说到更多别的反馈,或者是我们内部demoteam。我们自己在做地形和数相关的demo,他们也碰到一些问题,然后会要尝试去解决它。第一个其实也很傻,大家知道Instancing的编译速度很慢,原来是我们用了很长的数组,我自己测试下来,只是单纯用微软FXC,去编译一个,一秒和十三毫秒的差别。应该是微软shader的问题,我们去联系过他们,他们这个问题不准备修了,需要我们自己来解决这个问题。因为有这个,所以你们添加新的Instancing的时候,你们需要考虑,你们每添加一个就相当于多了一个数组,编译速度就越来越慢。我之前试过,我加了七个然后去编,就很慢。除了编译速度之外还要考虑constant buffer的大小限制,它不是任意长度。规定是64kb,所以你的数组一多,或者你的数据一多,你需要把它考虑分在其他的constant buffer里面,比较麻烦,要自己去算。然后maxcount决定了你有多大,比如说你的size是五百,你就算画十个Instancing,你也是上传一个五百的buffer,总线带宽是很浪费的。所以之前你可以在shader里面制定maxcount有多大,就评估你大致有多大,可以设一个值,这样的话可以减少一点浪费。但是很难保证在所有情况下都能最大优化。maxcount在OpenGL下,它只有其他平台的四分之一。为什么呢?因为openGL下面,它的标准只保证有16KB的标准。一块显卡可能只有64KB,但是我们不知道。它之前是写死在shader里面,我们只能用一个最小的值。刚才说了,Instancing物体不支持全局光照,因为它需要7个数组,现在不是很现实。所以现在的Instancing都不支持lightmap。我们就会去尝试去解决刚才所有问题。目标首先不应该需要为shader的编译速度担心。可能之前根本就没有担心过,一般来说都非常快。我们希望你们不用再去考虑什么是maxcount,就是那个数组大小,你们不用去想你这个项目多数情况下能有多大,根据这个再反过来修改shader。这个工作流上就会很慢。我们也希望不要占太多的总限带宽。理想情况下你画五百个Instancing,你就传五百个,你画五十就传五十,我们希望能支持到GI。方案首先第一步要解决Instancing buffer的布局,有了布局之后,我们相当于把多个array合并成一个array,这样子才可以动态改变它的长度。不然一个array本身就是一个一个单独的array,要改变长度的话中间会空出来很多。没有办法缩小Constant Buffer它本身的size。另外一个就是用Out-of-Bounds Reads,听上去蛮吓人,其实它不会crash,数组长度不用等同于真正绑定的CB(Constant Buffer)大小。、Array-of-Struct先讲Array-of-Struct,上面一张是我们现在的布局。可以看到两个Instancing的数据,一个是蓝色world,另外一个橘黄色的是colour。先是五百个world,然后再放第二个Instance数组。代码上来解释就更加简单一点。知道Unity的人可能会知道,Unity现在shader也不支持写struct。我们底层代码要改得很多,要改到能够正确读出来每一个struct member的offset。改成这样以后,我们需要新的宏来声明。前两天才刚做完GPU的开销的测试,我本来期待它要比SOA要好一点,但是事实上完全一模一样。我猜应该是跟它本身上面的实现方式,硬件这一块我也不是很懂。如果在座的有知道这一块的话可以教一下我。它的开销我要介绍一下,所谓的开销我们不是去测量用不用Instancing,我们测量的是说,比如说你同样是访问一个东西,你从array里读出来的性能和你直接去用单个的uniform去读,相差多少。原来的和SOA是一样的。CPU端性能更好。CPU端本身Instancing性能就已经蛮好的,但是更好的话相当于大家可以塞更多的游戏相关的代码到游戏里面。所以还是有一点用处的。、Out-of-Bounds Read另外一个就是Out-of-Bounds Read,顾名思义就是越界读数组。shader里面就是数组声明地越短越好,我们现在用的是2,为什么不用1。1的话就是只有一个,所以它每次你都只读到第一个元素,就算你用Instancing ID去读,每次都是去拿之前的数据,就一定要用2。它会生成出来,我们绑定InstanceBuffer的时候,去读没有问题。D3D和Opengl都是支持的,但是Vulkan不支持。其他平台有可能有些平台会支持,我不确定Metal支不支持,但是我相当确信支持,但是还没有来得及做。如果不支持那怎么办?我们想你shader在编的时候还是用长度是2,但是编完之后,因为用的是D3D11的compier,其他平台的都是翻译过去。所以可以修改数组长度。性能上会比没有它要慢一点,但是会和原来一样,所以也不算太慢。最主要因为是长度只有2,所以大大缩小了shader的编译时间,大约100×左右的倍率。然后可以在运行时根据批次大小动态调整绑定的constant buffer长度,节省带宽。我们去调整一个size,因为新的buffer还是要create出来,所以不能每个不同的batch size都创建新的buffer。我们会去取,比如说50个、150个、200个,这个暂时还没有定。用户就不需要再去算你的CB Max Size有多大。Open GL的问题就解决了,可以拿到它支持的uniform block的大小,可以获得跟其他平台一样的大小。、全局光照支持有了这个以后,可以做全局光照。我们可以会去做一下压缩,把float压缩一下。然后lightmap ST的4个float还是很小的,贴图还是要一样的。但是在lightmap的位置就可以不一样。、其他改进其他的话CPU端的代码要更优化,并且支持多线程。在CPU端的开销更加小。相当于来说我会去做半精度浮点类型的优化,这个的话API D3D11都是不支持的。我们现在自己去填buffer,所以可以这样优化。还有就是写数据在constant buffer会更紧凑一点。、结论结论就是CPU端的开销更加小,GPU端的开销在某些情况下更小,这个某些情况就是指你整体瓶颈在于总线带宽的时候,GPU端开销会更加小。然后修改shader更快,支持全局光照。大部分功能正在测试,例如2017.2。这些做完,其实差不多就做完了。、BatchRenderAsset我们为什么要去做Instancing?做这个就是为了做BatchRenderAsset,用于大规Instancing渲染,比如森林、草地、城市建筑等,用来取代地形的植被系统。目标就是最小化的rendreloop开销,支持culling、LOD和streaming。所有的这些跟渲染相关的行为都是会由用户提供的material来决定,你可以使用笔刷工具在场景的任意表面上刷Instance。然后最快今年下半年确定roadmap。要先确定roadmap,有了它以后,会第一时间跟大家分享。之后才会做,这是一点。、SpeedTree另外一个SpeedTree,不会做新的feature。我自己不会做,但是其他的比如GI team会帮着做。所以在2017.1的下一个版本会做,暂时只有静态的烘焙。还有地形上静态阴影的一个烘焙。、Terrainterrain本身不好的就是还没有关于地形系统的计划,中间变了很多,但现在暂时没有计划。好的一点是我们新招了一个很厉害的娜姐,她原来是在Bungie里面做引擎架构,她没有加入前就已经影响我们很多。她可能会建一个新的团队,会重新安排一下地形系统,她也会看一下SpeedTree。上海优才创智科技分享本文仅代表作者观点,不代表百度立场。系作者授权百家号发表,未经许可不得转载。科学殿堂百家号最近更新:简介:喜欢科技数码产品,喜欢探索新!作者最新文章相关文章匿名用户不能发表回复!|

我要回帖

更多关于 推筒子 的文章

 

随机推荐