Как нарисовать пиксели в качестве текстуры для многоугольника в OpenGL? - PullRequest
4 голосов
/ 20 марта 2009

В C ++ OpenGL я хочу нарисовать каждый пиксель вручную (в качестве текстуры, я полагаю) на простом квадратном примитиве или на самом деле 2 полигона, образующих квадрат.

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

Я попытался прочитать мою книгу по Руководству по программированию OpenGL, но это всего лишь лабиринт, так как я совсем новичок в OpenGL. Пожалуйста, помогите.

Ответы [ 6 ]

6 голосов
/ 20 марта 2009

Внимательно посмотрите на glTexImage2D. Это вызов, который загружает изображение в OpenGL для 2D-текстуры.

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

После того, как вы создали текстуру, вы можете привязать ее к состоянию, чтобы ваши треугольники использовали эту текстуру.

В OpenGL нет ничего, что напрямую требовало бы загрузки изображений, используемых в качестве текстур, из файлов. Хороший ресурс для текстур можно найти в этой статье на GameDev.

1 голос
/ 20 марта 2009

Если квадрат, на который вы рисуете, является двухмерным и не повернутым, возможно, вы ищете glDrawPixels . Позволяет рисовать прямоугольную область пикселей непосредственно в буфере без использования каких-либо полигонов.

0 голосов
/ 29 марта 2009

Спасибо Риду Копси за то, что он указал мне на glTexImage2D. Оказывается, это очень просто; просто передайте массив GLubyte в функцию glTexImage2D (а также все функции, необходимые для связывания текстуры и т. д.). Не пробовал этот точный фрагмент кода, но он должен работать нормально. Элементы массива представляют собой последовательную версию строк, столбцов и каналов.

int pixelIndex = 0;
GLubyte pixels[400];

for (int x = 0; x < 10; x++)
{
    for (int y = 0; y < 10; x++)
    {
         for (int channel = 0; channel < 4; channel++)
         {
             // 0 = black, 255 = white
             pixels[pixelIndex++] = 255;
         }
    }
}

glTexImage2D(
    GL_TEXTURE_2D, 0, GL_RGBA, SIZE, SIZE, 0,
    GL_RGBA, GL_UNSIGNED_BYTE, pixels);

Я читал в книге OpenGL, что вы можете использовать 2D-массив для монохромных изображений, поэтому я предполагаю, что вы можете использовать 3D-массив.

0 голосов
/ 20 марта 2009

Обратите внимание, что хотя <a href="http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/teximage2d.html" rel="nofollow noreferrer">glTexImage2D()</a> принимает указатель на пиксели для загрузки, он не заботится о каких-либо изменениях этих данных после вызова. То есть данные действительно загружаются из указанной вами области памяти, и OpenGL создает собственную копию.

Это означает, что если данные изменятся, вам потребуется либо повторно выполнить вызов glTexImage2D (), либо использовать что-то вроде <a href="http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/texsubimage2d.html" rel="nofollow noreferrer">glTexSubImage2D()</a> для частичного обновления. Я бы порекомендовал провести тестирование и профилирование, чтобы убедиться, что обновление под-текстуры происходит быстро, но я не знаю, как оптимизировать драйверы для этого случая.

0 голосов
/ 20 марта 2009

То, что вы ищете, обычно называется «рендеринг в текстуру».

http://developer.nvidia.com/object/gdc_oglrtt.html

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

0 голосов
/ 20 марта 2009

Если вы новичок, я бы порекомендовал начать с учебника с NeHe .

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