C++ OpenGL中的复杂纹理映射?
在OpenGL中使用具有以下参数的纹理C++ OpenGL中的复杂纹理映射?,c++,opengl,mapping,textures,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
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 texel将在y轴上重复。在这种情况下,我不知道如何映射纹理。会是向后的吗?我在互联网上似乎找不到任何类似的例子…请记住,您的包裹模式是针对纹理坐标(s和t),而不是针对x轴和y轴。属性指定s坐标换行和t坐标夹紧 将其应用于坐标(基于图纸草图),沿着从P3到P4的边,以及从P2到P1的边,s坐标从0.0到3.0。这些边位于y轴方向。由于为s坐标指定了
REPEAT
,并且s坐标对应于纹理中的水平方向,因此纹理的原始左向右方向将与渲染中的y轴对齐,并且图像将在此方向重复3次
类似地,沿从P3到P2的边以及从P4到P1的边,t坐标从0.0到2.0。这些边在渲染坐标系中从右向左,并稍微向上移动。由于为t坐标指定了钳制
,并且t坐标对应于纹理内的垂直方向,因此渲染四元体的右侧将从上到下(或从下到上,取决于纹理的存储方式)方向显示纹理,四边形的左侧将重复纹理的顶部/底部像素行
当在文本中解释时,这听起来有点复杂,但实际上并没有那么复杂。在白板上画几个草图会更容易解释。首先,在本例中,您必须描绘顶点本身是如何连接的。因为S和T坐标只不过是从纹理中获取纹理的,其中。它们与任何一般空间轴无关(尽管它们可以用来创建自己的特殊轴),它们实际上只是沿多边形曲面插值的坐标 现在,由于您在这里处理的是一个四边形,因此讨论这些纹理坐标的插值比需要的要复杂一些。让我们来考虑一个好的三角形(P1,P2,P3)…沿着边缘P1、P2,
T
坐标是恒定的,S
坐标范围从3.0到0.0(纹理沿着该边缘在S
方向重复三次)
对所有边重复此操作,以获得沿边纹理行为的一般图片,然后查找重心坐标以了解如何在三角形的内部零件上插值坐标
下面是一个粗略的图表,说明了实现重心插值的数学方法:
(来源:)