【问题标题】:Partially render a 3D scene部分渲染 3D 场景
【发布时间】:2014-08-19 17:10:16
【问题描述】:

我想部分渲染 3D 场景,我的意思是我想渲染一些像素并跳过其他像素。有许多非实时渲染器允许选择要渲染的部分。

示例,完全渲染的图像(渲染所有像素)与部分渲染:

我想让渲染器不渲染场景的一部分,在这种情况下,渲染器将跳过渲染这些区域并节省资源(内存/CPU)。

如果不能在 OpenGL 中实现,有人可以推荐任何其他开源渲染器,它甚至可以是软件渲染器。

【问题讨论】:

    标签: opengl 3d rendering render opengl-3


    【解决方案1】:

    如果您正在讨论渲染显示的矩形子部分,您可以使用 glViewport 并适当地调整您的投影。

    如果您想决定是否按像素进行渲染,尤其是对于纯固定管道,您可能会使用模板缓冲区。顾名思义,这确实起到了作用——你画画的时候就像在模板上喷涂一样。它是每像素掩码,可靠地每像素至少 8 位,并且至少在过去 15 年中一直支持硬件。除其他用途外,它曾经是您无需支付官方支持glStipple 的“专业”卡即可渲染点画的方式。

    在 GLSL 中,还有 discard 语句会立即结束片段的处理并且不产生任何输出。主要需要注意的是,在某些 GPU(尤其是嵌入式 GPU)上,如果您可以通过这样做避免条件,建议更喜欢返回 alpha 为 0 的任何颜色(假设根据您的混合模式不会产生影响)。条件和discards 否则会对并行性产生强烈的负面影响,因为片段着色器通常由同时执行多个像素的 SIMD 单元实现,因此任何时候着色器程序看起来可能会出现分歧,可能会出现 [可能不必要的] 分裂的任务。非常依赖 GPU 的东西,所以一定要在现实生活中进行分析。

    编辑:正如 cmets 中所指出的,使用剪刀矩形比调整视口更聪明。这既意味着您不必调整投影,同样,任何调整中的舍入误差都不可能产生接缝。

    让我感到震惊的是,使用模板进行严格二进制测试的替代方法是在 z 缓冲区中预先填充您不想重绘的像素上最接近的可能值;仅使用颜色蒙版绘制到深度缓冲区。

    【讨论】:

    • 对于您提到的矩形子部分,我认为通常更容易定义剪刀矩形并启用剪刀测试而不是更改视口。这样,您不必调整投影。
    • 使用模板缓冲区可能是我需要的。性能怎么样?如果我将遮罩应用到渲染屏幕的一半并且我的屏幕被均匀地填充了对象,我将获得多少性能?
    • 高度依赖 GPU;其中一些保留深度和模板缓冲区的分层副本,如果不渲染任何内容,可以立即丢弃大块,有些通过基于图块的延迟渲染保持单一层次结构,但可能你可以期望所有人都做一些比等到最后一刻放弃。而且它肯定会比基于 CPU 的解决方案更快。
    【解决方案2】:

    您可以分割场景并分段渲染 - 这样您将使用更少的内存消耗进行渲染,并且您可以简单地跳过不必要的部分或区域。 Also read this

    【讨论】:

    • 我可以创建一个像遮罩这样的东西,让所有涂成红色的东西都不会被渲染吗?如果我将其应用于游戏,例如具有阴影和大量效果的 Doom 3,会产生任何伪影吗?我不能“一次性”渲染而不是部分渲染吗?
    • @user3654262 你说的是掩蔽吗? opengl.org/archives/resources/faq/technical/transparency.htm
    • @user3654262:使用模板缓冲区(如另一个答案中的选项之一所述)是在渲染中应用蒙版的好选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    相关资源
    最近更新 更多