Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод текстуры OpenGl под Delphi. Вывод текстуры OpenGl под Delphi. 
:(
    Опции темы
galileopro
  Дата 19.6.2009, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 7.6.2009
Где: Харьков

Репутация: нет
Всего: нет



Помогите оптимизировать код для вывода на квадратик изображения gold.bmp размером 16 на 16 пикселей. Т. е. убрать все лишнее из кода.
Код
unit frmMain;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls, OpenGL;

type
  TfrmGL = class(TForm)
    Timer: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure FormDestroy(Sender: TObject);

  private
    DC: HDC;
    hrc: HGLRC;
    Bitmap: TBitmap;
    Bits: Array [0..15, 0..15, 0..2] of GLubyte;
    procedure SetDCPixelFormat;
    procedure BmpTexture;

  protected
    procedure WMPaint(var Msg: TWMPaint); message WM_PAINT;
  end;

var
  frmGL: TfrmGL;

implementation

{$R *.DFM}
 {çàãðóçêà è èíèöèàëèçàöèÿ òåêñòóðû }
procedure TfrmGL.BmpTexture;  
var
  i, j: Integer;
begin
   bitmap := TBitmap.Create;
   bitmap.LoadFromFile('gold.bmp'); // çàãðóçêà òåêñòóðû èç ôàéëà
   {--- çàïîëíåíèå áèòîâîãî ìàññèâà ---}
    For i := 0 to 15 do
      For j := 0 to 15 do begin
        bits [i, j, 0] := GetRValue(bitmap.Canvas.Pixels[i,j]);
        bits [i, j, 1] := GetGValue(bitmap.Canvas.Pixels[i,j]);
        bits [i, j, 2] := GetBValue(bitmap.Canvas.Pixels[i,j]);
    end;

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
                 16, 16,     // çäåñü çàäàåòñÿ ðàçìåð òåêñòóðû
                 0, GL_RGB, GL_UNSIGNED_BYTE, @Bits);
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
    glEnable(GL_TEXTURE_2D);
end;
{=========Çàäàåì ôîðìàò ïèêñåëÿ===============}
procedure TfrmGL.SetDCPixelFormat;
var
  nPixelFormat: Integer;
  pfd: TPixelFormatDescriptor;

begin
  FillChar(pfd, SizeOf(pfd), 0);

  pfd.dwFlags   := PFD_DRAW_TO_WINDOW or
                 PFD_SUPPORT_OPENGL or
                 PFD_DOUBLEBUFFER;
  nPixelFormat := ChoosePixelFormat(DC, @pfd);
  SetPixelFormat(DC, nPixelFormat, @pfd);
end;
{==========Ñîçäàíèå ôîðìû====================}
procedure TfrmGL.FormCreate(Sender: TObject);
begin
  DC := GetDC(Handle);
  SetDCPixelFormat;
  hrc := wglCreateContext(DC);
  wglMakeCurrent(DC, hrc);
  glEnable(GL_DEPTH_TEST);// ðàçðåøàåì òåñò ãëóáèíû
  glEnable(GL_LIGHTING);  // ðàçðåøàåì ðàáîòó ñ îñâåùåííîñòüþ
  glEnable(GL_LIGHT0);    // âêëþ÷àåì èñòî÷íèê ñâåòà 0
  BmpTexture;
end;
{=============Èçìåíåíèå ðàçìåðîâ ôîðìû============}
procedure TfrmGL.FormResize(Sender: TObject);
begin
  glViewport(0, 0, ClientWidth, ClientHeight);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  gluPerspective(30.0, ClientWidth / ClientHeight, 1.0, 9.0);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity;
  glTranslatef(0.0, 0.0, -5.0);
  glRotatef(90.0, 1.0, 0.0, 0.0); 
end;
{==Ðèñîâàíèå êàðòèíêè, îáðàáîòêà ñîîáùåíèÿ WM_PAINT=====}
procedure TfrmGL.WMPaint(var Msg: TWMPaint);
var
  ps : TPaintStruct;
