0

古いプラズマ 8 ビット エフェクト アニメーションの OpenGL バージョンを DOS で作成しようとしましたが、行き詰まりました。ほとんどすべての OpenGL プログラムには、Win32 用のパレットを生成するためのものが含まれているので、古いプログラムにパレット アニメーションを適用するのはそれほど難しくないと思いました。

私の目的は、変化しないカラー インデックスと回転するパレットを持つテクスチャを生成することです。今週末、ウェブを掘り下げた後も、まだ修正できません。1 つのカラー インデックスでテクスチャを表示することさえできないので、その段階で何かが間違っています (機能する場合は、パレット サイクリング メカニズムを作成できます)。

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);

または、GL_COLOR_INDEX8_EXT と組み合わせて glColorTableEXT を使用する必要がありますか? テクスチャ パレットがサポートされていないことをどこかで読みましたか? Paletted Texture Extension について言及しているリンクを見つけました: 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 を試してみたいと思っています。

4

1 に答える 1

2

ほとんどすべてのOpenGLプログラムには、Win32用のパレットを生成するための何かが含まれているため

いいえ、絶対にありません。PIXELFORMATDESCRIPTORを意味する場合、それはパレット定義ではありません。カラーインデックスモードは、OpenGLで動作する主要なPITAであり、現在の実装では実際にはサポートされていません。

私はES/シェーダーの実装を探していません(私は初心者です;))

しかし、それはまさにあなたが使うべきものです。また、最新のOpenGLではシェーダーが必須です。インデックスをカラーに変換する1Dテクスチャへのルックアップを実行する単純なフラグメントシェーダーは、まさに必要なものです。また、最新のシステムを目指す場合は、とにかくシェーダーを使用する必要があります。

于 2012-11-04T20:29:21.127 に答える