Unity3d Shader(三) Pass(Culling & Depth Testing)透明立方体

剔除是一种通过避免渲染背对观察者的几何体面来提高性能的优化措施。所有几何体都包含正面和反面。剔除基于大多数对象都是封闭的事实;如果你有一个立方体,你不会看到背离你的那一面(总是只有一面在你的前方),因此我们不需要绘制出背面。因此也被称做背面剔除。
 
另一个使得渲染看起来正确的是深度测试。深度测试确保只有场景内的对象的最靠近的表面参与绘制。
 
Syntax 语法

 

Cull Back | Front | Off
Controls which sides of polygons should be culled (not drawn)
控制几何体的那一面会被剔除(不绘制)
Back Don't render polygons facing away from the viewer (default).
不绘制背离观察者的几何体面。
Front Don't render polygons facing towards the viewer. Used for turning objects inside-out.
不绘制面向观察者的几何体面,用于由内自外的旋转对象
Off Disables culling - all faces are drawn. Used for special effects.
显示所有面。用于特殊效果。
ZWrite On | Off
Controls whether pixels from this object are written to the depth buffer (default is On). If you're drawng solid objects, leave this on. If you're drawing semitransparent effects, switch to ZWrite Off. For more details read below.
控制是否将来之对象的像素写入深度缓冲(默认开启),如果你正绘制纯色物体,将此项打开。如果你正绘制半透明效果,关闭深度缓冲,更多细节如下
ZTest Less | Greater | LEqual | GEqual | Equal | NotEqual | Always
How should depth testing be performed. Default is LEqual (draw objects in from or at the distance as existing objects; hide objects behind them).
深度测试如何执行。缺省是LEqual (绘制和存在的对象一致或是在其中的对象;隐藏他们背后的对象)
Offset Factor , Units
Allows you specify a depth offset with two parameters. factor and units. Factor scales the maximum Z slope, with respect to X or Y of the polygon, and units scale the minimum resolvable depth buffer value. This allows you to force one polygon to be drawn on top of another although they are actually in the same position. For example Offset 0, -1 pulls the polygon closer to the camera ignoring the polygon's slope, whereas Offset -1, -1 will pull the polygon even closer when looking at a grazing angle.
允许你定义用两个参数深度偏移。因子和单位。Factor 缩放Z的最大斜率,几何体的X和Y也一样,units缩放可计算的深度缓冲值。这允许你迫使一个几何体绘制在另一个的上层,尽管他们实际上是在同一个位置。例如偏移0,-1使得靠近摄像机的几何体忽略几何体的斜率,而偏移-1,-1则会几何体在一个几乎擦过的角度被观察使看起来更近些。
 
例子:
 
