OpenGL中复杂的纹理映射?

时间:2014-04-17 02:40:16

标签: c++ opengl mapping textures

在OpenGL中使用具有以下参数的纹理

glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );

并将其映射为:

glBegin( GL_QUADS );
glTexCoord2f( 3.0, 2.0 ); glVertex2f( -2.0, 2.0 ); // P1
glTexCoord2f( 0.0, 2.0 ); glVertex2f( -2.0, -1.0 ); // P2
glTexCoord2f( 0.0, 0.0 ); glVertex2f( 2.0, -2.0 ); // P3
glTexCoord2f( 3.0, 0.0 ); glVertex2f( 2.0, 1.0 ); // P4
glEnd( );

我不确定最终结果会是什么样子。我理解glTexCoord中大于1的值将如何使纹理在x轴上重复,而0和1纹素将在y轴上重复。在这种情况下,我对如何映射纹理感到困惑。会倒退吗?我似乎无法在互联网上找到任何类似的例子......

2 个答案:

答案 0 :(得分:1)

请记住,您的包裹模式适用于纹理坐标(s和t),而不适用于x轴和y轴。您的属性指定s坐标换行,t坐标钳位。

将此应用于您的坐标(基于纸质草图),您的s坐标沿着从P3到P4的边缘从0.0到3.0,从P2到P1的边缘。这些边缘在y轴方向上。由于您为s坐标指定了REPEAT,并且s坐标对应于纹理中的水平方向,因此纹理的原始左右方向将与渲染中的y轴对齐,并且图像将在此方向上重复3次。

同样,你的t坐标沿着从P3到P2的边缘从0.0到2.0,从P4到P1的边缘。这些边缘在渲染坐标系中从右向左,略微向上。由于您为t坐标指定了CLAMP,并且t坐标对应于纹理中的垂直方向,因此渲染四边形的右侧将从上到下(或从下到上显示纹理),具体取决于关于如何存储纹理的方向,并且四边形的左侧将重复纹理的顶部/底部像素行。

在文字中解释时,这听起来有点复杂,但它并不那么复杂。用白板上的一些草图来解释会容易得多。

答案 1 :(得分:1)

首先,您必须在此示例中描绘顶点本身的连接方式。因为S和T坐标只是纹理中的 ,所以您可以从中获取纹理。它们与任何一般空间轴无关(尽管它们可用于创建自己的特殊轴),它们实际上只是沿着多边形表面插值的坐标。

现在,由于你在这里处理四边形,讨论这些纹理坐标的插值比它需要的要复杂一些。让我们改为考虑一个漂亮的三角形(P1,P2,P3)......沿着边缘P1,P2,T坐标是常数,S坐标范围是 3.0 to 0.0 (纹理沿此边缘在S方向重复三次。)

对所有边缘重复此操作以获得纹理沿边缘的行为的一般图片,然后查找重心坐标以了解如何在三角形的内部部分插值坐标。

这是一个粗略的图表,说明了实现重心插值的数学运算:

bary http://img.docstoccdn.com/thumb/orig/7175492.png