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? Я где-то читал, что текстурированные палитры не поддерживаются? Я нашел ссылку, которая упоминает расширение палитровой текстуры: 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.
1 ответ
Поскольку почти в каждой программе OpenGL есть что-то для создания палитры для Win32
Нет, определенно нет. Если вы имеете в виду PIXELFORMATDESCRIPTOR, это не определение палитры. Режим цветового индекса был основной PITA для работы в OpenGL, и никакая текущая реализация на самом деле не поддерживает его.
Я не ищу реализации ES/Shader (я только начинающий;))
Но это именно то, что вы должны использовать. Также шейдеры обязательны в современном OpenGL. Простой фрагментный шейдер, который выполняет поиск в 1D текстуре, превращая индекс в цвет, это именно то, что вам нужно. И если вы стремитесь к современным системам, вам все равно придется использовать шейдер.