Glass Culling 玻璃剔除
控制剔除比背面调试更有用。如果你有透明物体,你经常会想要显示一个对象的背面。如果你不做任何剔除,你会发现有时常有一部分背面会覆盖在前面的一部分上。
下面是一个用于凸物体(球,立方体,车窗)的简单着色器。
Shader "Simple Glass" {
    Properties {
        _Color ("Main Color", Color) = (1,1,1,0)
        _SpecColor ("Spec Color", Color) = (1,1,1,1)
        _Emission ("Emmisive Color", Color) = (0,0,0,0)
        _Shininess ("Shininess", Range (0.01, 1)) = 0.7
        _MainTex ("Base (RGB)", 2D) = "white" { }
    }
    SubShader {
        // We use the material in many passes by defining them in the subshader.
  // 我们通过把定义放在子着色器中以便可以在许多通道中访问材质
        // Anything defined here becomes default values for all contained passes.
  // 任何定义在这里的值都会变成所有内含的通道的默认值
        Material {
            Diffuse [_Color]
            Ambient [_Color]
            Shininess [_Shininess]
            Specular [_SpecColor]
            Emission [_Emission]
        }
        Lighting On
        SeparateSpecular On
        // Set up alpha blending
  // 开启透明度混合
        Blend SrcAlpha OneMinusSrcAlpha
        // Render the back facing parts of the object.
  // 渲染对象的背面部分
        // If the object is convex, these will always be further away
  // 如果对象是凸, 总是离镜头离得比前面更远。
        // than the front-faces.
        Pass {
            Cull Front
            SetTexture [_MainTex] {
                Combine Primary * Texture
            }
        }
        // Render the parts of the object facing us.
  // 渲染对象面向我们的部分
        // If the object is convex, these will be closer than the
        // back-faces.
  // 如果对象是凸,总是比背面更靠近镜头
        Pass {
            Cull Back
            SetTexture [_MainTex] {
                Combine Primary * Texture
            }
        }
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 维物体裁剪 shader 是一种在Unity引擎中使用的渲染技术。它用于在渲染对象时将超出指定区域的部分进行裁剪,只保留目标区域的可见部分进行渲染。维物体裁剪对于提高渲染性能和减少不必要的计算是非常重要的。 在Unity中,维物体裁剪 shader 主要通过在渲染流水线的不同阶段中进行操作来实现。它需要将物体的顶点数据传入 shader 中进行处理,并根据裁剪区域的定义来判断是否需要丢弃某些顶点或面。裁剪的结果会影响到后续的几何计算和光栅化过程,从而只渲染裁剪区域内的可见部分。 在编写维物体裁剪 shader 时,需要定义裁剪区域的边界条件,通常是一个包围盒或一个几何体,来限制渲染的范围。裁剪 shader 还可以根据需要选择采用不同的裁剪算法,例如平面裁剪、多边形裁剪等,以满足场景需求。 另外,为了提高裁剪性能,可以使用一些优化技术,如视锥剔除 (frustum culling)、遮挡剔除 (occlusion culling) 等来减少不必要的渲染计算。这些技术可以在场景中动态地判断物体是否在视野范围内,并且不在则直接剔除,节省渲染资源。 总之,维物体裁剪 shader 是一项重要的技术,它通过裁剪不可见部分,提高渲染性能,并且可以根据需求来定义裁剪区域和算法,为游戏和应用程序的渲染过程带来更好的效果和性能。 ### 回答2: 维物体裁剪是指在计算机图形学中,通过某种算法将维物体在渲染过程中裁剪成适合显示的部分。使用裁剪shader可以实现这一过程。在Unity引擎中,我们可以使用裁剪shader来处理在渲染管线中对物体进行裁剪操作。 裁剪shader在渲染过程的不同阶段被调用,其中最常见的是在顶点着色器和片段着色器中。在顶点着色器中,我们可以根据物体的位置,将超出视锥体的顶点进行裁剪,从而减少不需要渲染的部分。这样可以大大提高渲染效率。 在片段着色器中,我们可以使用裁剪算法的结果来决定是否绘制当前片段。例如,在使用手绘效果的时候,我们可以将线条渲染在物体的表面上,并通过裁剪算法来决定需要渲染的线条。 裁剪shader可以使用多种裁剪算法,如视锥体裁剪、平面裁剪、正交裁剪等。每种算法都有其独特的优缺点,可以根据需求选择合适的算法。裁剪shader还可以根据物体的位置、大小和旋转等属性,对物体进行不同的裁剪操作。 总之,裁剪shader维物体的渲染过程中起着重要的作用。通过裁剪算法,我们可以将不需要显示的部分裁剪掉,从而提高渲染效率和视觉效果。在Unity中,我们可以通过编写裁剪shader来实现这一功能,从而实现更加灵活和高效的渲染。 ### 回答3: 维物体裁剪是指在计算机图形学中,通过特定的算法和技术对维物体进行可视化处理,将其在屏幕上显示出来。而裁剪(shader)是指在计算机图形学中,使用着色器(Shader)对维物体进行剪裁操作,以提高渲染效率和视觉效果。 在Unity中,维物体裁剪通常通过使用着色器来实现。着色器是一种用于描述渲染效果的代码,Unity使用的是基于HLSL (High-Level Shading Language)的着色器语言。通过编写自定义的裁剪着色器,我们可以实现不同类型的裁剪效果。 在编写维物体裁剪着色器时,我们通常会使用裁剪平面的概念。裁剪平面是一个虚拟的平面,可以将物体中在平面两侧的部分分别裁剪掉或保留下来。通过在裁剪着色器中添加适当的代码,我们可以根据裁剪平面的位置和法线,对物体进行裁剪操作。 裁剪着色器还可以与其他渲染效果结合使用,例如使用透明度贴图实现透明效果,使用法线贴图实现凹凸效果等。通过合理地组织和调整裁剪着色器的代码,我们可以达到更好的渲染效果和性能。 在使用Unity进行维物体裁剪时,我们可以借助Unity内置的ShaderGraph工具或编写自定义着色器来实现。ShaderGraph是Unity的一种可视化着色器编辑器,使得裁剪效果的实现更加直观和便捷。 总而言之,使用裁剪着色器可以对维物体进行裁剪操作,从而提高渲染效率和视觉效果。Unity提供了丰富的工具和编程语言支持,使得裁剪着色器的开发变得更加简单和灵活。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值