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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> OpenGL: генерация текстур 
:(
    Опции темы
Sniper
Дата 7.2.2006, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 511
Регистрация: 8.5.2002

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



Собственно нашёл в статье такой пример:

Код

procedure TextGenerator(Rcomp,Gcomp,Bcomp:Integer; Texture: GLuInt);
type TRGB=record
 b,g,r:byte;
end;
ARGB=array [0..1] of TRGB;
PARGB=^ARGB;
var
 b:TBitMap;
 p:PARGB;
 x,y:Integer;
 pData:Pointer;
begin
 b:=TBitMap.Create;
 b.pixelformat:=pf32bit;
 b.width:=128;
 b.height:=128;
 for y:=0 to b.height-1 do
  begin
  p:=b.scanline[y];
  for x:=0 to b.width-1 do
   begin
     p[x].r:=RComp;
     p[x].g:=GComp;
     p[x].b:=BComp;
   end;
  end;
 Form1.сanvas.draw(0,0,b);
 b.free;
end;

От него хочу плясать собственно.

Нужно создать в OpenGL текстуру:
Вот функция создания текстуры:
Код

function CreateTexture(Width, Height, Format : Word; pData : Pointer) : Integer;
var
  Texture : GLuint;
begin
  glGenTextures(1, Texture);
  glBindTexture(GL_TEXTURE_2D, Texture);
  glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  if Format = GL_RGBA then
    gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, pData)
  else
    gluBuild2DMipmaps(GL_TEXTURE_2D, 3, Width, Height, GL_RGB, GL_UNSIGNED_BYTE, pData);
  result :=Texture;
end;

в неё нужно передать указатель на массив пикселей... и тут заковыка... может потому что я не совсем понимаю код генерации текстуры ;-(


--------------------
"Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный".
Кен Томпсон, создатель Unix
PM MAIL   Вверх
Snowy
Дата 7.2.2006, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Первый код совершенно бредовый и ничего не делает, кроме рисования однотонного квадрата на форме.
Для второго ты должен подготовить массив.
Думаю, ты собираешься юзать 32битный цвет.
Тогда для начала создай массив array[1..128*128], в каждый элемент массива запиши 255 и отдай функции указатель на него и размеры - 128x128.
Если сформируется квадратная текстура, продолжим...
А первыйкод выбрось.
Добавлено @ 21:35
Код

var
  mas: array of dword;
  i:       integer;
begin
  SetLebgth(mas, 128*128);
  for i := 0 to (128*128 - 1) do
    mas[i] := 255;
  CreateTexture(128, 128, GL_RGB, @mas[0]);
end;

PM MAIL   Вверх
Sniper
Дата 7.2.2006, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 511
Регистрация: 8.5.2002

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



сорри вот правильный рисуются рандомные точки на форме..
Код

procedure TForm1.FormPaint(sender:TObject);
type TRGB=record
 b,g,r:byte;
end;
ARGB=array [0..1] of TRGB;
PARGB=^ARGB;
var
 b:TBitMap;
 p:PARGB;
 x,y:integer;
begin
 b:=TBitMap.Create;
 b.pixelformat:=pf24bit;
 b.width:=Clientwidth;
 b.height:=Clientheight;
 for y:=0 to b.height-1 do
  begin
  p:=b.scanline[y];
  for x:=0 to b.width-1 do
    begin
   p[x].r:=random(256);
   p[x].g:=random(256);
   p[x].b:=random(256);
   end;
  end;
 canvas.draw(0,0,b);
 b.free;
end;

осталось как-то указатель передать...


--------------------
"Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный".
Кен Томпсон, создатель Unix
PM MAIL   Вверх
Snowy
Дата 7.2.2006, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Опять же. Этот код не имеет никакого отношения к текстурам.
Он просто рисует цветной прямоугольник на форме.
Это никак тебе не поможет. Тебе нужен массив байт, а не рисунок на форме.
PM MAIL   Вверх
Sniper
Дата 7.2.2006, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 511
Регистрация: 8.5.2002

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



Хорошо продолжим...
Код

var
  mas: array of dword;
  i:       integer;
begin
randomize;
  SetLength(mas, 128*128);
  for i := 0 to (128*128 - 1) do
    mas[i] := 255;
  Texture := CreateTexture(128, 128, GL_RGB, @mas[0]);
end;

как сделать точки, рандомного цвета?


--------------------
"Я испытываю отвращение к системе, разработаннной для "пользователя", если в слове "пользователь" закодировано уничижительное значение "тупой и примитивный".
Кен Томпсон, создатель Unix
PM MAIL   Вверх
Snowy
Дата 7.2.2006, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Код
mas[i] := (Random(256) * 256 * 256) +  (Random(256) * 256) + (Random(256));

или
Код
mas[i] := (Random(256) shl 16) or (Random(256) shl 8) or Random(256);

Добавлено @ 22:15
или еще проще
Код
mas[i] := Random(256*256*256);

PM MAIL   Вверх
Simplex
Дата 10.2.2006, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 9.2.2006

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



Генерация текстур средствами Delphi:

Код
const  BTCM_MAX = 7;  // колличество разновидностей текстуры

type SDK = record // картинка текстуры.
  bits : array [0..63, 0..63, 0..3] of GLubyte;
end;

var BTCM : array [1..BTCM_MAX]  of SDK;

procedure TMainForm.LoadBmpTexture;
var i, j, k : integer;
begin
   TextureBitmap:= TBitmap.Create;
   for k:= 1 to BTCM_MAX do
   begin
   TextureBitmap.LoadFromFile(ExtractFilePath(ParamStr(0))+'images\'+IntToStr(k)+'.bmp'); // загрузка текстуры из файла
   {заполнение битового массива}
     for i := 0 to 63 do
      for j := 0 to 63 do begin
        BTCM[k].bits[i, j, 0]:= GetRValue(TextureBitmap.Canvas.Pixels[i,j]);
        BTCM[k].bits[i, j, 1]:= GetGValue(TextureBitmap.Canvas.Pixels[i,j]);
        BTCM[k].bits[i, j, 2]:= GetBValue(TextureBitmap.Canvas.Pixels[i,j]);
        BTCM[k].bits[i, j, 3]:= 255;
      end;
    end;
    // автоматическая генерация текстурных координат
    //glEnable(GL_TEXTURE_GEN_S);
    //glEnable(GL_TEXTURE_GEN_T);

    // параметры текстуры
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    // Повторение текстуры
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    // способ взаимодействия текстуры с объектом.
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE {GL_DECAL GL_REPLACE GL_MODULATE});

    TextureBitmap.Free;
end;


P.S. Но можно и проще... юзай GLaux.dll
пример здесь: OpenGL 3D Demonstration
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

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

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

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

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


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

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


 




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


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

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