首页 > 编程知识 正文

drawcontours()参数说明,unity室内渲染

时间:2023-05-04 15:00:49 阅读:112607 作者:2105

内容: Camera是开发人员最熟悉的组件之一,有很多常见属性。 例如,在Unity文档中设置此标志位可以清除屏幕(缓存帧)的指定区域。 通常,多个相机在绘制和渲染不同的物体时使用。 字面很简单,但让我们来分析一下设置了不同标志位的情况。 3https://blog.lujun.co/2019/06/02/unity _ camera _ clear _ flags /为了传递更多信息,版权归原作者或源机构所有。

作为开发人员最熟悉的组件之一(如Clear Flags、Projection和Depth ),Camera有许多常见属性。 接下来,我们将介绍易于使用的jydbbClear Flags。

Unity文档的Clear Flags说明也很简单:

etermineswhichpartsofthescreenwillbecleared.thisishandywhenusingmultiplecamerastodrawdiferentgameeelements .设置此标志位

skybox固态颜色

这两个标志位的值很相似,所以放在一起。

如果标志位设置为这两个值之一,则在渲染每帧之前,相机会为每个像素清除深度值和颜色值,并根据需要写入要渲染的颜色值和深度值。 这两个标志位值之间的差异在于,在写入时前者使用的空盒中的颜色值,后者的固态颜色需要与相机下的另一属性背景中设置的颜色值相匹配地写入。

关于背景的说明如下:

在thecolorappliedtotheremainingscreenafterallelementsinviewhavebeendrawnandthereisnoskybox.camera中渲染物体的流程大致为每:像素由于像素的深度值已清除,因此根据使用的材质球设置规则,如果ZTest通过,将写入渲染的颜色值。 是否写入深度值取决于所使用的材质球的ZWrite是否打开。 因为首先渲染Skybox或Solid Color (默认队列=背景),所以默认用作背景。

上图显示了“Clear Flags”设置为“Skybox”时的效果,其中三个对象都使用内置的Standard.shader,并启用了ZWrite和ZTest,因此每个渲染帧都标记以前的所有信息

只有深度

Clear Flags最常见的设置Depth Only是仅清除缓存帧中的深度信息。

清除深度信息会发生什么? 如果没有要渲染的对象,渲染的像素将保留原始颜色值。 否则,无论此点之前发生了什么,新物体的颜色值都会渲染。 由于深度值已清除,因此它将在此像素出现的所有ZTest默认规则下通过,ZWrite也会根据设置的规则写入相应的深度值。

如下图所示:

Depth Only说这是最常用的设置,官方文档中介绍的:

thisishandywhenusingmultiplecamerastodrawdifferentgameelements .含义在此。 如果需要使用多个摄影机渲染不同的对象,则在编辑器Hierarchy中将后面摄影机的Clear Flags设置为该值不会清除摄影机渲染的图像。 也就是说,在假设后面的摄影机的深度值大于前面的摄影机的情况下执行渲染。 此外,由于已清除深度值,因此后面的摄影机渲染的对象的深度值不会大于前面对象的深度值

:请注意,上述相机的深度值是相机下的属性。 “相机深度”值设置越大,将向上渲染。

thecamera’spositioninthedraworder.cameraswithalargervaluewillbedrawnontopofcameraswithasmalervalue。

如上图所示,红蓝黄三个物体由一个摄像机渲染,绿色物体由第二个摄像机渲染。 第二个相机的深度值大于第一个,第二个Clear Flags设置为仅深度。 可以看到,第一个相机渲染的图像保留在屏幕上,无论绿色物体的z坐标是否大于或等于z坐标

盖在最上面。

Don’t Clear

设定为这个值不会清除任何信息。

所以之前的颜色值会一直存在于屏幕上,直至新的颜色值替换掉缓存的颜色值。同理深度值也不会被清除,直至某个通过了 ZTest 并且 ZWrite 为 On 的像素将深度值更新。

大致流程: 逐像素 ZTest,通过则写入新的颜色值,并根据是否开启 ZWrite 来确定是否更新深度值,否则舍弃。

演示如下图:

对于使用 ZWrite Off 的 Shader 的物体,在 Don't Clear 下,由于深度值未写入,所以就算该物体当前帧的深度值比较小而渲染在了前方,但是当下一帧如果深度值变大之后,比其深度值小的物体渲染时就算没有清除之前的颜色缓存,但依旧能通过 ZTest,从而更新像素点的颜色值和深度值。这和开启 ZWrite 刚好相反。

如下图所示,紫色片物体是一个 Sprite,使用了 Sprite-Default.shader ,该 Shader 默认关闭了 ZWrite,所以当它 Z 坐标变大(深度值变大)之后,比其深度值小的物体依旧能在前面显示出来。

OpenGL 和 DirectX 中也有 Clear?

答案是肯定的!

在 OpenGL 关于 Clear 对应了几个方法,分别是 glClearColor 、 glClearDepth 和 glClear 。

glClearColor 方法用于指定颜色缓冲区的值,在颜色缓冲区清空时使用:void glClearColor(GLclampf red,GLclampf green,Glclampf blue,GLclampf alpha); glClearDepth 方法指定清除深度缓存时使用的值,范围在[0,1]之间:void glClearDepth(GLclampd depth); glClear 方法将缓存清除为预先设置的值:void glClear(GLbitfield mask);

其中参数对应需要清除的缓存区(有 GL_COLOR_BUFFER_BIT 颜色缓冲区、 GL_DEPTH_BUFFER_BIT 深度缓冲区、 GL_STENCIL_BUFFER_BIT 模板缓冲区和 GL_ACCUM_BUFFER_BIT 累计缓冲区),这个方法参数的几种组合就正好对应了 Unity Camera 中的 Clear Flags 几个标志位。

在 Direct3D 中也有这样的方法,如下:

HRESULTClear( DWORD Count, const D3DRECT *pRects, DWORD Flags, D3DCOLOR Color, float Z, DWORD Stencil);

其中 Flags 参数也是对应着 Unity Clear Flags 标志位,包含 D3DCLEAR_STENCIL 、 D3DCLEAR_TARGET 和 D3DCLEAR_ZBUFFER ,详见 IDirect3DDevice9::Clear method 。


 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。