我正在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();
我没有得到正确的结果。我在这里做错什么了吗?
最佳答案
第一件事:glBegin
和glEnd
应该被称为相同的次数。当前循环在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/