begin
  BeginPaint(Handle, ps);
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
    glBegin (GL_QUADS);
        glTexCoord2d (1.0, 0.0);
        glVertex3f (-1.0, 1.0, 1.0);
    glTexCoord2d (1.0, 1.0);
        glVertex3f (1.0, 1.0, 1.0);
    glTexCoord2d (0.0, 1.0);
        glVertex3f (1.0, 1.0, -1.0);
        glTexCoord2d (0.0, 0.0);
        glVertex3f (-1.0, 1.0, -1.0);
    glEnd;

  SwapBuffers(DC);
  EndPaint(Handle, ps);
end;
{========Êîíåö ðàáîòû ïðèëîæåíèÿ====================}
procedure TfrmGL.FormDestroy(Sender: TObject);
begin
  wglMakeCurrent(0, 0);
  wglDeleteContext(hrc);
  ReleaseDC(Handle, DC);
  DeleteDC (DC);
end;
end.

Помогите сделать нормальную вещь из этого примера.
PM MAIL WWW ICQ   Вверх
RomanEEP
Дата 21.6.2009, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 18.5.2006
Где: Коломна

Репутация: 1
Всего: 8



Код

unit frmMain;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  StdCtrls, OpenGL, ExtCtrls;

type
  TfrmGL = class(TForm)
    Timer: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    DC: HDC;
    hrc: HGLRC;
    procedure SetDCPixelFormat;
    procedure BmpTexture;
  protected
    procedure WMPaint(var Msg: TWMPaint); message WM_PAINT;
  end;

var
  frmGL: TfrmGL;

implementation

{$R *.DFM}

procedure TfrmGL.BmpTexture;
const
  GL_BGR  = $80E0;
var
  Bitmap: TBitmap;
begin
  Bitmap := TBitmap.Create;
  try
    Bitmap.LoadFromFile('d:\gold.bmp');
    Bitmap.PixelFormat := pf24bit;
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 16, 16,
      0, GL_BGR, GL_UNSIGNED_BYTE, Bitmap.ScanLine[Bitmap.Height - 1]);
    glEnable(GL_TEXTURE_2D);
  finally
    Bitmap.Free;
  end;
end;

procedure TfrmGL.SetDCPixelFormat;
var
  nPixelFormat: Integer;
  pfd: TPixelFormatDescriptor;
begin
  FillChar(pfd, SizeOf(pfd), 0);
  pfd.dwFlags   := PFD_DRAW_TO_WINDOW or
                 PFD_SUPPORT_OPENGL or
                 PFD_DOUBLEBUFFER;
  nPixelFormat := ChoosePixelFormat(DC, @pfd);
  SetPixelFormat(DC, nPixelFormat, @pfd);
end;

procedure TfrmGL.FormCreate(Sender: TObject);
begin
  DC := GetDC(Handle);
  SetDCPixelFormat;
  hrc := wglCreateContext(DC);
  wglMakeCurrent(DC, hrc);
  BmpTexture;
end;

procedure TfrmGL.FormResize(Sender: TObject);
begin
  glViewport(0, 0, ClientWidth, ClientHeight);
end;

procedure TfrmGL.WMPaint(var Msg: TWMPaint);
var
  ps : TPaintStruct;
begin
  BeginPaint(Handle, ps);
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  glBegin (GL_QUADS);
    glTexCoord2f(0,  0);
    glVertex2f (-1, -1);
    glTexCoord2f(1,  0);
    glVertex2f  (1, -1);
    glTexCoord2f(1,  1);
    glVertex2f  (1,  1);
    glTexCoord2f(0,  1);
    glVertex2f (-1,  1);
  glEnd;
  SwapBuffers(DC);
  EndPaint(Handle, ps);
end;

procedure TfrmGL.FormDestroy(Sender: TObject);
begin
  wglMakeCurrent(0, 0);
  wglDeleteContext(hrc);
  ReleaseDC(Handle, DC);
  DeleteDC (DC);
end;

end.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0515 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.