Ниже приведена часть кода, которую я использую для рисования прямоугольника.
И я могу видеть прямоугольник на дисплее, но перепутанный с квадрантами и координатами на плоскости дисплея.
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 .. и так далее?
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.
Других решений пока нет …