Здравствуйте, возникла проблема! Прошу помочь.
У меня есть программа которая генерирует куб и накладывает текстуру на него.
Проблема в том что текстура при растягивании размывается(интерполяция кажется, да?).
Код:
unit MainUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, dglopengl, glBitmap, ExtCtrls, ComCtrls;
type
TMainForm = class(TForm)
Panel: TPanel;
TrackBar: TTrackBar;
TrackBar1: TTrackBar;
TrackBar2: TTrackBar;
procedure FormCreate(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure TrackBarChange(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
dc: HDC;
hrc: HGLRC;
fTexture: TglBitmap2D;
procedure SetupGL;
procedure Render;
procedure IdleHandler(Sender: TObject; var Done : boolean);
end;
const
NearClipping = 0.1;
FarClipping = 200;
var
MainForm: TMainForm;
R,R2,Fo : single;
implementation
{$R *.dfm}
procedure TMainForm.IdleHandler(Sender: TObject; var Done: Boolean);
begin
Render;
Sleep(1);
Done := False;
end;
procedure TMainForm.Render;
begin
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glViewport(0,0,CLientWidth,ClientHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluPerspective(Fo,ClientWidth/ClientHeight,NearClipping,FarClipping);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
glTranslatef(0,0,-3);
glRotatef(R, 1.0, 0.0, 0.0);
glRotatef(R2, 0.0, 1.0, 0.0);
InvalidateRect(Handle,nil,False);
glBegin (GL_QUADS);
glTexCoord2f ( 0 , 0 ) ; glVertex3f (1.0, 1.0, 1.0);
glTexCoord2f ( 0 , 1 ); glVertex3f (-1.0, 1.0, 1.0);
glTexCoord2f ( 1 , 1 ); glVertex3f (-1.0, -1.0, 1.0);
glTexCoord2f ( 1 , 0 ); glVertex3f (1.0, -1.0, 1.0);
glEnd;
glBegin (GL_QUADS);
glTexCoord2f ( 0 , 0 ) ; glVertex3f (1.0, 1.0, -1.0);
glTexCoord2f ( 0 , 1 ); glVertex3f (1.0, -1.0, -1.0);
glTexCoord2f ( 1 , 1 ); glVertex3f (-1.0, -1.0, -1.0);
glTexCoord2f ( 1 , 0 ); glVertex3f (-1.0, 1.0, -1.0);
glEnd;
glBegin (GL_QUADS);
glTexCoord2f ( 0 , 0 ) ; glVertex3f (-1.0, 1.0, 1.0);
glTexCoord2f ( 0 , 1 ); glVertex3f (-1.0, 1.0, -1.0);
glTexCoord2f ( 1 , 1 );glVertex3f (-1.0, -1.0, -1.0);
glTexCoord2f ( 1 , 0 );glVertex3f (-1.0, -1.0, 1.0);
glEnd;
glBegin (GL_QUADS);
glTexCoord2f ( 0 , 0 ) ; glVertex3f (1.0, 1.0, 1.0);
glTexCoord2f ( 0 , 1 ); glVertex3f (1.0, -1.0, 1.0);
glTexCoord2f ( 1 , 1 ); glVertex3f (1.0, -1.0, -1.0);
glTexCoord2f ( 1 , 0 ); glVertex3f (1.0, 1.0, -1.0);
glEnd;
glBegin (GL_QUADS);
glTexCoord2f ( 0 , 0 ) ; glVertex3f (-1.0, 1.0, -1.0);
glTexCoord2f ( 0 , 1 ); glVertex3f (-1.0, 1.0, 1.0);
glTexCoord2f ( 1 , 1 ); glVertex3f (1.0, 1.0, 1.0);
glTexCoord2f ( 1 , 0 ); glVertex3f (1.0, 1.0, -1.0);
glEnd;
glBegin(GL_QUADS);
glTexCoord2f ( 0 , 0 ) ; glVertex3f (-1.0, -1.0, -1.0);
glTexCoord2f ( 0 , 1 ); glVertex3f (1.0, -1.0, -1.0);
glTexCoord2f ( 1 , 1 ); glVertex3f (1.0, -1.0, 1.0);
glTexCoord2f ( 1 , 0 ); glVertex3f (-1.0, -1.0, 1.0);
glEnd;
SwapBuffers(dc);
end;
procedure TMainForm.FormDestroy(Sender: TObject);
begin
DeactivateRenderingContext;
DestroyRenderingContext(HRC);
ReleaseDC(Handle,Dc);
DeleteDc(DC);
fTexture.Free;
end;
procedure TMainForm.FormResize(Sender: TObject);
var
tmpbool: Boolean;
begin
glViewport(0,0,ClientWidth,ClientHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluPerspective(Fo,ClientWidth/ClientHeight,NearClipping,FarClipping);
end;
procedure TMainForm.SetupGL;
begin
glClearColor(0.0,0.0,0.0,0.0);
//glColor3f(1.0,0,0);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glEnable (GL_TEXTURE_2D);
fTexture := TglBitmap2D.Create;
fTexture.LoadFromFile ('icon-64.bmp');
fTexture.GenTexture;
end;
procedure TMainForm.TrackBarChange(Sender: TObject);
begin
R := TrackBar.Position;
R2 := TrackBar1.Position;
Fo := TrackBar2.Position;
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
dc := GetDC(Handle);
if not InitOpenGl then
Application.Terminate;
hrc := CreateRenderingContext(dc,[opDoubleBuffered],32,24,0,0,0,0);
ActivateRenderingContext(dc,hrc);
SetupGL;
Application.OnIdle := IdleHandler;
end;
end.