2013-08-27 116 views
4

當我嘗試在OpenGL中用RGBA顏色繪製2D圓時,它用最接近的16色調色板繪製它。這是我使用的代碼。OpenGL在改變RGBA顏色後繪製了16種顏色

// Init canvas 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(0,Screen.Width(),Screen.Height(),0,0,1); 
glMatrixMode(GL_MODELVIEW); 

glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE); 
glEnable(GL_COLOR_MATERIAL); 

// Background 
glClearColor(0.0,0.0,0.0,1.0); 
glShadeModel(GL_SMOOTH); 
glClear(GL_COLOR_BUFFER_BIT); 

[...] 

glColor3f(Color.R,Color.G,Color.B); 

glBegin(GL_TRIANGLE_FAN); 
    glVertex2f(Pos.X - SX,Pos.Y - SY); 
    for (int angle=0; angle <= 360; angle+=1) 
     glVertex2f(Pos.X - SX + sin(angle*M_PI/180.0) * Size, Pos.Y - SY + cos(angle*M_PI/180.0) * Size); 
glEnd(); 

[...] 

// Render 
glFlush(); 
glDisable(GL_COLOR_MATERIAL); 

顏色爲Color型的結構:

struct Color 
{ 
    float R; 
    float G; 
    float B; 
    float A; 

    void operator =(Color Clr); 
    bool operator ==(Color Clr); 
}; 

下面的代碼用於設置發動機:

// Create context 
GDC = GetDC(Handle); 

// Create pixel format descriptor 
PIXELFORMATDESCRIPTOR GPFD = { 
    sizeof(PIXELFORMATDESCRIPTOR), 
    1, 
    PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, 
    PFD_TYPE_RGBA, 
    24, 
    0,0,0,0,0,0, 
    0,0, 
    0,0,0,0,0, 
    32, 
    0, 
    0, 
    PFD_MAIN_PLANE, 
    0, 
    0,0,0 
}; 
GPixelFormat = ChoosePixelFormat(GDC,&GPFD); 
SetPixelFormat(GDC,GPixelFormat,&GPFD); 

// Create resource 
GRC = wglCreateContext(GDC); 
wglMakeCurrent(GDC,GRC); 

// Setup resource 
glClearColor(1.0f, 1.0f, 1.0f, 1.0f); 
glClear(GL_COLOR_BUFFER_BIT); 
glFlush(); 

我在做什麼錯?

UPDATE:

當我調試代碼,並與DescribePixelFormat()讀取像素格式,調試器輸出以下:https://dl.dropboxusercontent.com/u/12669217/Debugger.jpg 此外,標誌PFD_GENERIC_FORMATPFD_NEED_PALETTE沒有設置。

這是所需的輸出(前我使用的OpenGL):https://dl.dropboxusercontent.com/u/12669217/CR_Desired.png

這是實際的輸出(文本和背景尚未實現):https://dl.dropboxusercontent.com/u/12669217/CR_Actual.png

+0

任何改變,如果你設置爲'c [紅|綠|藍|阿爾法] [位|移]'爲零? – genpfault

+0

如果使用'PFD_TYPE_RGBA',這個調色板的概念是沒有意義的。您需要使用「索引」顏色模式進行調色板渲染。 –

+0

@genpfault不,依然如此。 – dengsn

回答

3

在WGL,像素格式描述符PFD_TYPE_RGBA會給你一個像素格式,使用位平面。使用RGBA時沒有調色板,但是,此模式受您分配每平面和任何移位的位數限制。

我會建議使用:

PIXELFORMATDESCRIPTOR GPFD = { 
    sizeof(PIXELFORMATDESCRIPTOR), 
    1, 
    PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, 
    PFD_TYPE_RGBA, 
    24, 
    0,0,0,0,0,0, // No Shift Bits or Arbitrary Bitplane Allocation 
    0,0, 
    0,0,0,0,0, 
    32, 
    0, 
    0, 
    PFD_MAIN_PLANE, 
    0, 
    0,0,0 
}; 

我懷疑移位位字段負責你的異常行爲。如果您將這些值設置得太多,您會得到一個不是硬件加速的像素格式。例如,很多硬件不支持32位z緩衝區(24位Z + 8位模板更兼容)。

你應該怎麼做REALLY do在選擇你的像素格式後,調用DescribePixelFormat (...),看看WGL究竟給了你什麼。 WGL搜索與您請求的格式最匹配的像素格式。


查看關於ChoosePixelFormat,在MSDN上的參考。它規定如下:

備註

必須確保由ChoosePixelFormat功能相匹配的像素格式滿足您的要求。例如,如果您請求使用24位RGB顏色緩衝區的像素格式,但設備上下文僅提供8位RGB顏色緩衝區,則該函數會返回帶有8位RGB顏色緩衝區的像素格式。


UPDATE:

將此代碼添加到您的設置,並檢查的GPFD數據結構在調試器:

DescribePixelFormat (GPixelFormat, &GPFD); 

特別注意的領域如cColorBitscDepthBits

有幾個標誌你也應該檢查一下,但是一個調試器不會讓這個簡單。在你的代碼應該測試:

  • GPFD.dwFlags & PFD_GENERIC_FORMAT
  • GPFD.dwFlags & PFD_NEED_PALETTE
+0

當我使用您的像素格式時,繪圖具有相同的結果。我不知道在DescribePixelFormat中我必須使用哪個索引。 – dengsn

+0

@Genecyll:您將使用「ChoosePixelFormat(...)'的返回值。如果您包含了用於在問題中設置渲染上下文的完整代碼,或者至少包含選擇像素格式的代碼,則可能會有所幫助。 –

+0

看我的第一篇文章 – dengsn