2013-04-13 4 views
1

Я пытаюсь текстурировать карту конуса в opengl. Вот мой код.Текстура, отображающая конус в 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(); 

Я не получаю должного результата. Я здесь что-то не так?

+2

Вам необходимо предоставить дополнительную информацию по вашему вопросу. Например, скажите нам, что не так * с вашим «результатом»? –

+1

GL_POLYGON ограничивает геометрию выпуклой. Корпус конуса определенно вогнут, т. Е. Вы не можете использовать GL_POLYGON для него. GL_TRIANGLE_FAN с концентратором на кончике конуса намного лучше подходит для этой задачи. – datenwolf

+0

@NicolBolas Моя текстура не отображается на конус. Вместо этого я получаю проводной конус – Swetha

ответ

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.

С другой стороны, вы можете создать конус только с GL_TRIANGLES, где каждая из трех вершин образует треугольник. В этом случае вы могли бы начать/завершить только один раз за пределами s-loop.