Наложение текстур в OpenGL
Да, возможно вопрос глупый и многие тыкнут в гугл или книжки, но и там и там был, просто я где-то не так понял или недопонял чего-то. В общем сам смысл наложения текстур я понял (загрузка, glEnable..., glBind...), но у меня не работает, вот пример небольшой накатал как я делаю, скажите пжалуста что где должно стоять что-бы эти текстуры отображались
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, OpenGL;
type
PRGBA = ^TRGBA;
TRGBA = array[0..3]of Byte;
PTex = ^TTex;
TTex = record
num: Cardinal;
width,
height: Word;
comp: Cardinal;
end;
TForm1 = class(TForm)
tmrDraw: TTimer;
procedure FormCreate(Sender: TObject);
procedure tmrDrawTimer(Sender: TObject);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormResize(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
FmPos: TPointFloat;
FFPS: Cardinal;
public
function LoadTexture(const AFile: String): PTex;
end;
function gluBuild2DMipmaps(Target: GLenum; Components, Width, Height: GLint; Format, atype: GLenum; Data: Pointer): GLint; stdcall; external glu32;
procedure glGenTextures(n: GLsizei; var textures: GLuint); stdcall; external opengl32;
procedure glBindTexture(target: GLenum; texture: GLuint); stdcall; external opengl32;
function glScrX(X: Single): Single;
function glScrY(Y: Single): Single;
var
Form1: TForm1;
rc: HGLRC;
tex: PTex;
texData: Pointer;
fntBase: Cardinal;
scrW,scrH: Integer;
implementation
{$R *.dfm}
function glScrX(X: Single): Single;
begin
Result := 2*X/scrW-1;
end;
function glScrY(Y: Single): Single;
begin
Result := 2*(scrH-Y)/scrH-1;
end;
procedure TForm1.FormCreate(Sender: TObject);
function SetDCP(dc: HDC): Boolean;
var
pfd: TPixelFormatDescriptor;
pf: Integer;
begin
Result := false;
FillChar(pfd, SizeOf(pfd), $00);
pfd.dwFlags :=
PFD_DRAW_TO_WINDOW or
PFD_SUPPORT_OPENGL or
PFD_DOUBLEBUFFER;
pfd.nVersion := 1;
pfd.iLayerType := PFD_MAIN_PLANE;
pfd.iPixelType := PFD_TYPE_RGBA;
pfd.cColorBits := 16;
pfd.cDepthBits := 16;
pf := ChoosePixelFormat(dc, @pfd);
SetPixelFormat(dc, pf, @pfd);
Result := pf>0;
end;
begin
SetDCP(Canvas.Handle);
rc := wglCreateContext(Canvas.Handle);
glMatrixMode(GL_PROJECTION);
glOrtho(0,scrW,scrH,0,-1,1);
glMatrixMode(GL_MODELVIEW);
glViewport(0,0,scrW,scrH);
Assert(rc<>0, 'Can''t create context');
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
tex := LoadTexture('image.bmp'{путь к bmp});
wglMakeCurrent(Canvas.Handle, rc);
end;
function TForm1.LoadTexture(const AFile: String): PTex;
var
bmp: TBitmap;
buf: Pointer;
x,y: Integer;
p,p2: PByteArray;
begin
New(Result);
Assert(FileExists(AFile), 'File not found');
glEnable(GL_TEXTURE_2D);
glGenTextures(1, Result.num);
glBindTexture(GL_TEXTURE_2D, Result.num);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
bmp := TBitmap.Create;
try
bmp.LoadFromFile(AFile);
Assert((bmp.PixelFormat=pf32bit)or(bmp.PixelFormat=pf24bit),
'Use only 24 or 32-bit maps');
if(bmp.PixelFormat=pf24bit)then
Result.comp := GL_RGB
else
if(bmp.PixelFormat=pf32bit)then
Result.comp := GL_RGBA;
Result.width := bmp.Width;
Result.height := bmp.Height;
buf := bmp.ScanLine[0];
if(bmp.PixelFormat=pf24bit)then
glTexImage2D(GL_TEXTURE_2D, 0, 3, bmp.Width, bmp.Height, 0, GL_RGB,
GL_UNSIGNED_BYTE, buf)
else
if(bmp.PixelFormat=pf32bit)then
glTexImage2D(GL_TEXTURE_2D, 0, 4, bmp.Width, bmp.Height, 0, GL_RGBA,
GL_UNSIGNED_BYTE, buf)
else
raise Exception.Create('Supported only 24 and 32-bit maps');
finally
bmp.Free;
end;
end;
procedure TForm1.tmrDrawTimer(Sender: TObject);
var
q: GLUquadricObj;
begin
glLoadIdentity;
glClearColor(0.5,0.5,0.5,1);
glClear(GL_DEPTH_BUFFER_BIT or GL_COLOR_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, tex.num);
glTexEnvf(GL_TEXTURE_2D, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glColor3f(0,0,0);
glBegin(GL_QUADS);
glTexCoord2d(0,0);
glVertex2d(-0.5,-0.5);
glTexCoord2d(0,1);
glVertex2d(0.5,-0.5);
glTexCoord2d(1,1);
glVertex2d(0.5,0.5);
glTexCoord2d(1,0);
glVertex2d(-0.5,0.5);
glEnd;
glDisable(GL_TEXTURE_2D);
glPointSize(5);
glBegin(GL_POINTS);
glColor3f(1,1,0);
glVertex2f(FmPos.X,FmPos.Y);
glEnd;
SwapBuffers(Canvas.Handle);
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
FmPos.X := 2*X/ClientWidth-1;
FmPos.Y := 2*(ClientHeight-Y)/ClientHeight-1;
end;
procedure TForm1.FormResize(Sender: TObject);
begin
scrW := ClientWidth;
scrH := ClientHeight;
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluPerspective(45, scrW/scrH, 1, 2500);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
wglMakeCurrent(0,0);
end;
end.
__________________
TAleD = class(TUser)
public
function HelpMe(ASubject, ARequest: String): String;
function GiveMeExample(ASubject: String): TStringList;
procedure WriteReview(APost: Integer; ADescription: TStringList);
end;
|