2013-08-27 120 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