openGL初始化问题(100分)

  • 主题发起人 主题发起人 jkernel
  • 开始时间 开始时间
J

jkernel

Unregistered / Unconfirmed
GUEST, unregistred user!
按照一位前辈的指导,输入了如下代码
unit demo;

interface

uses
OpenGL, Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, ComCtrls;

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
private
procedure Draw;
public
end;

var
Form1: TForm1; //这以上都没什么好说的,除了加个OpenGL单元

implementation

{$R *.DFM}

procedure setupPixelFormat(DC:HDC); //象素设置过程
const
pfd:TPIXELFORMATDESCRIPTOR = (
nSize:sizeof(TPIXELFORMATDESCRIPTOR); // 大小
nVersion:1; // 版本
dwFlags:PFD_SUPPORT_OPENGL or PFD_DRAW_TO_WINDOW or
PFD_DOUBLEBUFFER; // 支持 double buffer
iPixelType:PFD_TYPE_RGBA; // 颜色类型 RGB+Alpha
cColorBits:24; // 色深
cRedBits:0; cRedShift:0; // color bits
cGreenBits:0; cGreenShift:0;
cBlueBits:0; cBlueShift:0;
cAlphaBits:0; cAlphaShift:0; // 不使用 alpha buffer
cAccumBits: 0; // 不使用 accumulation buffer
cAccumRedBits: 0;
cAccumGreenBits: 0;
cAccumBlueBits: 0;
cAccumAlphaBits: 0;
cDepthBits:16; // depth buffer
cStencilBits:0;
cAuxBuffers:0;
iLayerType:PFD_MAIN_PLANE;
bReserved: 0;
dwLayerMask: 0;
dwVisibleMask: 0;
dwDamageMask: 0; // 具体含义大家可以参考 MSDN!太多了!我翻译怕不准!^_^
);
var pixelFormat:integer;
begin
pixelFormat := ChoosePixelFormat(DC, @pfd); //选择象素格式
if (pixelFormat = 0) then
exit;
if (SetPixelFormat(DC, pixelFormat, @pfd) <> TRUE) then //设置格式
exit;
end;

procedure GLInit; //初始化完成坐标转换建立过程
begin
glMatrixMode(GL_PROJECTION); //设置物体对象
glFrustum(-0.1, 0.1, -0.1, 0.1, 0.3, 25.0); //设置左右下上进远距离
glMatrixMode(GL_MODELVIEW); //设置观察者
glEnable(GL_DEPTH_TEST); //使用 depth buffer
end;

procedure TForm1.FormCreate(Sender: TObject);
var DC:HDC;
RC:HGLRC;

begin
DC:=GetDC(Handle); //获取一个DC
SetupPixelFormat(DC); //设置DC的象素格式
RC:=wglCreateContext(DC); //建立一个着色环境RC
wglMakeCurrent(DC, RC); //将建立的RC激活
GLInit; //初始化OpenGL
end;

procedure TForm1.Draw;
const S=1.0; D=5.0;
begin
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); //清空Buffer
glLoadIdentity; //坐标系矩阵固定
glTranslatef(0.0, 0.0, -12.0); //坐标轴上平移单位
glBegin(GL_TRIANGLES); //定义顶点开始,其参数指定为三角形
glVertex3f( -S, 0, D); //顶点1 补充一下,如果加上glColor3f()过程还可以变换颜色喔
glVertex3f(S, 0, D); //顶点2
glVertex3f(0, S, D); //顶点3
glEnd; //定义结束
SwapBuffers(wglGetCurrentDC); //输出到当前DC上
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
Draw;
end;

end.

可是执行的时候出了一张空form什么都没有。我用的系统是win2k server,compaq presario 700 notebook.
显卡是S3 Graphics twister K + s3hotkey.
 
帮您顶!
 
在你的窗体中加一个TPaintBox组件.该组件要铺盖整个窗体.在TPaingBox组件上显示OpenGl
图像.
 
FormResize事件也要处理一下!
 
最好也这样处理
procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;

//------------------------------------------------------------------------------
procedure TfrmGL.WMEraseBkgnd(var Message: TWMEraseBkgnd);
begin
Message.Result:=1;
end;
 

Similar threads

I
回复
0
查看
684
import
I
I
回复
0
查看
534
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部