Я пытался создать 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.