2012-07-30 97 views
2

只是学习一些与delphi的OpenGL,并尝试一些简单但没有得到结果,我相信我应该得到一个深绿色的形式。但是,当我运行这个我什么也得不到。没有错误。也许错过了什么?简单的OpenGL代码不工作

unit First1; 

interface 

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

type 
    TForm2 = class(TForm) 
    procedure FormCreate(Sender: TObject); 
    procedure FormDestroy(Sender: TObject); 
    procedure FormPaint(Sender: TObject); 
    private 
    { Private declarations } 
    GLContext : HGLRC; 
    ErrorCode: GLenum; 
    public 
    { Public declarations } 
    end; 

var 
    Form2: TForm2; 

implementation 

{$R *.dfm} 

procedure TForm2.FormCreate(Sender: TObject); 
var 
    pfd: TPixelFormatDescriptor; 
    FormatIndex: integer; 
begin 
    fillchar(pfd,SizeOf(pfd),0); 
    with pfd do 
    begin 
     nSize := SizeOf(pfd); 
     nVersion := 1; {The current version of the desccriptor is 1} 
     dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL; 
     iPixelType := PFD_TYPE_RGBA; 
     cColorBits := 24; {support 24-bit color} 
     cDepthBits := 32; {depth of z-axis} 
     iLayerType := PFD_MAIN_PLANE; 
    end; {with} 
    FormatIndex := ChoosePixelFormat(Canvas.Handle,@pfd); 
    SetPixelFormat(Canvas.Handle,FormatIndex,@pfd); 
    GLContext := wglCreateContext(Canvas.Handle); 
    wglMakeCurrent(Canvas.Handle,GLContext); 
end; {FormCreate} 

procedure TForm2.FormDestroy(Sender: TObject); 
begin 
    wglMakeCurrent(Canvas.Handle,0); 
    wglDeleteContext(GLContext); 
end; 

procedure TForm2.FormPaint(Sender: TObject); 
begin 
    {background} 
    glClearColor(0.0,0.4,0.0,0.0); 
    glClear(GL_COLOR_BUFFER_BIT); 
{error checking} 
    errorCode := glGetError; 
    if errorCode<>GL_NO_ERROR then 
     raise Exception.Create('Error in Paint'#13+ 
    gluErrorString(errorCode)); 
end; 

end. 
+0

不是专家,因此是一个评论:再次调用'wglMakeCurrent'作为两个参数来使渲染上下文*不是当前*,这将刷新你所绘制的。这可能意味着你必须在OnPaint中创建上下文(和删除)。在MSDN上搜索“呈现上下文”。 – 2012-07-31 00:19:19

回答

5

既然你要求一个缓冲的情况下,你必须在渲染代码的末尾调用glFinish,提交你的绘图命令来实现。不过,我强烈建议你切换到使用双缓冲上下文,而不是glFinish-你发出一个wglSwapBuffers这意味着完成。

+0

我想学习一本书,但很高兴知道。我尽快加入glfinish,只要我回家。欢呼 – 2012-07-31 08:14:13

+0

GLFinish工作,但现在iam有兴趣知道这个wglswapBuffers .. – 2012-08-02 06:54:34

+1

@GlenMorse:你可以通过添加标志PFD_DOUBLEBUFFER到PFD.dwFlags位来启用双缓冲。这应该给你一个双缓冲窗口。然后像往常一样执行OpenGL,但是用'wglSwapBuffers'完成。顺便说一句:您创建OpenGL上下文的方式严重过时,您通常希望使用wglCreateContextAttribsARB来使用该方法 - Google会为您找到大量教程。 – datenwolf 2012-08-02 09:33:50