【发布时间】:2024-01-06 22:02:01
【问题描述】:
我试图在 DOS 中创建一个旧的等离子 8 位效果动画的 OpenGL 版本,但我被卡住了。由于几乎每个 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。
【问题讨论】:
-
"因为几乎每个 OpenGL 程序都包含一些东西来为 Win32 生成调色板" 它有吗?从何时起?作为初学者并不能成为不使用着色器的借口。
标签: opengl animation rotation palette 8-bit