Проблема с орфографической проекцией в OpenGL

#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;