Как использовать обычную систему координат при рисовании вершин в OpenGL с использованием библиотеки GLM - PullRequest
0 голосов
/ 03 декабря 2018

В настоящее время я практикую OpenGL и C ++, пытаясь создать 2D-игру.Просто что-то очень простое.Прямо сейчас мне удалось использовать библиотеку GLM для настройки «камеры» (с перспективой, а это не то, что мне нужно), но я столкнулся с несколькими проблемами при попытке отобразить часть пиксельной графики.made.

Например, есть система координат.Он явно сделан для 3D и рисования вещей в «мировом пространстве», а НЕ для рисования пиксельной графики на экране.Я просто хочу иметь возможность установить размер и положение каждой вершины, которую я рисую, используя обычную систему координат.Вот почему я перешел на Stack Exchange.

Из того, что я смог сказать, я должен использовать орфографический вид, но установка матрицы проекции на glm::ortho(), похоже, не помогает.,На самом деле ничего не появляется.Я получаю пустой экран.Сначала я подумал, что это связано с тем, что мои вершины все еще имеют размер в 1 пиксель, но даже после изменения их положения для формирования прямоугольника соответствующего размера (два треугольника, технически, но все же), на экране ничего не появилось.

Возможно, я неправильно использовал glm::ortho() или это какая-то другая проблема.


Установка матрицы проецирования на glm::ortho().

ProjectionMatrix = glm::ortho(0, 640, 480, 0);


Настройкавершины.
Vertex vertices[] = {
    // Position                     // Color                        // Texcoord
    glm::vec3(0.0f, 80.0f, 0.0f),   glm::vec3(1.0f, 0.0f, 0.0f),    glm::vec2(0.0f, 1.0f),  // bottom left
    glm::vec3(0.0f, 0.0f, 0.0f),    glm::vec3(0.0f, 1.0f, 0.0f),    glm::vec2(0.0f, 0.0f),  // top left
    glm::vec3(40.0f, 0.0f, 0.0f),   glm::vec3(0.0f, 0.0f, 1.0f),    glm::vec2(1.0f, 0.0f),  // top right
    glm::vec3(40.0f, 80.0f, 0.0f),  glm::vec3(1.0f, 1.0f, 0.0f),    glm::vec2(1.0f, 1.0f)   // bottom right
};

Если потребуется какой-либо дополнительный код / ​​информация, не стесняйтесь, дайте мне знать.Я немного не уверен, что показать, поэтому решил придерживаться очевидного.

1 Ответ

0 голосов
/ 03 декабря 2018

Функции в библиотеке glm являются шаблонными функциями.Тип аргументов влияет на тип операций.Если вы передаете интегральные константы функциям, то внутренние операции являются целочисленными операциями, и результат деления тоже является целым числом.

См. Реализацию glm::ortho:

template<typename T>
GLM_FUNC_QUALIFIER mat<4, 4, T, defaultp> ortho(T left, T right, T bottom, T top)
{
    mat<4, 4, T, defaultp> Result(static_cast<T>(1));
    Result[0][0] = static_cast<T>(2) / (right - left);
    Result[1][1] = static_cast<T>(2) / (top - bottom);
    Result[2][2] = - static_cast<T>(1);
    Result[3][0] = - (right + left) / (right - left);
    Result[3][1] = - (top + bottom) / (top - bottom);
    return Result;
}

Передайте константу с плавающей точкой в ​​функцию, чтобы решить вашу проблему:

ProjectionMatrix = glm::ortho(0.0f, 640.0f, 480.0f, 0.0f);
...