我遇到了一个非常具体的问题。我有一个OpenGL应用程序,用于将视频渲染到3D网格上。事实证明,我可以让我的视频源向我发送图像的矩形部分,从而减少内存使用量。这些部分被指定为Rectangle2D(int x, int y, int width, int height)
0 <= x <= w <= sourceVideoWidth
和0 <= y <= h <= sourceVideoHeight
。
话虽如此,我想找出每个帧,以及每个网格的内容:
好处是减少纹理上传到GPU,这个操作通常是我应用程序的瓶颈。
为了简化问题,我们假设所有网格都是任意定位的3D矩形。 3D矩形由四个点定义:
class Rectangle3D
{
public:
Vec3 topLeft;
Vec3 topRight;
Vec3 botLeft;
Vec3 botRight;
}
可能的解决方案:
A)将网格划分为具有已知纹理坐标的点网格点,并对每个点进行平截头体剔除,然后从可见点找到我们必须请求的左上和右下纹理坐标。这是相当低效的,并且当我们向场景添加另一个网格时,测试的点数会增加。仅使用矩形四个角的解决方案可能更合适。
B)使用平截头体定义平面(见frustum culling)。为了进一步简化,仅使用与屏幕侧面对应的四个平面。找出网格是否可见非常简单。查找可见纹理坐标需要几种情况: - 一个或多个平截头体边与网格相交 - 没有平截头体边与网格相交 - 网格完全可见 - 或者网格围绕屏幕两侧 在任何情况下,我都需要几个平面和平面线段交叉点。这不一定有效。
C)对Rectangle3D线进行2D投影,得到四边多边形,然后使用屏幕边和多边形边之间的线段交叉。还考虑了我们没有交叉并且网格仍然可见的情况。
D)使用OpenGL遮挡查询对象,渲染过程可以生成有关可见网格部分的信息。
还有其他解决方案可以最好地解决这个问题吗?如果不是你会使用哪一个?为什么?
答案 0 :(得分:1)
再考虑一下你的解决方案,
为什么不为遮挡查询添加一个渲染通道。将网格划分为虚构的矩形,告诉您网格的可见部分。像
图像的左侧部分是虚构的子矩形,图像的右侧部分显示屏幕区域内可见的子矩形(在本例中为红色矩形)。根据此传递结果,您将获得可见的网格坐标。
更新: 这是一个解释我的观点的示例视图。这可以通过使用 opengl查询对象来完成。 r 是GL_SAMPLES_PASSED
的结果
由于您将通过查询对象的结果知道哪些矩形是可见的,因此您将了解哪些坐标是可见的.Google用于 opengl遮挡查询 你会得到详细的信息。希望这会有所帮助。