J
Jeefo
Всем добрый вечер
Столкнулся со следующей проблемой. Нужно натянуть на квад текстуру, подгруженную из бмп-файла, размер 64x64 заранее известен. Почитал Краснова, казалось бы несложно, вот код, который получился:
Однако текстура отображается перевернутой. Думал накосячил с координатами, почитал NeHe, нет, все верно: (0;0) на нижний левый угол, (0;1) на верхний левый и т.д. Где ошибся?
Delphi 7
Столкнулся со следующей проблемой. Нужно натянуть на квад текстуру, подгруженную из бмп-файла, размер 64x64 заранее известен. Почитал Краснова, казалось бы несложно, вот код, который получился:
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OpenGL;
type
TMainForm = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure FormPaint(Sender: TObject);
private
{ Private declarations }
rc: HGLRC;
tex: array[0..63, 0..63, 0..2] of Byte;
procedure LoadTex;
public
{ Public declarations }
end;
var
MainForm: TMainForm;
implementation
{$R *.dfm}
procedure TMainForm.FormCreate(Sender: TObject);
var
pfd: TPixelFormatDescriptor;
nPixelFormat: Integer;
begin
FillChar(pfd, SizeOf(TPixelFormatDescriptor), 0);
pfd.nSize := SizeOf(TPixelFormatDescriptor);
pfd.nVersion := 1;
pfd.dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
pfd.iPixelType := PFD_TYPE_RGBA;
pfd.cColorBits := 24;
pfd.iLayerType := PFD_MAIN_PLANE;
nPixelFormat := ChoosePixelFormat(Canvas.Handle, @pfd);
SetPixelFormat(Canvas.Handle, nPixelFormat, @pfd);
rc := wglCreateContext(Canvas.Handle);
wglMakeCurrent(Canvas.Handle, rc);
LoadTex;
end;
procedure TMainForm.FormDestroy(Sender: TObject);
begin
wglMakeCurrent(0, 0);
wglDeleteContext(rc);
end;
procedure TMainForm.FormResize(Sender: TObject);
begin
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
glViewPort(0, 0, ClientWidth, ClientHeight);
gluOrtho2D(-5, 5, -5, 5);
FormPaint(Self);
end;
procedure TMainForm.FormPaint(Sender: TObject);
begin
glClearColor(0, 0, 0, 1);
glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex2f(-1, -1);
glTexCoord2f(0, 1); glVertex2f(-1, 1);
glTexCoord2f(1, 1); glVertex2f(1, 1);
glTexCoord2f(1, 0); glVertex2f(1, -1);
glEnd();
glDisable(GL_TEXTURE_2D);
glFlush;
SwapBuffers(Canvas.Handle);
end;
procedure TMainForm.LoadTex;
var
b: TBitmap;
i, j: Integer;
begin
b := TBitmap.Create;
b.LoadFromFile('C:\GOLD.BMP');
for i := 0 to 63 do
for j := 0 to 63 do begin
tex[i, j, 0] := GetRValue(b.Canvas.Pixels[i,j]);
tex[i, j, 1] := GetGValue(b.Canvas.Pixels[i,j]);
tex[i, j, 2] := GetBValue(b.Canvas.Pixels[i,j]);
end;
b.Free;
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, 3, 64, 64, 0, GL_RGB, GL_UNSIGNED_BYTE, @tex);
end;
end.
Однако текстура отображается перевернутой. Думал накосячил с координатами, почитал NeHe, нет, все верно: (0;0) на нижний левый угол, (0;1) на верхний левый и т.д. Где ошибся?
Delphi 7