OpenGL - анимация/цикл/поворот палитры

Я пытался создать OpenGL-версию старой плазменной анимации с 8-битным эффектом в DOS, но я застрял. Поскольку почти каждая программа OpenGL включала что-то для создания палитры для Win32, я подумал, что применить анимацию палитры к моей старой программе не составит труда.

Моя цель — сгенерировать текстуру с индексами цвета, которые не меняются, и вращающейся палитрой. После копания в Интернете в эти выходные я все еще не могу это исправить. Я даже не могу отобразить текстуру с одним цветовым индексом, поэтому на этом этапе что-то не так (если это сработает, я могу создать механизм циклирования палитры).

Я могу принудительно перейти в режим палитры, используя PFD_TYPE_COLORINDEX, и нарисовать несколько случайных пикселей, используя glIndexi. Я читал, что glDrawPixels и glReadPixels работают медленно, а последний не так точен при возврате пикселей из фреймбуфера (из-за неточного позиционирования в результате ошибок округления или чего-то еще).

Я попробовал ключевое слово GL_COLOR_INDEX. Я также пробовал: glPixelTransferi(GL_MAP_COLOR, true); glPixelMapfv(GL_PIXEL_MAP_I_TO_R, ...); glTexImage2D... Часть кода, который я пробовал до сих пор (последние изменения):

Инициальная часть:

void* rawplasma;
GLuint  plastexture;

rawplasma = (void*) malloc(256*256);
 memset(rawplasma,rand()%256,256*156);
glEnable( GL_TEXTURE_2D );
glGenTextures(1, plastexture);
glBindTexture(GL_TEXTURE_2D, plastexture);
glTexImage2D( GL_TEXTURE_2D, 0, GL_COLOR_INDEX, 256, 256, 0, GL_COLOR_INDEX, GL_UNSIGNED_BYTE,     rawplasma );

обновить/нарисовать:

float Rmap[256];
float Gmap[256];
float Bmap[256];
float Amap[256];

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
memset(rawplasma,rand()%256,256*256); //check if it works
glTexImage2D( GL_TEXTURE_2D, 0, GL_COLOR_INDEX, 256, 256, 0, GL_COLOR_INDEX, GL_UNSIGNED_BYTE,     rawplasma );
glBindTexture(GL_TEXTURE_2D, plastexture );
/*
glPixelTransferi( GL_MAP_COLOR, GL_TRUE );
    glPixelMapfv(GL_PIXEL_MAP_I_TO_R,mapSize,Rmap);
    glPixelMapfv(GL_PIXEL_MAP_I_TO_G,mapSize,Gmap);
    glPixelMapfv(GL_PIXEL_MAP_I_TO_B,mapSize,Bmap);
    glPixelMapfv(GL_PIXEL_MAP_I_TO_A,mapSize,Amap);
glPixelTransferi(GL_MAP_COLOR,GL_TRUE);
*/
glBegin(GL_QUADS);
    glTexCoord2f(1.0, 0.0);  glVertex2f(-1.0, -1.0);
    glTexCoord2f(0.0, 0.0);  glVertex2f( 1.0, -1.0);
    glTexCoord2f(0.0, 1.0);  glVertex2f( 1.0,  1.0);
    glTexCoord2f(1.0, 1.0);  glVertex2f(-1.0,  1.0);
glEnd();
glFlush();
SwapBuffers(hDC);

Или мне следует использовать glColorTableEXT в сочетании с GL_COLOR_INDEX8_EXT? Я где-то читал, что текстурированные палитры не поддерживаются? Я нашел ссылку, в которой упоминается расширение Paletted Texture: http://www.cs.rit.edu/~ncs/Courses/570/UserGuide/OpenGLonWin-20.html

Это то, что я хочу (но тогда в OpenGL):

http://www.codeforge.com/read/174459/PalAnimDemo.h__html

Я не ищу реализации ES/Shader (я всего лишь новичок ;)) и DirectDraw может быть проще, я думаю, но я хочу попробовать OpenGL.


person Mat90    schedule 04.11.2012    source источник
comment
Поскольку почти каждая программа OpenGL включает что-то для создания палитры для Win32 Так и есть? С тех пор как? И то, что вы новичок, не является оправданием для того, чтобы не использовать шейдеры.   -  person Nicol Bolas    schedule 04.11.2012


Ответы (1)


Поскольку почти каждая программа OpenGL включает что-то для создания палитры для Win32.

Нет, определенно нет. Если вы имеете в виду PIXELFORMATDESCRIPTOR, это не является определением палитры. Режим цветового индекса был основным PITA для работы в OpenGL, и никакая текущая реализация фактически не поддерживает его.

Я не ищу реализации ES/Shader (я просто новичок ;))

Но это именно то, что вы должны использовать. Также шейдеры обязательны в современном OpenGL. Простой фрагментный шейдер, который выполняет поиск в одномерной текстуре, превращая индекс в цвет, — это именно то, что вам нужно. И если вы нацелены на современные системы, вам все равно придется использовать шейдер.

person datenwolf    schedule 04.11.2012
comment
Вот пример реализация шейдера. - person StuGrey; 05.11.2012
comment
Спасибо. Я проверю это. - person Mat90; 06.11.2012
comment
Я имел в виду PFD_NEED_PALETTE и PFD_TYPE_COLORINDEX в структуре PIXELFORMATDESCRIPTOR для определения палитры (последнее для установки/принудительного ее использования, первое, когда требуется палитра). - person Mat90; 27.11.2012
comment
@Mat90: режим индексированного цвета не поддерживается ни одной реализацией OpenGL с 1998 года или около того. Вы получите только резервный контекст OpenGL-1.1 программного растеризатора, если он вообще есть. Просто. Не надо. Использовать. Это! - person datenwolf; 27.11.2012