【问题标题】:OpenGL - Animate/cycle/rotate paletteOpenGL - 动画/循环/旋转调色板
【发布时间】: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


【解决方案1】:

因为几乎每个 OpenGL 程序都包含一些东西来为 Win32 生成调色板

不,绝对不是。如果您的意思是 PIXELFORMATDESCRIPTOR,that 不是调色板定义。颜色索引模式是在 OpenGL 中使用的主要 PITA,目前没有任何实现真正支持它。

我不是在寻找 ES/Shader 实现(我只是一个初学者;))

但这正是您应该使用的。在现代 OpenGL 中,着色器也是强制。一个简单的片段着色器,它执行对一维纹理的查找,将索引转换为颜色,这正是您所需要的。如果你的目标是现代系统,那么无论如何你都必须使用着色器。

【讨论】:

  • Here 是着色器实现的一个示例。
  • 谢谢。我会检查一下。
  • 我指的是 PIXELFORMATDESCRIPTOR 结构中的 PFD_NEED_PALETTE 和 PFD_TYPE_COLORINDEX 用于调色板定义(后者用于设置/强制它,前者用于需要调色板时)。
  • @Mat90:自 1998 年左右以来,任何 OpenGL 实现都不支持索引颜色模式。你只会得到一个软件光栅化程序后备 OpenGL-1.1 上下文,如果有的话。 只是。不。采用。它!