2016-10-29 2 views
0

я в настоящее время обучения OpenGL и от того, что я понял, я должен назвать(OpenGL) Линия рисуется, но формы не

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 

перед нанесением линий. Затем, чтобы рисовать фигуры нужно вызвать

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

рисовать фигуры, такие как GL_TRIANGLES и GL_QUADS. Я написал этот код с целью рисования одной строки сверху и 3 фигур, но была нарисована только линия. Вот мой код.

void drawScene() { 
//Clear information from last draw 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

glMatrixMode(GL_PROJECTION); //Switch to the drawing perspective 
glLoadIdentity(); //Reset the drawing perspective 



glBegin(GL_LINES); 

glColor3f(100,200,100); 
glLineWidth(10.0f); 
glVertex2f(-1.0f,0.8f); 
glVertex2f(1.0f,0.8f); 

glEnd(); 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

glBegin(GL_QUADS); //Begin quadrilateral coordinates 

//Trapezoid 
glVertex3f(-0.7f, -1.5f, -5.0f); 
glVertex3f(0.7f, -1.5f, -5.0f); 
glVertex3f(0.4f, -0.5f, -5.0f); 
glVertex3f(-0.4f, -0.5f, -5.0f); 

glEnd(); //End quadrilateral coordinates 


glBegin(GL_TRIANGLES); //Begin triangle coordinates 

//Pentagon 
glVertex3f(0.5f, 0.5f, -5.0f); 
glVertex3f(1.5f, 0.5f, -5.0f); 
glVertex3f(0.5f, 1.0f, -5.0f); 

glVertex3f(0.5f, 1.0f, -5.0f); 
glVertex3f(1.5f, 0.5f, -5.0f); 
glVertex3f(1.5f, 1.0f, -5.0f); 

glVertex3f(0.5f, 1.0f, -5.0f); 
glVertex3f(1.5f, 1.0f, -5.0f); 
glVertex3f(1.0f, 1.5f, -5.0f); 

//Triangle 
glVertex3f(-0.5f, 0.5f, -5.0f); 
glVertex3f(-1.0f, 1.5f, -5.0f); 
glVertex3f(-1.5f, 0.5f, -5.0f); 

glEnd(); //End triangle coordinates 

glutSwapBuffers(); //Send the 3D scene to the screen 
} 

Может кто-то пожалуйста, объясните мне, как переключаться между GL_PROJECTION и GL_MODELVIEW и как они работают?

+1

Вы используете устаревший API с фиксированной функциональностью. Я настоятельно рекомендую вам перейти на OpenGL 4.5, который будет разбираться. – ybungalobill

+2

Чтобы ускорить ваше обучение, вы должны больше узнать о окне и его координатах, окне просмотра OpenGL, NDC и пространстве клипов. Вы не будете правильно изучать OpenGL, кодируя и узнаете, что произойдет. Удачи. – Andreas

ответ

2

Z-значение ваших полигонов: -5.0, которое находится за пределами диапазона [-1, 1] для координат устройства, поэтому они отбрасываются.

Заменить все glVertex3f(x, y, z) звонки с glVertex2f(x,y).

+0

«отбитый» - неудачный термин здесь. В терминологии OpenGL отбраковка относится к устранению полигонов на основе их порядка намотки. То, что происходит в этом случае, называется «отсечением». –

+0

@ РетоКоради: Вы ошибаетесь. Прочитайте раздел спецификации OpenGL 4.5 «13 .5 Primitive Clipping»: «Примитивы отбираются против тома отсека, а затем привязаны к объему клипа» – ybungalobill

+0

Хорошо, технически спецификация OpenGL использует глагол «disard» для этого случая (поскольку объем тома не является здесь). Однако, как правило, «отбраковка» относится к отбрасыванию целых примитивов, тогда как «отсечение» относится к замене примитивов на более мелкие. Таким образом, среди двух его больше «отбраковка», чем «отсечение». Тем не менее, я выровняю его с терминологией OpenGL. – ybungalobill

Смежные вопросы