Как мне нарисовать пиксели в виде текстуры для полигона в OpenGL?

StackOverflow https://stackoverflow.com/questions/664698

  •  21-08-2019
  •  | 
  •  

Вопрос

В 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, если бы мог (чтобы избежать супа расширений и по другим причинам, которыми я не буду вас утомлять).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top