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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Загрузка текстуры, без TBitmap 
:(
    Опции темы
DragonFire
Дата 9.3.2006, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



и нифига не пашет...


--------------------
PM MAIL ICQ   Вверх
Alexeis
Дата 9.3.2006, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



на что ругается


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
DragonFire
Дата 9.3.2006, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Давайте рассуждать логически... Что нам нужно? Нужно, чтобы в pByteArray записывализь RGB в таком порялке: Пиксель1: R,G,B; Пиксель 2: R,G,B; и т.д.Тоесть должна получится цепочка: R,G,B,R,G,B,R,G,B...
Вопрос: как ее получить из DS.dsBm.bmBits?

Он не ругается - текстуры нету вообще просто...

Это сообщение отредактировал(а) DragonFire - 9.3.2006, 13:56


--------------------
PM MAIL ICQ   Вверх
Alexeis
Дата 9.3.2006, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



что не нравится объява????!!!!!
Код

var
 p : pByteArray;
begin
p := DS.dsBm.bmBits;

странно у меня пашет....
Добавлено @ 14:03
интересно что DS.dsBm.bmBits и есть указатель на эту самую искомую текстуру!
а как дальше идет отрисовка(или проверка)???


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
DragonFire
Дата 9.3.2006, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот функция:
Код

function ReadBitmap(const FileName : String;
                    var sWidth, tHeight: GLsizei):pByteArray;
var
 h : HBITMAP;
 DS: TDIBSection;
 Bytes,i,j: Integer;
 p:pByteArray;
begin
  h:=LoadImage(0,PCHAR(FileName),IMAGE_BITMAP,0,0,LR_DEFAULTSIZE or LR_LOADFROMFILE);
  DS.dsbmih.biSize := 0;
  FillChar(DS, SizeOf(DS), 0);
  Bytes := GetObject(h, SizeOf(DS), @DS);
  sWidth:=ds.dsBm.bmWidth;
  tHeight:=ds.dsBm.bmHeight;
  result:=DS.dsBm.bmBits;  
end;

Но вместо текстуры - все черное...
Где-то ошибка, если DS.dsBm.bmBits - и есть искомая структура...


--------------------
PM MAIL ICQ   Вверх
Alexeis
Дата 10.3.2006, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



DragonFire, это код загрузки хотелось бы посмотреть на код отображения (отрисовки) картинки.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
DragonFire
Дата 10.3.2006, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Примерно так:
Код

...
var TexKost:Pointer; SKost:GLSizei; 
...
procedure SetTex(TexNow:Pointer;NowSize:GLsizei);
begin
  glTexImage2D(GL_TEXTURE_2D, 0, 3, NowSize, NowSize, 0,
              GL_RGB, GL_UNSIGNED_BYTE, TexNow);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);
end;
procedure Paint;
begin
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

  glPushMatrix;
  glColor3F(0.1,0.7,0.5);
  SetTex(TexKost,SKost);
  glEnable(GL_TEXTURE_2D);
  glBegin(GL_Quads);
    glTexCoord2d(0, 1);
    glVertex3f(1.0-0.03,-0.65+0.03,0);
    glTexCoord2d(1, 1);
    glVertex3f(1.0+0.03,-0.65+0.03,0);
    glTexCoord2d(1, 0);
    glVertex3f(1.0+0.03,-0.65-0.03,0);
    glTexCoord2d(0, 0);
    glVertex3f(1.0-0.03,-0.65-0.03,0);
  glEnd;
  glDisable(GL_TEXTURE_2D);
  glPopMatrix;

  SwapBuffers (DC);
end;
...
begin
TexKost:=ReadBitmap(ExtractFilePath(Char(0))+'Bitmap\Bone.BMP', SKost, SKost);
...
end.



--------------------
PM MAIL ICQ   Вверх
Girder
Дата 10.3.2006, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


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

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



Цитата(DragonFire @ 6.3.2006, 20:03 Найти цитируемый пост)
Если присваиваются, тогда почему при компиляции на строке With TWrap(result^)[x] do begin у меня выдает ошибку несоответствия типов, это я заменяю Pointer на pByteArray в описании функции...

pTWrap(DWord(Result)+x*SizeOf(TWrap))^[0];
где pTWrap = ^TWrap;



--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Alexeis
Дата 10.3.2006, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



DragonFire, есть еще проблема windws может (и делает это) грузить картинку прямо в видекарту (т.е. в аппаратный буфер)


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Alexeis
Дата 10.3.2006, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Порывшись в примерах я нашел чтото похожее на то что нужно
дання процедура использовалась для создания скина из битмапа
при помощи апи
Привожу фрагмент
Код

function CreateBitmapRgn(DC: hDC; Bitmap: hBitmap; TransClr: TColorRef): hRgn;
var
  bmInfo: TBitmap;               // структура BITMAP WinAPI
  W, H: Integer;                 // высота и ширина растра
  bmDIB: hBitmap;                // дискрептор независимого растра
  bmiInfo: BITMAPINFO;           // структура BITMAPINFO WinAPI
  lpBits, lpOldBits: PRGBTriple; // указатели на структуры RGBTRIPLE WinAPI
  lpData: PRgnData;              // указатель на структуру RGNDATA WinAPI
  X, Y, C, F, I: Integer;        // переменные циклов
  Buf: Pointer;                  // указатель
  BufSize: Integer;              // размер указателя
  rdhInfo: TRgnDataHeader;       // структура RGNDATAHEADER WinAPI
  lpRect: PRect;                 // указатель на TRect (RECT WinAPI)
