4

当我尝试在 OpenGL 中使用 RGBA 颜色绘制 2D 圆时,它会使用最接近的 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();

我究竟做错了什么?

更新:

当我调试此代码并使用 读取像素格式时DescribePixelFormat(),调试器输出以下内容:https://dl.dropboxusercontent.com/u/12669217/Debugger.jpg此外,未设置 标志PFD_GENERIC_FORMAT和。PFD_NEED_PALETTE

这是所需的输出(在我使用 OpenGL 之前):https ://dl.dropboxusercontent.com/u/12669217/CR_Desired.png

这是实际输出(文本和背景尚未实现):https ://dl.dropboxusercontent.com/u/12669217/CR_Actual.png

4

1 回答 1

3

在 WGL 中,像素格式描述符PFD_TYPE_RGBA将为您提供使用bitplanes的像素格式。使用 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 位模板更兼容)。

真正应该做的是DescribePixelFormat (...)在选择您的像素格式后调用,并查看 WGL 实际给您的内容。WGL 搜索与您请求的格式最匹配的像素格式。


查看MSDN 上的ChoosePixelFormat 的参考。它声明如下:

评论

您必须确保 ChoosePixelFormat 函数匹配的像素格式满足您的要求。例如,如果您请求具有 24 位 RGB 颜色缓冲区的像素格式,但设备上下文仅提供 8 位 RGB 颜色缓冲区,则该函数将返回具有 8 位 RGB 颜色缓冲区的像素格式。


更新:

将此代码添加到您的设置中,并GPFD在调试器中检查数据结构:

DescribePixelFormat (GPixelFormat, &GPFD);

请特别注意 和 等cColorBits字段cDepthBits

您还应该检查几个标志,但调试器不会让这变得容易。在您的代码中,您应该测试:

  • GPFD.dwFlags & PFD_GENERIC_FORMAT
  • GPFD.dwFlags & PFD_NEED_PALETTE
于 2013-08-27T21:29:16.810 回答