在现有texture_2D中裁剪四边形

时间:2014-05-17 10:19:15

标签: c++ visual-studio opengl

我已经渲染了纹理,并且我在其上映射了四边形/矩形。 (四边形可能小于或等于总纹理尺寸)

Quad映射后,我想删除其余部分(在quad外部绘制的内容)。

到目前为止,我可以映射四边形并获取我的子纹理(不要删除)但是我无法删除剩余的区域(四边形外)。

以下图片显示了该程序;

1.Original Image

Original Image

2.红色四边形的原始图像

Original Image with quad in red color

3.删除除四边形以外的所有内容。裁剪后的纹理

Everything removed except quad. Texture after Cropping

2 个答案:

答案 0 :(得分:0)

我不知道你在代码中如何计算纹理坐标但是没有数百万种方法可以做到这一点,所以我将为我想到的三种最简单的方法提供解决方案:

  1. 您只有一个包含四边形顶点位置的顶点数组,并使用它们来计算纹理坐标。在这种情况下,只需在绘图前修改顶点到裁剪区域的位置。
  2. 您有一个包含位置和纹理坐标的顶点数组(或两个顶点数组,每个顶点数一个)。您必须更改两者中涵盖的区域。对于您的特定用例,我建议您从vetex着色器中的顶点位置计算纹理坐标,以简化和提高效率。
  3. 您将裁剪区域作为制服发送到片段着色器。此解决方案假设您在正射空间中工作,图片将始终填满屏幕。在这种情况下,从输入向量位置,您知道自己的位置。使用简单的if条件,您可以检查是否超出边界。如果是这样,请将像素设置为黑色或使用discard取消像素的绘制。条件是耗时的,所以我只建议这个解决方案是你希望将裁剪的像素设置为黑色。如果您希望根本不显示它们,则解决方案1是最快的。

答案 1 :(得分:-1)

我已经使用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个黑色四边形,以裁剪所选区域之外的区域。

感谢Nehe。