#opengl
#opengl
Вопрос:
Я ходил вокруг и смотрел на другой код OpenGL 3 , просто чтобы лучше ознакомиться. Я также следую руководствам и пытаюсь кодировать с OpenGL.
итак, я нашел код, который рисует сферу. некоторые вершины находятся ниже, и вот результат:
.
..
...
Sphere vertices are: >> Vertice 10281: X>0.000747, Y>-0.000275, Z>1.000000!
Sphere vertices are: >> Vertice 10282: X>0.000769, Y>-0.000208, Z>1.000000!
Sphere vertices are: >> Vertice 10283: X>0.084840, Y>-0.023011, Z>0.996129!
Sphere vertices are: >> Vertice 10284: X>0.084840, Y>-0.023011, Z>0.996129!
Sphere vertices are: >> Vertice 10285: X>0.000769, Y>-0.000208, Z>1.000000!
Sphere vertices are: >> Vertice 10286: X>0.000784, Y>-0.000141, Z>1.000000!
Sphere vertices are: >> Vertice 10287: X>0.086522, Y>-0.015533, Z>0.996129!
Sphere vertices are: >> Vertice 10288: X>0.086522, Y>-0.015533, Z>0.996129!
Sphere vertices are: >> Vertice 10289: X>0.000784, Y>-0.000141, Z>1.000000!
Sphere vertices are: >> Vertice 10290: X>0.000793, Y>-0.000072, Z>1.000000!
Sphere vertices are: >> Vertice 10291: X>0.087546, Y>-0.007936, Z>0.996129!
...
..
.
Теперь код, который я скачал, рисует сферу в середине экрана. Он использует пакет glm. Чего я не понимаю, так это того, как «X = 0.087546» или «Z = 0.996129» переводятся в пиксели и рисуются на оси экрана.
Вот код glm:
//PROJECTION
glm::mat4 Projection = glm::perspective(45.0f, 1.0f, 0.1f, 100.0f);
angle = (GLfloat) (i/50 % 360); //to dia gia nan pio argo
//printf("Angle: >>>> %f, n", angle);
//VIEW
glm::mat4 View = glm::mat4(1.);
View = glm::translate(View, glm::vec3(0.f, 0.f, -5.0f)); // x, y, z position ?
//View = glm::rotate(View, angle * -1.0f, glm::vec3(1.f, 0.f, 0.f));
View = glm::rotate(View, angle * 0.5f, glm::vec3(0.f, 1.f, 0.f));
//View = glm::rotate(View, angle * 0.5f, glm::vec3(0.f, 0.f, 1.f));
//MODEL
glm::mat4 Model = glm::mat4(1.0);
glm::mat4 MVP = Projection * View * Model;
glUniformMatrix4fv(glGetUniformLocation(shaderprogram, "mvpmatrix"), 1, GL_FALSE, glm::value_ptr(MVP));
Окно, в котором он создается, представляет собой окно размером 600 * 600 пикселей. Итак, как X и Z сопоставляются с этими координатами?
Комментарии:
1. «Итак, как X и Z сопоставляются с этими координатами?» Вы в основном спрашиваете: «как вершины отображаются в OpenGL?» Хотя я мог бы описать, как это работает в ответе, я уже сделал это гораздо более подробно.
Ответ №1:
переводится в пиксели и рисуется на оси экрана.
Пройдя через конвейер преобразования. Координаты вершин умножаются на матрицу Modelview, результирующие координаты положения глаза умножаются на матрицу проекции, примитивы обрезаются, затем применяется разделение перспективы с получением NDC. Затем они отображаются в окне просмотра.
Ответ №2:
Показанные вами преобразования просто отображают объекты в куб, ограниченный (-1,-1,-1) до (1,1,1). Это «нормализованные координаты устройства». В нормализованных координатах устройства X и Y отображаются в пикселях, причем (-1,-1) является одним углом окна просмотра, а (1,1) — противоположным углом. Z отображает значения в буфере глубины, где -1 является ближней плоскостью клипа, а 1 — дальней плоскостью клипа.
Затем glViewport отображает нормализованные координаты устройства (X, Y) = (-1,-1)..(1,1), для фактических координат пикселей вашего окна просмотра, (0,0) .. (599,599) в вашем случае.