首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不清除模板缓冲区的快速裁剪

不清除模板缓冲区的快速裁剪
EN

Computer Graphics用户
提问于 2017-12-18 01:52:36
回答 3查看 521关注 0票数 2

我正在编写一个运行在Raspberry Pi上的OpenGL应用程序,即一个资源非常有限的系统。本质上,几个具有RGBA纹理的四边形被叠加/阿尔法混合在一起,并分别进行平移/旋转应用。它们被剪裁在一个未旋转的矩形上。

为此,我目前使用模具缓冲区。也就是说,当绘制需要裁剪的纹理时,我清除模具缓冲区,将裁剪四块呈现到模具缓冲区,并在呈现已翻译/旋转的对象之前启用模具测试。

在Pi上,清除模板缓冲区是一个痛苦的缓慢过程,大约20 is,完全破坏性能。我考虑过将剪裁槽预绘制到模板缓冲区的不同位,但这将导致最多8个裁剪区域(我需要更多)。

因此,对于不需要昂贵操作(如冲洗模具缓冲区)的简单矩形,是否有不同的方法实现剪裁?

EN

回答 3

Computer Graphics用户

回答已采纳

发布于 2017-12-18 05:02:41

听起来你需要的是一个剪刀试验。它是专为裁剪一个未旋转的矩形而设计的,它应该比处理模具缓冲区更快。

票数 1
EN

Computer Graphics用户

发布于 2017-12-18 05:35:40

在将多边形发送到渲染器之前,可以尝试在代码中裁剪多边形。然后,您可以完全避免模具缓冲区。要做到这一点,您可以一次剪裁矩形的所有边。我不能肯定这是否比你之前做的更快,但这里说:

对于此算法,需要将多边形表示为点列表。

如何夹在一边:

代码语言:javascript
复制
# 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

然后你就可以做这样的事情:

代码语言:javascript
复制
poly = clipLeftEdge(poly)
poly = clipRightEdge(poly)
poly = clipTopEdge(poly)
poly = clipBottomEdge(poly)

如果原来的多边形是凸的,那么新的多边形也应该是凸的,这意味着你可以在画之前对它进行三角剖分或任何你需要的东西。

形成剪裁矩形边的一条线(如果你把它扩展为无限长的话)将整个空间分割成两个半空间。您需要提供一个函数来检查顶点是在“内部”半空间还是“外部”半空间中。例:矩形的左边在x= -15。若要检查点是否位于外部,请执行(point.x < -15)。

您还需要提供一个函数来相交2个顶点。你有一个顶点在外面,一个在内部和中间,有一条线,你想要剪辑对。例如,如果矩形的左边沿为x= -15:

代码语言:javascript
复制
factor = (-15 - p1.x)/(p2.x - p1.x)
newVertex.x = -15
newVertex.y = (p2.y - p1.y)*factor + p1.y

您还需要线性内插您所关心的所有其他属性(比如纹理坐标)。

如果您想真正精巧,您可以编写一次裁剪算法,并为每次运行提供适当的isOutside和intersect函数。

票数 0
EN

Computer Graphics用户

发布于 2017-12-18 09:54:06

根据拉斯的回答,我也建议使用剪刀矩形,但是,在同样缓慢的偶然情况下,是否可以使用Z缓冲区在不想绘制的区域中将Z设置为“近”?

顺便说一句,有一个示例图像将是有用的。

票数 0
EN
页面原文内容由Computer Graphics提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://computergraphics.stackexchange.com/questions/6002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档