2012-11-04 28 views
0

我試圖在DOS中創建一箇舊的等離子8bit效果動畫OpenGL版本,但我卡住了。由於幾乎所有的OpenGL程序都包含了爲Win32生成調色板的東西,我認爲在我的舊程序中應用調色板動畫並不難。OpenGL - 動畫/循環/旋轉調色板

我的目的是生成一個顏色索引不變的紋理和一個旋轉的調色板。在本週末深入網絡後,我仍然無法修復它。我甚至不能用一種顏色索引顯示紋理,所以在那個階段有些事情是錯誤的(如果它能工作,我可以創建調色板循環機制)。

我可以通過使用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 /着色器實現(我只是一個初學者;))和DirectDraw可能會更容易我認爲,但我想嘗試OpenGL。

+2

「*由於幾乎每個OpenGL程序都包含了一些爲Win32 *生成調色板的東西*」它有?從何時起?作爲初學者是沒有理由不使用着色器。 –

回答

1

因爲幾乎每一個OpenGL的計劃包括的東西產生的調色板爲Win32

不,絕對不是。如果你的意思是PIXELFORMATDESCRIPTOR,不是調色板定義。顏色索引模式是OpenGL中一個主要的PITA,目前沒有實際的實現支持它。

我不是在尋找ES /着色器實現(我只是個初學者;))

但是,這正是你應該使用什麼。在現代OpenGL中,着色器也是強制。一個簡單的片段着色器,執行查找到一維紋理將索引轉換爲一種顏色,正是您所需要的。如果你的目標是現代系統,無論如何你必須使用着色器。

+0

[Here](http://python-opengl-examples.blogspot.co.uk/2009/07/fire-preview-stage.html)是着色器實現的示例。 – StuGrey

+0

謝謝。我會檢查一下。 – Mat90

+0

我的意思是調色板定義的PIXELFORMATDESCRIPTOR結構中的PFD_NEED_PALETTE和PFD_TYPE_COLORINDEX(後者用於設置/強制它,前者當它需要調色板時)。 – Mat90