0

我使用 Lazarus(在 Linux 下)请任何人帮助我。我有问题。我已经安装了 LasOpenGLContext。组件面板上有“OpenGL Controll”。我想画一个简单的立方体。但我做不到。我明白raised an exception class 'External:SIGSEGV'怎么了?请,如果有任何想法。

unit Ex1;

{$mode objfpc}{$H+}
{$LinkLib GL}
interface

uses
  Classes, SysUtils, FileUtil, OpenGLContext, Forms, Controls, Graphics, gl, glu, Glut,
  Dialogs, ExtCtrls, LazOpenGLContext, LCLType;

type

  { Tfrm }

  Tfrm = class(TForm)
    OpenGLControl1: TOpenGLControl;
    Timer: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure TimerTimer(Sender: TObject);
  private
    { private declarations }
  public
    cube_rotation: GLFloat;
    Speed:          Double;
    { public declarations }
  end;

var
  frm: Tfrm;

implementation

{$R *.lfm}

{ Tfrm }

procedure Tfrm.FormCreate(Sender: TObject);
begin

  glClearColor(1.0, 1.0, 1.0, 1.0); // here brakepoint raised an exception class 'External:SIGSEGV'
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  glEnable(GL_DEPTH_TEST);

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluPerspective(45.0, double(width) / height, 0.1, 100.0);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();

  glTranslatef(0.0, 0.0,-6.0);
  glRotatef(cube_rotation, 1.0, 1.0, 1.0);

  glBegin(GL_QUADS);
          glColor3f(0.0,1.0,0.0);                      
          glVertex3f( 1.0, 1.0,-1.0);                  
          glVertex3f(-1.0, 1.0,-1.0);                  
          glVertex3f(-1.0, 1.0, 1.0);                  
          glVertex3f( 1.0, 1.0, 1.0);                   
  glEnd();
  glBegin(GL_QUADS);
          glColor3f(1.0,0.5,0.0);                              
          glVertex3f( 1.0,-1.0, 1.0);                   
          glVertex3f(-1.0,-1.0, 1.0);                   
          glVertex3f(-1.0,-1.0,-1.0);                   
          glVertex3f( 1.0,-1.0,-1.0);                   
  glEnd();
  glBegin(GL_QUADS);
          glColor3f(1.0,0.0,0.0);                              
          glVertex3f( 1.0, 1.0, 1.0);                  
          glVertex3f(-1.0, 1.0, 1.0);                  
          glVertex3f(-1.0,-1.0, 1.0);                  
          glVertex3f( 1.0,-1.0, 1.0);                  
  glEnd();
  glBegin(GL_QUADS);
          glColor3f(1.0,1.0,0.0);                              
          glVertex3f( 1.0,-1.0,-1.0);                  
          glVertex3f(-1.0,-1.0,-1.0);                  
          glVertex3f(-1.0, 1.0,-1.0);                  
          glVertex3f( 1.0, 1.0,-1.0);                  
  glEnd();
  glBegin(GL_QUADS);
          glColor3f(0.0,0.0,1.0);                              
          glVertex3f(-1.0, 1.0, 1.0);                  
          glVertex3f(-1.0, 1.0,-1.0);                  
          glVertex3f(-1.0,-1.0,-1.0);                  
          glVertex3f(-1.0,-1.0, 1.0);                  
  glEnd();
  glBegin(GL_QUADS);
          glColor3f(1.0,0.0,1.0);                              
          glVertex3f( 1.0, 1.0,-1.0);                  
          glVertex3f( 1.0, 1.0, 1.0);                  
          glVertex3f( 1.0,-1.0, 1.0);                  
          glVertex3f( 1.0,-1.0,-1.0);                  
  glEnd();

  cube_rotation += 5.15 * Speed;


  OpenGLControl1.SwapBuffers;
end;

procedure Tfrm.TimerTimer(Sender: TObject);
begin

end;

end.
4

1 回答 1

0

您似乎错过了 OpenGL 上下文创建。没有它,每个 OpenGL 调用都会使您的程序崩溃。我没有使用过 Lazarus,但根据他们的网站,创建上下文的代码可能如下:

procedure TForm1.FormCreate(Sender: TObject);
begin
  GLbox:= TOpenGLControl.Create(Form1);
  GLbox.AutoResizeViewport:= true;
  GLBox.Parent := self;
  GLBox.MultiSampling:= 4;
  GLBox.Align := alClient;
  GLBox.OnPaint := @GLboxPaint; //for "mode delphi" this would be "GLBox.OnPaint := GLboxPaint"
  GLBox.invalidate;
end;
于 2016-12-08T18:53:32.193 回答