за пиксельный рисунок в OpenGL - PullRequest
2 голосов
/ 22 октября 2011

Раньше я писал небольшие игры с рисунком «на пиксель», Я имею в виду какую-то функцию SetPixel (x, y, color) или что-то подобное.

Я также заинтересован в OpenGL, но не очень много знаю.

Является ли это хорошим (быстрым) способом рисования в пикселях в OpenGL?

Было бы хорошо, например, использовать текстурированные квадраты в качестве спрайтов, или весь фоновый экран приложения, с возможностью установить отдельный пиксель с помощью своего собственного метода SetPixel я бы написал ... или любым другим способом - но это должно быть эффективно столько, сколько может

(особенно мне интересны базовые версии OGL для основы 1.0)

Ответы [ 2 ]

6 голосов
/ 22 октября 2011

Вы можете установить проекцию, которая будет отображать координаты вершин 1: 1 в координатах пикселей:

glViewport(0, 0, window_width, window_height);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, window_width, 0, window_height, -1, 1);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

С этого момента координаты вершин X, Y представлены в пикселях с началом координат в нижнем левом углу. Теоретически вы можете использовать непосредственный режим с примитивами GL_POINT. Но гораздо лучше собирать вещи. Вместо индивидуальной отправки каждой точки создайте массив всех точек, которые вы хотите нарисовать:

struct Vertex
{
    GLfloat x,y,red,green,blue;
};

std::vector<Vertex> vertices;
/* fill the vertices vector */

Это вы можете OpenGL указать на ...

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);

/* Those next two calls don't copy the data, they set a pointer, so vertices must not be deallocated, as long OpenGL points to it! */
glVertexPointer(2, GL_FLOAT, sizeof(Vertex), &vertices[0].x);
glColorPointer(3, GL_FLOAT, sizeof(Vertex), &vertices[0].red);

… и получить к нему доступ и нарисовать все это одним вызовом:

glDrawArrays(GL_POINTS, 0, vertices.size();
1 голос
/ 22 октября 2011

Вы действительно не хотите этого делать.

Является ли это хорошим (быстрым) способом рисования в пикселях в OpenGL?

Нет хорошего или быстрого способа сделать это.Это очень не рекомендуется из-за скорости.

Правильный способ, хотя и не простой (или в некоторых случаях возможный) в OGL 1, это использовать пиксельные шейдеры или режимы наложения.Это единственный правильный путь, все остальное взламывает всю систему.

В зависимости от того, как данные должны быть изменены, цвета вершин и режимы наложения могут решить некоторые задачи.Он не будет окрашивать каждый пиксель по отдельности, но вы можете изменить текстуру необходимо быстрее.

Чтобы сделать это, вы можете нарисовать однопиксельные четырехугольники (хотя необходимо соблюдать осторожность, чтобы сместить их и обработать фильтрацию, чтобы избежать размытия) или вы можете получить данные текстуры и манипулировать ими позже.Оба будут невероятно медленными, но могут функционировать.

Работа с данными текстуры, вероятно, проще и может быть немного быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...