我正在编写一个运行在Raspberry Pi上的OpenGL应用程序,即一个资源非常有限的系统。本质上,几个具有RGBA纹理的四边形被叠加/阿尔法混合在一起,并分别进行平移/旋转应用。它们被剪裁在一个未旋转的矩形上。
为此,我目前使用模具缓冲区。也就是说,当绘制需要裁剪的纹理时,我清除模具缓冲区,将裁剪四块呈现到模具缓冲区,并在呈现已翻译/旋转的对象之前启用模具测试。
在Pi上,清除模板缓冲区是一个痛苦的缓慢过程,大约20 is,完全破坏性能。我考虑过将剪裁槽预绘制到模板缓冲区的不同位,但这将导致最多8个裁剪区域(我需要更多)。
因此,对于不需要昂贵操作(如冲洗模具缓冲区)的简单矩形,是否有不同的方法实现剪裁?
发布于 2017-12-18 05:02:41
听起来你需要的是一个剪刀试验。它是专为裁剪一个未旋转的矩形而设计的,它应该比处理模具缓冲区更快。
发布于 2017-12-18 05:35:40
在将多边形发送到渲染器之前,可以尝试在代码中裁剪多边形。然后,您可以完全避免模具缓冲区。要做到这一点,您可以一次剪裁矩形的所有边。我不能肯定这是否比你之前做的更快,但这里说:
对于此算法,需要将多边形表示为点列表。
如何夹在一边:
# careful of array out of bounds access
k = -1
# find first instance where a vertex is outside followed by one that is inside
for(i = 0; i < verts.length; ++i)
if(isOutside(verts[i]) && !isOutside(verts[i + 1]))
k = i
# if no such instance found
if(k == -1)
if(isOutside(verts[0])) # entire thing outside
return empty array
else # entire thing inside
return verts # return unchanged
# if instance was found
else
newVerts = empty array
# add first vertex in new shape
newVerts.add(intersect(verts[k], verts[k + 1]))
# walk the part of the polygon that is inside
while(!isOutside(verts[++k]))
newVerts.add(verts[k])
# add last vertex in new shape
newVerts.add(intersect(verts[k - 1], verts[k]))
return newVerts然后你就可以做这样的事情:
poly = clipLeftEdge(poly)
poly = clipRightEdge(poly)
poly = clipTopEdge(poly)
poly = clipBottomEdge(poly)如果原来的多边形是凸的,那么新的多边形也应该是凸的,这意味着你可以在画之前对它进行三角剖分或任何你需要的东西。
形成剪裁矩形边的一条线(如果你把它扩展为无限长的话)将整个空间分割成两个半空间。您需要提供一个函数来检查顶点是在“内部”半空间还是“外部”半空间中。例:矩形的左边在x= -15。若要检查点是否位于外部,请执行(point.x < -15)。
您还需要提供一个函数来相交2个顶点。你有一个顶点在外面,一个在内部和中间,有一条线,你想要剪辑对。例如,如果矩形的左边沿为x= -15:
factor = (-15 - p1.x)/(p2.x - p1.x)
newVertex.x = -15
newVertex.y = (p2.y - p1.y)*factor + p1.y您还需要线性内插您所关心的所有其他属性(比如纹理坐标)。
如果您想真正精巧,您可以编写一次裁剪算法,并为每次运行提供适当的isOutside和intersect函数。
发布于 2017-12-18 09:54:06
根据拉斯的回答,我也建议使用剪刀矩形,但是,在同样缓慢的偶然情况下,是否可以使用Z缓冲区在不想绘制的区域中将Z设置为“近”?
顺便说一句,有一个示例图像将是有用的。
https://computergraphics.stackexchange.com/questions/6002
复制相似问题