在 Delphi 和OpenGL中绘制四边形-背景绘制为黑色

1aaf6o9v  于 2023-03-18  发布在  其他
关注(0)|答案(1)|浏览(201)

我需要在 Delphi 和OpenGL中绘制一个简单的四边形(这只是稍后绘制纹理的测试)的帮助。四边形绘制正确,但窗体的其余部分被绘制为黑色。我将在窗体上有一个背景图像,所以我希望窗体画布的其余部分保持不变。
我试着用剪刀,但没有运气。我开放的任何其他建议。也许使用OpenGL视口或.....
下面是mu代码。

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Winapi.OpenGL;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormPaint(Sender: TObject);
  private
    { Private declarations }
    RC: HGLRC;
    DC: HDC;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  pfd: TPixelFormatDescriptor;
  PixelFormat: Integer;
begin
  DC := GetDC(Handle);

  ZeroMemory(@pfd, SizeOf(pfd));
  pfd.nSize := SizeOf(pfd);
  pfd.nVersion := 1;
  pfd.dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
  pfd.iPixelType := PFD_TYPE_RGBA;
  pfd.cColorBits := 24;
  pfd.cDepthBits := 16;
  pfd.iLayerType := PFD_MAIN_PLANE;

  PixelFormat := ChoosePixelFormat(DC, @pfd);
  SetPixelFormat(DC, PixelFormat, @pfd);

  RC := wglCreateContext(DC);
  wglMakeCurrent(DC, RC);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  wglMakeCurrent(0, 0);
  wglDeleteContext(RC);
  ReleaseDC(Handle, DC);
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

  glEnable(GL_SCISSOR_TEST);
  glScissor(ClientWidth div 4, ClientHeight div 4, ClientWidth div 2, ClientHeight div 2);

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  glOrtho(-ClientWidth / 2, ClientWidth / 2, -ClientHeight / 2, ClientHeight / 2, -1, 1);

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();

  glTranslatef(0, 0, 0);
  glColor3f(1.0, 0.0, 0.0);
  glBegin(GL_QUADS);
    glVertex2f(-50, -50);
    glVertex2f(-50, 50);
    glVertex2f(50, 50);
    glVertex2f(50, -50);
  glEnd();

  glDisable(GL_SCISSOR_TEST);

  SwapBuffers(DC);
end;

end.

我认为这应该工作,但它没有。我已经尝试了阿尔法混合函数,但我一定是做错了什么。我不想使用任何背景色,并希望绘制背景图像只有一次。面积的四边形将改变。
下面是我正在尝试的附加说明。
屏幕分辨率是1920 x1080。 Delphi 窗体覆盖整个屏幕。窗体有一个背景。在窗体的中心,我需要一个OpenGL窗口,在那里我会有60帧/秒的动画。其余的窗口几乎是静态的。我尽量不画整个屏幕上的每一个窗体。

即使我设置了“glViewport(200,150,1520,780);“OpenGL窗口外的区域被涂成黑色。
也许这是错误的:

RC := wglCreateContext(DC);
  wglMakeCurrent(DC, RC);

也许我可以做到这一点,但我认为,我会有一些其他独立的动画在窗口的顶部,将有不同的FPS(15-20 FPS)。我不知道这将如何工作,如果我画整个窗口的每一次。

bxpogfeg

bxpogfeg1#

要定义背景颜色,可以使用glClearColor(r, g, b, a),其中参数类型为single,值为0 .. 1.0。
参数rgba分别代表redgreenbluealpha
默认情况下,背景为黑色,就像发出了'glClearColor(0,0,0,1.0)一样。
要获得较亮的背景,请尝试

glClearColor(0.9, 0.9, 0.9, 1.0);

作为FormPaint过程的第一行。
结果如下所示:

您绝对应该获得一些文档,例如https://www.khronos.org/opengl/

相关问题