当我尝试在 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 是 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
最佳答案
在 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 位模板更兼容)。
您应该真正做的是在选择您的像素格式并查看 WGL 实际为您提供的内容后调用 DescribePixelFormat (...)
。 WGL 搜索与您请求的格式最匹配的像素格式。
查看 ChoosePixelFormat 的引用资料, 在 MSDN 上。它声明如下:
Remarks
You must ensure that the pixel format matched by the ChoosePixelFormat function satisfies your requirements. For example, if you request a pixel format with a 24-bit RGB color buffer but the device context offers only 8-bit RGB color buffers, the function returns a pixel format with an 8-bit RGB color buffer.
更新:
将此代码添加到您的设置中,并在调试器中检查 GPFD
的数据结构:
DescribePixelFormat (GPixelFormat, &GPFD);
特别注意 cColorBits
和 cDepthBits
等字段。
您还应该检查几个标志,但调试器不会让这变得容易。在您的代码中,您应该测试:
GPFD.dwFlags & PFD_GENERIC_FORMAT
GPFD.dwFlags & PFD_NEED_PALETTE
关于c++ - 改变RGBA颜色后OpenGL以16种颜色绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18475417/