Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 28.04.2010, 14:41
Аватар для AleD
AleD AleD вне форума
Активный
 
Регистрация: 21.02.2009
Адрес: г.Краснокаменск
Сообщения: 383
Репутация: 91
По умолчанию Наложение текстур в 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;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:08.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter