纹理在opengl中映射锥形

时间:2013-04-13 15:10:27

标签: c opengl graphics

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

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

1 个答案:

答案 0 :(得分:0)

首先: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,则begin / end中列出的任何顶点都会形成一个多边形。所以如果你想/需要坚持下去 - 在t-loop中调用begin / end。

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