Как мне нарисовать пиксели в виде текстуры для полигона в OpenGL?
Вопрос
В C ++ OpenGL я хочу нарисовать каждый пиксель вручную (как текстуру, я предполагаю) на простом квадратном примитиве или даже на 2 полигонах, образующих квадрат.
Я понятия не имею, с чего начать или какие фразы искать.Я ищу отображение текстур или создание текстур?Большинство примеров предназначены для загрузки из файла, но я не хочу этого делать.
Я пробовал читать свое руководство по программированию на OpenGL, но это просто лабиринт, так как я совсем новичок в OpenGL.Пожалуйста, помогите.
Решение
Внимательно посмотрите на glTexImage2D.Это вызов, который загружает изображение в OpenGL для получения 2D-текстуры.
glTexImage2D фактически принимает необработанный указатель на пиксельные данные в изображении.Вы можете самостоятельно выделить память и напрямую установить данные изображения (как вам угодно), затем вызвать эту функцию для передачи изображения в OpenGL.
После того как вы создали текстуру, вы можете привязать ее к состоянию, чтобы ваши треугольники использовали эту текстуру.
В OpenGL нет ничего, что напрямую требовало бы загрузки изображений, используемых в качестве текстур, из файлов.Хорошим ресурсом для текстур может быть найдено в этой статье GameDev.
Другие советы
Если квадрат, на который вы рисуете, является двумерным и не повернутым, возможно, вы ищете Gldrawпиксели.Это позволяет вам нарисовать прямоугольную область пикселей непосредственно в буфере без использования каких-либо полигонов.
Если вы новичок, то я бы рекомендовал начать с первого урока на с НеХэ.
Обратите внимание, что в то время как glTexImage2D()
принимает указатель на пиксели для загрузки, его не волнуют какие-либо изменения в этих данных после вызова.То есть данные действительно загружаются из указанной вами области памяти, и OpenGL создает свою собственную копию.
Это означает, что если данные изменятся, вам нужно будет либо повторно выполнить вызов glTexImage2D(), либо использовать что-то вроде glTexSubImage2D() glTexSubImage2D()
чтобы выполнить частичное обновление.Я бы рекомендовал протестировать и профилировать, чтобы увидеть, происходит ли быстрое обновление субтекстур, не уверен, как реальные драйверы оптимизируются для этого случая.
Спасибо Риду Копси за то, что указал мне на 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-массив.
То, что вы ищете, обычно называется "рендеринг в текстуру".
http://developer.nvidia.com/object/gdc_oglrtt.html
Этот учебник довольно старый.Я бы предположил, что некоторые из этих расширений на самом деле не являются расширениями в более новых версиях OGL.Извини, я больше ничем не могу тебе помочь.Я больше не работаю напрямую с графическими API, а если бы и работал, то использовал бы D3D, если бы мог (чтобы избежать супа расширений и по другим причинам, которыми я не буду вас утомлять).