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 は type の構造体です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();

私は何を間違っていますか?

アップデート:

このコードをデバッグして で Pixel Format を読み取ると、 デバッガーDescribePixelFormat()は次のように出力します: https://dl.dropboxusercontent.com/u/12669217/Debugger.jpgPFD_GENERIC_FORMATPFD_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 では、ピクセル フォーマット記述子はbitplanesPFD_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 ビットのステンシルの方がはるかに互換性があります)。

本当にすべきことは、ピクセル形式を選択した後に呼び出し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 に答える