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; // 版本
dwFlagsFD_SUPPORT_OPENGL or PFD_DRAW_TO_WINDOW or
PFD_DOUBLEBUFFER; // 支持 double buffer
iPixelTypeFD_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;
iLayerTypeFD_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.
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; // 版本
dwFlagsFD_SUPPORT_OPENGL or PFD_DRAW_TO_WINDOW or
PFD_DOUBLEBUFFER; // 支持 double buffer
iPixelTypeFD_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;
iLayerTypeFD_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.