begin
  Result:=0;
  //если растр не задан, выходим
  if Bitmap=0 then
    Exit;

  //узнаем размеры растра
  GetObject(Bitmap, SizeOf(bmInfo), @bmInfo);
  //используя структуру BITMAP
  W:=bmInfo.bmWidth;
  H:=bmInfo.bmHeight;
  //определяем смещение в байтах
  I:=(W*3)-((W*3) div 4)*4;
  if I<>0 then
    I:=4-I;

  //Пояснение: растр Windows Bitmap читается снизу вверх, причем каждая строка
  //дополняется нулевыми байтами до ее кратности 4.
  //для 32-х битный растров такой сдвиг делать не надо.

  //заполняем BITMAPINFO для передачи в CreateDIBSection

  bmiInfo.bmiHeader.biWidth:=W;            // ширина
  bmiInfo.bmiHeader.biHeight:=H;           // высота
  bmiInfo.bmiHeader.biPlanes:=1;           // всегда 1
  bmiInfo.bmiHeader.biBitCount:=24;        // три байта на пиксель
  bmiInfo.bmiHeader.biCompression:=BI_RGB; // без компрессии
  bmiInfo.bmiHeader.biSizeImage:=0;        // размер не знаем, ставим в ноль
  bmiInfo.bmiHeader.biXPelsPerMeter:=2834; // пикселей на метр, гор.
  bmiInfo.bmiHeader.biYPelsPerMeter:=2834; // пикселей на метр, верт.
  bmiInfo.bmiHeader.biClrUsed:=0;          // палитры нет, все в ноль
  bmiInfo.bmiHeader.biClrImportant:=0;     // то же
  bmiInfo.bmiHeader.biSize:=SizeOf(bmiInfo.bmiHeader); // размер структруы
  bmDIB:=CreateDIBSection(DC, bmiInfo, DIB_RGB_COLORS,
  Pointer(lpBits), 0, 0);
  //создаем независимый растр WxHx24, без палитры, в указателе lpBits получаем
  //адрес первого байта этого растра. bmDIB - дискрептор растра

  //заполняем первые шесть членов BITMAPINFO для передачи в GetDIBits

  bmiInfo.bmiHeader.biWidth:=W;            // ширина
  bmiInfo.bmiHeader.biHeight:=H;           // высота
  bmiInfo.bmiHeader.biPlanes:=1;           // всегда 1
  bmiInfo.bmiHeader.biBitCount:=24;        // три байта на пиксель
  bmiInfo.bmiHeader.biCompression:=BI_RGB; // без компресси
  bmiInfo.bmiHeader.biSize:=SizeOf(bmiInfo.bmiHeader); // размер структуры
  GetDIBits(DC, Bitmap, 0, H-1, lpBits, bmiInfo, DIB_RGB_COLORS);
  //конвертируем исходный растр в наш с его копированием по адресу lpBits



Добавлено @ 13:08
Порывшись в справке я еще нашел что функция
CreateDIBSection создает тот самый аппаратно независимый растр
который нам и нужен


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
DragonFire
Дата 10.3.2006, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Girder @ 10.3.2006, 12:19 Найти цитируемый пост)
pTWrap(DWord(Result)+x*SizeOf(TWrap))^[0];
где pTWrap = ^TWrap;

И куда это писать?
Простите нуба...

Цитата(alexeis1 @ 10.3.2006, 12:56 Найти цитируемый пост)
Порывшись в примерах я нашел чтото похожее на то что нужно
дання процедура использовалась для создания скина из битмапа
при помощи апи
Привожу фрагмент

Вещь хорошая, но непонятная...
Где тут название файла? она же ничего не загружает...
И еще как pByteArray или хотябы Pointer присобачить? Через Buf?


--------------------
PM MAIL ICQ   Вверх
Girder
Дата 10.3.2006, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


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

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



Цитата(DragonFire @ 10.3.2006, 13:08 Найти цитируемый пост)
И куда это писать?

http://forum.vingrad.ru/index.php?showtopi...st&p=662985 ("У меня есть и такой код:")

Вместо: With TWrap(result^)[x] do begin
Енто: With pTWrap(DWord(Result)+x*SizeOf(TWrap))^[0] do begin

Перед: TWrap = Array [0..0] of TRGB;
Енто: pTWrap = ^TWrap;


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Alexeis
Дата 10.3.2006, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



DragonFire, файл предпологается загуженным заранее
Bitmap : hBitmap - handle загруженного битмапа
(то что мы получили функцией LoadImage и записывали в переменную h)
Добавлено @ 13:16
Далее анологично получили информацию
строчка GetObject(Bitmap, SizeOf(bmInfo), @bmInfo);
Добавлено @ 13:17
у нас это было ввиде
DS.dsbmih.biSize := 0;
FillChar(DS, SizeOf(DS), 0);
Bytes := GetObject(h, SizeOf(DS), @DS);
Добавлено @ 13:22
Потом заполнили специальную структуру для подготовки аппаратно независимого растра - это
bmiInfo

Затем вызвали
CreateDIBSection(DC, bmiInfo , DIB_RGB_COLORS,
Pointer(lpBits), 0, 0);

и получили злополучный указатель в переменной lpBits

Для чего нужно GetDIBits я еще не знаю.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Alexeis
Дата 10.3.2006, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Понял smile GetDIBits делает копию растра в буфер, так как CreateDIBSection создает пустой растр (типа заготовки), а GetDIBits просто его заполняет.
Только после этого в lpBits будет нужный растр.
Вроде ВСЕ smile


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
DragonFire
Дата 10.3.2006, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Girder
Спасибо, прога запустилась! Тока это проблемы не решило... где-то ошибка в загрузке текстур... Она всеравно натягивается неправильно...

alexeis1
А теперь, если можно полный код, потому что у меня выдает ошибку, когда я вместо h пытаюсь подставить Bitmap...


--------------------
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

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

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

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


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

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


 




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


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

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