Невозможно определить ориентацию плоскости для рисования Opengl

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

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 .. и так далее?

2

Решение

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

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

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

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector