|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Наложение текстур в 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; |