Opengl 部分渲染三维场景

Opengl 部分渲染三维场景,opengl,3d,rendering,render,opengl-3,Opengl,3d,Rendering,Render,Opengl 3,我想部分渲染3D场景,我的意思是我想渲染一些像素,跳过其他像素。有许多非实时渲染器允许选择要渲染的剖面 例如,完全渲染的图像(渲染的所有像素)与部分渲染的图像: 我希望使渲染器不渲染场景的一部分,在这种情况下,渲染器将跳过渲染这些区域并节省资源(内存/CPU) 如果无法在OpenGL中执行此操作,是否有人可以建议其他开源渲染器,甚至可以是软件渲染器。您可以分割场景并将其渲染为多个部分-这样您将以较少的内存消耗进行渲染,并且您可以跳过不必要的部分或区域 如果要渲染显示器的矩形子部分,可以使用gl

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

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

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


如果无法在OpenGL中执行此操作,是否有人可以建议其他开源渲染器,甚至可以是软件渲染器。

您可以分割场景并将其渲染为多个部分-这样您将以较少的内存消耗进行渲染,并且您可以跳过不必要的部分或区域

如果要渲染显示器的矩形子部分,可以使用
glViewport
并适当调整投影

如果您想决定是否按像素渲染,特别是使用纯固定管道,您可能会使用模具缓冲区。这正是名字所说的——你的绘画就像是从模板中喷出来的一样。它是一个每像素的掩码,每像素至少有8位,并且在过去的15年中在硬件上得到了支持。在其他用途中,它曾经是一种无需支付官方支持
glStipple
的“专业”卡即可渲染点画的方法

对于GLSL,还有一个
discard
语句,它立即结束对片段的处理,并且不产生任何输出。主要的警告是,在某些GPU(尤其是嵌入式GPU)上,如果可以避免条件反射,建议最好返回alpha为0的任何颜色(假设根据混合模式没有效果)。由于片段着色器通常是由同时执行多个像素的SIMD单元实现的,因此,在着色器程序看起来可能会出现分歧的任何时候,都可能出现[可能不必要的]任务拆分,因此条件和
discard
s会对并行性产生强烈的负面影响。非常依赖GPU的东西,所以一定要在现实生活中的个人资料

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


我还感到震惊的是,除了使用模具进行严格的二进制测试之外,还有一种替代方法,就是在不希望重画的像素上,用尽可能接近的值预先填充z缓冲区;使用颜色遮罩仅绘制深度缓冲区。

我是否可以创建一个类似遮罩的东西,使所有涂成红色的东西都不会被渲染?如果我把这个应用到一个游戏中,比如有阴影和很多效果的《末日3》,那会产生任何人工制品吗?我不能用“一次渲染”而不是部分渲染吗?@user3654262你说的是掩蔽吗@user3654262:使用模具缓冲区(另一个答案中提到的选项之一)是将遮罩应用于渲染的一个很好的选项。对于您提到的矩形子部分,我认为通常更容易定义一个剪切矩形并启用剪切测试,而不是更改视口。这样,您就不必调整投影。使用模具缓冲区可能是我所需要的。表演怎么样?如果我将遮罩应用到一半的渲染屏幕上,并且我的屏幕上均匀地填充了对象,那么我将获得多少性能?这高度依赖于GPU;其中一些保留深度和模具缓冲区的分层副本,如果不渲染任何内容,可以立即丢弃大块,一些通过基于分片的延迟渲染保留单个层次,但您可能希望所有人都做一些比等到最后一刻才丢弃更智能的事情。而且它肯定会比基于CPU的解决方案更快。