Как нарисовать набор координат в OpenGL? - PullRequest
1 голос
/ 19 июня 2019

Я пытаюсь сделать «Игру жизни» Конвея в C ++ и использую OpenGL (однако я довольно новичок в OpenGL), потому что он поддерживает отрицательные координаты и, следовательно, бесконечный мир.
У меня есть класс с именем GameOfLife`` который обрабатывает весь мир и имеет живые клетки в виде [x, y] координат в векторе.Поэтому я собираюсь использовать цикл for во всех живых координатах ячеек и отображать по одному пикселю для каждой координаты.
Однако, что бы я ни пытался, на экране ничего не появляется, независимо от того, что я делаю.Ниже приведен код с пустой функцией glBegin и glEnd.Что я должен поместить между ними, чтобы он рендерился.

Я пытался:
разделить каждую координату на 400, чтобы получить float для 1 пикселя.
добавив 1/400 к обоим xи у для третьей и четвертой стороны.

#include "gol.h"
#include <GL/glew.h>
#include <GLFW/glfw3.h>
int main()
{
  std::vector<std::vector<int>> dupl;
  std::ifstream infile { "test.rle" };
  std::string file_contents { std::istreambuf_iterator<char>(infile), std::istreambuf_iterator<char>() };
  parse_rle(file_contents, 0, dupl);
  GameOfLife gol;
  gol.place_cells(dupl);
  //gol.update();
  GLFWwindow* window;
  if (!glfwInit())
    return 1;
  int width  = 400;
  window = glfwCreateWindow(width, width, "Window", NULL, NULL);
  if (!window) {
    glfwTerminate();
    return 1;
  }
  glfwMakeContextCurrent(window);
  if(glewInit()!=GLEW_OK)
    std::cout<<"Error"<<std::endl;
  glEnable(GL_DEPTH_TEST);
  while(!glfwWindowShouldClose(window)) {
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    for(std::vector<int> i : gol.alive)
    {
        glBegin(GL_QUADS);

        glEnd();
    }
    glfwSwapBuffers(window);
    glfwPollEvents();
  }
  glfwTerminate();
}

Ответы [ 2 ]

1 голос
/ 19 июня 2019

Так как тип координат вершины является целочисленным типом данных

std::vector<std::vector<int>> dupl;

, вы должны использовать glVertex2i().

Координаты вершины должны находиться в диапазоне нормализованного пространства устройства, которое составляет [-1, 1] для всех 3 компонентов (x, y, z).Чтобы «спроецировать» ваши координаты вершины на этот диапазон, вы должны использовать матрицу проекции.

Определить диапазон, который больше координат вершины, и установить матрицу ортографической проекции (см. glMatrixMode) до glOrtho, прежде чем рисовать геометрию.

double min_x = ..., min_y = ..., max_x = ..., max_y = ...;

glMatrixMode(GL_PROJECTION);
glOrtho(min_x, max_x, min_y, max_y, -1.0, 1.0);

while(!glfwWindowShouldClose(window) {
    // [...]
}

Обратите внимание, что ортографическая проекция также должна учитывать соотношение сторон области просмотра.
Например, координаты вершины находятся в ярости [0, 400], а соотношение сторон окна просмотра составляет 16,0 / 9,0:

glOrtho(0.0, 400.0*16.0/9.0, 0.0, 400.0, -1.0, 1.0);

Если вы предпочитаете использовать координаты окна, а размер окна, например, 800x600:

glOrtho(0.0, 800.0, 0.0, 600.0, -1.0, 1.0);

glBegin / glEnd должен содержать как минимум координаты вершины для одного Примитива .Примитив GL_QUADS состоит из 4 координат вершин.
Но вы можете инкапсулировать столько квадов в одну последовательность, сколько захотите.Таким образом, for -петл должен быть между glBegin и glEnd:

glBegin(GL_QUADS);
for(std::vector<int> &v : gol.alive)
{
   glVertex2i(v[0], v[1]);
}
glEnd();
1 голос
/ 19 июня 2019

Если вы рисуете четырехугольники (GL_QUADS), вам нужно сделать 4 вызова на glVertex2f с координатами каждого угла четырехугольника, который вы хотите нарисовать.Для треугольников используйте GL_TRIANGLES и 3 звонка.Для очков GL_POINTS и 1 вызов.

Также было бы полезно установить цвет с помощью glColor3f.

Например, если я не ошибаюсь, это закрасит левую половинувашего экрана красного цвета:

glBegin(GL_QUADS);
glColor3f(1, 0, 0);
glVertex2f(-1, -1);
glVertex2f(-1,  1);
glVertex2f( 0,  1);
glVertex2f( 0, -1);
glEnd();

Кроме того, вам не нужен буфер глубины для 2D-графики.

Кроме того, «поскольку он поддерживает отрицательные координаты», это бессмысленная причина использовать OpenGL,Это не означает, что весь бесконечный мир поместится на экране одновременно - координаты экрана изменяются только от -1 до 1.

...