在现有的 texture_2D 中裁剪四边形
Posted
技术标签:
【中文标题】在现有的 texture_2D 中裁剪四边形【英文标题】:Crop a quad in existing texture_2D 【发布时间】:2014-05-17 10:19:15 【问题描述】:我已经渲染了纹理,并在其上映射了一个四边形/矩形。 (四边形可能小于或等于总纹理大小)
一旦四边形被映射,我想删除其余的(在四边形之外绘制的)。
到目前为止,我可以映射四边形并获取我的子纹理(不被删除)但是我无法删除剩余的区域(四边形之外)。
以下图片展示了该过程;
1.原图
2.红色四边形的原始图像
3. 除四边形外的所有内容均已删除。裁剪后的纹理
【问题讨论】:
没有。我在视口上映射了几个纹理。现在我必须在渲染场景上选择一个矩形区域。这个矩形区域之外的任何东西都应该被裁剪(或变黑)。我可以成功绘制四边形并取矩形区域。但我无法将其余部分涂黑(在图像 3 中,黑色区域被裁剪,但我无法在 opengl 中做到这一点)。我试图删除所有纹理,但它仍然存在。 如果您提供所需结果的(近似)图像,这可能会很有用。 你如何渲染四边形?通常,调整纹理坐标就足够了。如果使用着色器,可以在像素着色器中实现范围检查。 【参考方案1】:我不知道您是如何在代码中计算纹理坐标的,但没有数百万种方法可以做到这一点,所以我将针对我想到的三种最简单的方法给出一个解决方案:
-
您只有一个包含四边形顶点位置的顶点数组,并使用它们来计算纹理坐标。在这种情况下,只需在绘制之前将顶点的位置修改为裁剪区域即可。
您有一个包含位置和纹理坐标的顶点数组(或两个顶点数组,每个数组一个)。您必须更改两者覆盖的区域。对于您的特定用例,为了简单和高效,我建议从 vetex 着色器中的顶点位置计算纹理坐标。
您将裁剪区域作为制服发送到片段着色器。此解决方案假设您在正交空间中工作,图片将始终填满屏幕。在这种情况下,从输入向量的位置,你就知道你在哪里。使用简单的 if 条件,您可以检查您是否超出边界。如果是这样,请将像素设置为黑色或使用
discard
取消像素的绘制。条件是耗时的,所以我只建议这个解决方案是您希望将裁剪的像素设置为黑色。如果您希望它们根本不显示,解决方案 1 是最快的。
【讨论】:
【参考方案2】:我已经使用 Nehe 的 Lesson 3 解决了这个问题。我用过
glColor3f(0.0f,0.0f,0.0f); // Set The Color To Black
glBegin(GL_QUADS); // Start Drawing Quads
glVertex3f(-1.0f, 1.0f, 0.0f); // Left And Up 1 Unit (Top Left)
glVertex3f( 1.0f, 1.0f, 0.0f); // Right And Up 1 Unit (Top Right)
glVertex3f( 1.0f,-1.0f, 0.0f); // Right And Down One Unit(Bottom Right)
glVertex3f(-1.0f,-1.0f, 0.0f); // Left And Down One Unit (Bottom Left)
glEnd(); // Done Drawing A Quad`
绘制 4 个黑色四边形,裁剪所选区域之外的区域。
感谢尼赫。
【讨论】:
以上是关于在现有的 texture_2D 中裁剪四边形的主要内容,如果未能解决你的问题,请参考以下文章