Невозможно определить ориентацию плоскости для рисования Opengl - PullRequest
0 голосов
/ 07 ноября 2018

Ниже приведена часть кода, которую я использую для рисования прямоугольника. Я вижу прямоугольник на дисплее, но его путают с квадрантами и координатами на плоскости дисплея.

int position_loc = glGetAttribLocation(ProgramObject, "vertex");
int color_loc = glGetAttribLocation(ProgramObject, "color_a");
GLfloat Vertices[4][4] = {
             -0.8f,  0.6f, 0.0f, 1.0f,
             -0.1f,  0.6, 0.0f, 1.0f,
             -0.8f,  0.8f, 0.0f, 1.0f,
             -0.1f,  0.8f, 0.0f, 1.0f
        };
GLfloat red[4] = {1, 0, 1, 1};
glUniform4fv(glGetUniformLocation(ProgramObject, "color"), 1, red);
PrintGlError();
glEnableVertexAttribArray(position_loc);
PrintGlError();
printf("\nAfter Enable Vertex Attrib Array");
glBindBuffer(GL_ARRAY_BUFFER, VBO);
PrintGlError();
glVertexAttribPointer(position_loc, 4, GL_FLOAT, GL_FALSE, 0, 0);
PrintGlError();
glBufferData(GL_ARRAY_BUFFER, sizeof Vertices, Vertices, GL_DYNAMIC_DRAW);
PrintGlError();
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
PrintGlError();

Таким образом, имея в виду вышеупомянутые вершины

GLfloat Vertices[4][4] = {
x,  y, p, q,
x1,  y1, p1, q1,
x2,  y2, p2, q2,
x3,  y3, p3, q3,
};

что такое p, q .. p1, q1 ..? на каком основании определяются эти два последних пункта? И как это влияет на x, y или x1, y1 .. и так далее?

1 Ответ

0 голосов
/ 07 ноября 2018

OpenGL работает с трехмерной системой координат с однородной координатой . Обычно значения передаются [x, y, z, w], где w является однородной частью. Перед любой проекцией [x, y, z] опишите положение точки в трехмерном пространстве. w обычно будет 1 для позиций и 0 для направлений.

Во время рендеринга OpenGL обрабатывает преобразования (вершинный шейдер), в результате чего получается новая точка [x', y', z', w']. Здесь необходим компонент w, потому что он позволяет нам описывать все преобразования, особенно переводы и (перспективные) проекции, как матрицы 4x4. Посмотрите на 1 и 2 для деталей о преобразованиях.

После этого происходит отсечение, и результирующие векторы делятся на компонент w, дающий так называемые Нормализованные координаты устройства [x'/w', y'/w', z'/w', 1]. Эти координаты NDC - это то, что фактически используется для рисования на экране. Первый и второй компоненты (x'/w' и y'/w') умножаются на размер области просмотра, чтобы получить окончательные координаты пикселей. Третий компонент (z'/w', он же глубина) используется для определения того, какие точки находятся впереди во время тестирования глубины. Последняя координата здесь больше не имеет смысла.

В вашем случае, без использования каких-либо преобразований или проекций, вы рисуете прямо в пространстве NDC, таким образом, z можно использовать для упорядочения треугольников по глубине, и w всегда должно быть 1.

...