我正在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();

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

最佳答案

第一件事:glBeginglEnd应该被称为相同的次数。当前循环在t循环中调用glBegin多次,而在s循环中调用glEnd仅一次。

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

如果使用GL_POLYGON,则“开始/结束”中列出的任何顶点构成一个多边形。所以如果你想/需要坚持它-在t循环中调用begin/end。
另一方面,可以创建只有GL_三角形的圆锥体,其中每个3个顶点形成一个三角形。在这种情况下,只能在s循环外执行一次开始/结束操作。

关于c - 在opengl中映射圆锥体的纹理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15989249/

10-11 04:36