1

我正在尝试在opengl中对一个圆锥体进行纹理贴图。这是我的代码。

glPushMatrix();
float radius=1;
float r=1;
float h=1;
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texSet[2]);
float t,s;
float i=0.05;

for(s=0.0;s<1.0;s+=i)
{
    for(t=0.0;t<=1.0;t+=i)
    {       
        float r=((h-t)/h)*radius;
        glBegin(GL_POLYGON);
        glTexCoord2f(s,t);
        glVertex3f(r*cos(2*M_PI*s),t,r*sin(2*M_PI*s));
        glTexCoord2f(s+i,t);
        glVertex3f(r*cos(2*M_PI*(s+i)),t,r*sin(2*M_PI*(s+i)));
        glTexCoord2f(s+i,t+i);
        glVertex3f(r*cos(2*M_PI*(s+i)),(t+i),r*sin(2*M_PI*(s+i)));
        glTexCoord2f(s,t+i);
        glVertex3f(r*cos(2*M_PI*s),(t+i),r*sin(2*M_PI*s));
    }
    glEnd();
}

glDisable(GL_TEXTURE_2D);
glPopMatrix();

我没有得到正确的结果。我在这里做错了吗?

4

1 回答 1

0

第一件事:glBegin并且glEnd应该被调用相同的次数。您当前的循环glBegin在 t-loop 中调用了几次,但glEnd在 s-loop 中只调用了一次。

for(s=0.0;s<1.0;s+=i)
{
    for(t=0.0;t<=1.0;t+=i)
    {       
        glBegin(GL_POLYGON);
        ...
    }
    glEnd();
}

如果您使用 GL_POLYGON,则 begin/end 中列出的任何顶点都会形成一个多边形。因此,如果您想/需要坚持下去 - 在 t-loop 中调用 begin/end。

另一方面,您可以仅使用 GL_TRIANGLES 创建圆锥体,其中每 3 个顶点形成一个三角形。在这种情况下,您只能在 s-loop 之外执行一次开始/结束。

于 2013-04-13T19:00:18.167 回答