要对单个四边形进行纹理贴图,以下代码可以正常工作:
glBegin( GL_QUADS);
glTexCoord2f( 0,0 ) ;
glVertex3f( -1,-1,0);
glTexCoord2f(1,0);
glVertex3f( 1,-1,0);
glTexCoord2f(1,1);
glVertex3f( 1, 1,0);
glTexCoord2f(0,1);
glVertex3f( -1, 1,0);
glEnd();
我的问题是,如何使用一个纹理映射以下多个四元组。 for循环创建一个由2个单位边缘的较小四边形组成的10x10四边形,我想将纹理从1x1th quad扩展到10x10th quad:
void wall(int num)
{
int wallx;
int wally;
for(wallx=0;wallx<num;wallx++)
{
for(wally=0;wally<num;wally++)
{
glPushMatrix();
glBegin( GL_QUADS);
glVertex3f( -1 + wallx*2,-1+ wally*2,0 );
glVertex3f( 1+ wallx*2,-1+ wally*2,0 );
glVertex3f( 1+ wallx*2, 1+ wally*2,0 );
glVertex3f( -1+ wallx*2, 1+ wally*2,0 );
glEnd();
glPopMatrix();
}
}
}
答案 0 :(得分:1)
正如您可以从第一个代码片段中看出的那样,纹理坐标在0-1范围内,因此0,0是一个角向前进到1,1对角线。四边形的单位大小无关紧要,纹理坐标位于纹理空间,而不是世界空间。
因此,您只需将纹理坐标计算为1 / n,其中n是您用于构建大型四边形的四边形数量。在这种情况下,第一个例如具有坐标(0,0),(0,0.1),(0.1,0)和(0.1,0.1)。只需计算1 / n然后在循环中使用此值来计算每个小四边形的坐标。如果你在四边形的一个角上使用了坐标(0,0),而在对角线的对角使用了(10,10)(在另外两个角上使用了正确的值)那么你的纹理会在你的纹理上平铺10次四
答案 1 :(得分:1)
如果你考虑一下,这就是为每个四边形指定正确的纹理坐标。
float unitx = 1.0f/(float)num;
float unity = 1.0f/(float)num;
for(wallx=0;wallx<num;wallx++)
{
for(wally=0;wally<num;wally++)
{
glPushMatrix();
glBegin( GL_QUADS);
glTexCoord2f( unitx * (float) wallx, unity * (float) wally );
glVertex3f( -1 + wallx*2,-1+ wally*2,0 );
glTexCoord2f( unitx * (float) (wallx+1), unity * (float) wally );
glVertex3f( 1+ wallx*2,-1+ wally*2,0 );
glTexCoord2f( unitx * (float) (wallx+1), unity * (float) (wally+1) );
glVertex3f( 1+ wallx*2, 1+ wally*2,0 );
glTexCoord2f( unitx * (float) wallx, unity * (float) (wally+1) );
glVertex3f( -1+ wallx*2, 1+ wally*2,0 );
glEnd();
glPopMatrix();
}
}