Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.12.2011, 09:07   #1
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию Разная текстура для каждой грани куба OpenGL

Здравствуйте!
Пытаюсь сделать вращающийся куб, с наложенной на него текстурой. За основу взял пример из книги М. Краснова "OpenGL графика в проектах Delphi". В примере на куб накладывается одинаковая текстура для всех граней. Я бы хотел спросить, что нужно изменить в коде, для отображения своей текстуры на каждую грань отдельно? Буду признателен за помощь.
Код:
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, StdCtrls,
  OpenGL, Buttons;
  private
    DC: HDC;
    hrc: HGLRC;
    Angle: GLUint;
    Bitmap: TBitmap;
    Bits: Array [0..63, 0..63, 0..2] of GLubyte;
    procedure SetDCPixelFormat;
    procedure BmpTexture;
  protected
    procedure WMPaint(var Msg: TWMPaint); message WM_PAINT;
  end;
var
  frmGL: TfrmGL;
implementation
procedure TfrmGL.BmpTexture;
var
  i, j: Integer;
MyResStream: TResourceStream;
begin
   MyResStream:=TResourceStream.Create(hInstance, 'MyBMP',RT_RCDATA);
   bitmap := TBitmap.Create;
   bitmap.LoadFromStream(MyResStream); 
   MyResStream.Free;
    For i := 0 to 63 do
      For j := 0 to 63 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,
                 64, 64,     // здесь задается размер текстуры
                 0, GL_RGB, GL_UNSIGNED_BYTE, @Bits);
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
    glEnable(GL_TEXTURE_2D);
end;

procedure TfrmGL.TimerTimer(Sender: TObject);
begin
  Angle := (Angle + 4) mod 360;
  InvalidateRect(Handle, nil, False); 
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
  Angle := 0;
  DC := GetDC(Panel1.Handle);
  SetDCPixelFormat;
  hrc := wglCreateContext(DC);
  wglMakeCurrent(DC, hrc);
  glEnable(GL_DEPTH_TEST);
  glEnable(GL_LIGHTING);
  glEnable(GL_LIGHT0);
  BmpTexture;
  Timer.Enabled := True;
end;

procedure TfrmGL.WMPaint(var Msg: TWMPaint);
var
  ps : TPaintStruct;
begin
  BeginPaint(Handle, ps);
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  glPushMatrix;
  glRotatef(Angle, 1.0, 1.0, 0.0);
  glRotatef(Angle / (random (1) + 1), 0.0, 0.0, 1.0);
    glBegin (GL_QUAD_STRIP);
        glTexCoord2d (0.0, 1.0);
        glVertex3f (-1.0,  1.0, 1.0);
        glTexCoord2d (0.0, 0.0);
        glVertex3f (-1.0, -1.0, 1.0);
       	glTexCoord2d (1.0, 1.0);
        glVertex3f (1.0,  1.0, 1.0);
        glTexCoord2d (1.0, 0.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); 
        glTexCoord2d (1.0, 1.0);
        glVertex3f (-1.0,  1.0, -1.0);
        glTexCoord2d (1.0, 0.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;
    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;
    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;
  glPopMatrix;
  SwapBuffers(DC);
  EndPaint(Handle, ps);
end;

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

procedure TfrmGL.FormPaint(Sender: TObject);
begin
 glClearColor (1, 1, 1, 1.0);
 glClear (GL_COLOR_BUFFER_BIT); 
  glViewport(0, 0, 100, 100);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  gluPerspective(30.0, 100 / 100, 1.0, 9.0);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity;
  glTranslatef(0.0, 0.0, -8.0);
  glRotatef(30.0, 1.0, 0.0, 0.0);
end;

end.
P.S.: Я не студент, и OpneGL не изучал. К сожалению, количеством свободного времени для полного осмысления я не располагаю.
Никогда не знаешь, где тебе повезет... (Фрай)

Последний раз редактировалось DIgorevich; 16.12.2011 в 09:10.
DIgorevich вне форума Ответить с цитированием
Старый 16.12.2011, 11:23   #2
Warn
Форумчанин
 
Аватар для Warn
 
Регистрация: 03.11.2011
Сообщений: 230
По умолчанию

ну тут два варианта либо ты перед рисованием грани биндиш нужную текстру и второй вариант ты создаешь большую текстуру которая содержит все другие текстурки в этом случае биндить каждый раз новую не надо, но придется задать разные текстурные координаты для граней.
Warn вне форума Ответить с цитированием
Старый 16.12.2011, 11:35   #3
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию

Warn, создать большую текстуру не проблема, я просто не знаю как ее записать в массив с последующим использованием
Никогда не знаешь, где тебе повезет... (Фрай)
DIgorevich вне форума Ответить с цитированием
Старый 16.12.2011, 12:11   #4
Warn
Форумчанин
 
Аватар для Warn
 
Регистрация: 03.11.2011
Сообщений: 230
По умолчанию

Цитата:
я просто не знаю как ее записать в массив с последующим использованием
какой еще массив? зачем массив? она ж одна, как на небе луна)
Warn вне форума Ответить с цитированием
Старый 16.12.2011, 12:17   #5
DIgorevich
Погулять вышел
Участник клуба
 
Аватар для DIgorevich
 
Регистрация: 17.05.2010
Сообщений: 1,573
По умолчанию

Если бы я знал как это сделать, то не спрашивал бы
Никогда не знаешь, где тебе повезет... (Фрай)
DIgorevich вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Колонки. Разная громкость. Lunex.08 Компьютерное железо 2 23.08.2011 10:12
OpenGL. Создание куба на ScrollBox. ArtGrek Мультимедиа в Delphi 5 17.12.2010 20:57
[OpenGL, Delphi] Добавление текстур на грани куба newStudent Помощь студентам 0 03.12.2010 00:50
фигура-грани lex1398 Помощь студентам 2 28.08.2010 09:54
Текстура на 2D объект OpenGL saggy Мультимедиа в Delphi 0 30.06.2010 13:52