#c #math #opengl #game-engine #glm-math
Вопрос:
Итак, я довольно новичок в OpenGL, я пытался создать орфографическую проекцию, и проблема в том, когда я это делаю
glm::mat4 ortho;
ortho = glm::ortho(-(float)WINDOW_WIDTH / 2.0f, (float)WINDOW_WIDTH / 2.0f, -(float)WINDOW_HEIGHT / 2.0f, (float)WINDOW_HEIGHT / 2.0f, -1.f, 1.f);
Это работает просто отлично, но точка 0, 0 находится в середине экрана
То, что я хочу сделать, это иметь 0, 0 точек в левом нижнем углу окна, но когда я это сделаю
glm::mat4 ortho;
ortho = glm::ortho(0.0f, (float)WINDOW_WIDTH, 0.0f, (float)WINDOW_HEIGHT, -1.0f, 1.0f);
Я так долго искал, так что сейчас я просто прошу о помощи
Это позиции вершин моего прямоугольника
float positions[8] =
{
-100.0f, -100.0f,
100.0f, -100.0f,
100.0f, 100.0f,
-100.0f, 100.0f,
};
Я также использую буфер индекса, чтобы нарисовать его
unsigned indices[6] =
{
0, 1, 2,
2, 3, 0
};
Это мои буфера
unsigned buffer = 0;
glGenBuffers(1, amp;buffer);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData(GL_ARRAY_BUFFER, 8 * sizeof(float), positions, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2, 0);
unsigned ibo = 0;
glGenBuffers(1, amp;ibo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 6 * sizeof(unsigned), indices, GL_STATIC_DRAW);
И он нарисован с помощью
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, nullptr);
Комментарии:
1. и какова третья координата для вершин вашего прямоугольника ?
2. кроме того, как вы рисуете прямоугольник ? Это тот же код, который нарисовал первый бежевый прямоугольник ?
3. да, эти прямоугольники те же самые, теперь я вижу, что немного запутал их, но это просто шейдер, который меняет их цвет
4. Возможно ли, что шейдер также изменяет цвет второго треугольника, настройки лицевой стороны или что-то в этом роде, потому что на самом деле похоже, что вам не хватает одного из двух треугольников, составляющих ваш прямоугольник
5. Я просто попробовал его с одним сплошным цветом, и на большом окне это выглядит так i.imgur.com/ImMcaDL.png
Ответ №1:
Итак, что я сделал неправильно, так это то, что в шейдере я умножил позицию на проекцию орта, а не проекцию орта на позицию, так что
не делай этого:
gl_Position = position * u_MVP;
сделай это:
gl_Position = u_MVP * position;