【delphi开源代码栏目提醒】:网学会员,鉴于大家对delphi开源代码十分关注,论文会员在此为大家搜集整理了“AccAAMain.pas”一文,供大家参考学习!
unit AccAAMain;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, CgWindow, CgLight, CgTypes, GL, Glut;
type
TAAForm = class(TCGForm)
Timer: TTimer;
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure TimerTimer(Sender: TObject);
procedure FormKeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;
var
AAForm: TAAForm;
L: TCGLight;
a: Integer = 0;
useAccum: Boolean = TRUE; // 按下'a'键进行切换
implementation
{$R *.DFM}
procedure TAAForm.FormCreate(Sender: TObject);
begin
InitGL;
glEnable(GL_DEPTH_TEST);
// 设定光源
L := TCGLight.Create(GL_LIGHT0);
L.Position := cgVector(-1, 1, -1);
L.Enable;
glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
//设定光耀的材质和颜色
glEnable(GL_COLOR_MATERIAL);
//激活光耀的材质和颜色
end;
procedure Render;
begin
// 绘制一些物体
glColor3f(1, 0, 0);
//设定对象的颜色
glutSolidTorus(0.2, 0.6, 16, 32);
glColor3f(0, 1, 0);
glutSolidSphere(0.25, 32, 16);
end;
procedure TAAForm.FormPaint(Sender: TObject);
var
i: Integer;
const
// 采样次数
N = 8;
// 每一遍的偏移量
JITTER: array [1..N] of TCGVector =
( (x: -0.005; y: 0; z: -0.005),
(x: 0.005; y: 0; z: 0.005),
(x: 0; y: -0.005; z: -0.005),
(x: 0; y: 0.005; z: 0.005),
(x: -0.005; y: -0.005; z: -0.005),
(x: 0.005; y: -0.005; z: 0.005),
(x: -0.005; y: 0.005; z: -0.005),
(x: 0.005; y: 0.005; z: 0.005) );
begin
if useAccum then glClear(GL_ACCUM_BUFFER_BIT)
else glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glLoadIdentity;
glRotatef(a, 1, 2, 3);
if useAccum then
begin
// 绘制N遍,对结果进行累积
for i := 1 to N do
begin
// 每遍绘制之前需清除缓存
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
// 稍微地对模型进行偏移并重新绘制
glPushMatrix;
glTranslatef(JITTER[i].x, JITTER[i].y, JITTER[i].z);
Render;
glPopMatrix;
// 将偏移后绘制的图像与累积缓存中的图像合并
glAccum(GL_ACCUM, 1/N);
end;
// 将累积缓存的内容拷贝到后台缓存
glAccum(GL_RETURN, 1);
end
// 如果useAcc=false,简单地绘制即可
else Render;
PageFlip;
end;
procedure TAAForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
L.Free;
end;
procedure TAAForm.TimerTimer(Sender: TObject);
begin
// 旋转并重绘
a := (a + 1) mod 360;
Paint;
end;
procedure TAAForm.FormKeyPress(Sender: TObject; var Key: Char);
begin
// 切换是否进行反走样
if Key in ['a', 'A'] then useAccum := not useAccum;
Paint;
end;
end.
上一篇:
FMSweep.frm
下一篇:
盘点士兵的各种搞笑失误,连老纳都笑了!