我需要在 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)。我不知道这将如何工作,如果我画整个窗口的每一次。
1条答案
按热度按时间bxpogfeg1#
要定义背景颜色,可以使用
glClearColor(r, g, b, a)
,其中参数类型为single,值为0 .. 1.0。参数
r
、g
、b
和a
分别代表red
、green
、blue
和alpha
。默认情况下,背景为黑色,就像发出了'glClearColor(0,0,0,1.0)一样。
要获得较亮的背景,请尝试
作为
FormPaint
过程的第一行。结果如下所示:
您绝对应该获得一些文档,例如https://www.khronos.org/opengl/