OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 19 Март, 2024 06:49

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 41 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Re: Работа с OpenGL
СообщениеДобавлено: Пятница, 12 Декабрь, 2008 23:22 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Да было б куда контекст OpenGL положить, и мышку\клаву на нём отловить. Это для минимума. Тут концепция отображений ББ как бы не особо и нужна.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с OpenGL
СообщениеДобавлено: Суббота, 13 Декабрь, 2008 21:50 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Алексей_В писал(а):
Но - можно ли реализовать в этом графическом приложении с Glut например меню, типа как в играх, под мышь, и чтоб приложение написанное на BlackBox реагировало на него?
...И например, если бы Вы собрались написать несложную игру или 3D редактор под Glut
чего именно не хватало бы из фреймворка? Так ли это серьезно, или этот функционал можно обеспечить и самому..
Не совсем понятен Ваш вопрос. Касательно GLUT:
- пишется отдельный exe, который использует GLUT.
- GLUT обеспечивает простейшие средства организации интерфейса: создать окно, обработать сообщение от мыши/клавиатуры, поддерживает меню; т.е. простейший интерфейс сделать не проблема - надо читать док-ю по библ. GLUT.
- окна GLUT рисуются средствами OpenGL.

Далее -- свой код можно писать на чём угодно (был бы интерфейс к glut.dll). В случае ББ, получаем компонентный паскаль, сборку мусора, и пр.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с OpenGL
СообщениеДобавлено: Четверг, 03 Декабрь, 2009 16:11 

Зарегистрирован: Суббота, 02 Август, 2008 23:01
Сообщения: 43
Проблема следующая...
Загружаю изображение с помощью подсистемы Free. При отображении его на экран либо с помощью DrawPixels, либо в качестве текстуры, изображение оказывается другим цветом по сравнению с исходным. Так как в DrawPixels и TexImage2D указывается константа GL_UNSIGNED_BYTE, могу предположить, что изменяются значения RGB из-за отсутствия в КП беззнаковых целых. Пробовал указывать GL_BYTE - получаются другие цвета, но опять же отличные от исходного.
Может кто сталкивался с таким?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с OpenGL
СообщениеДобавлено: Четверг, 03 Декабрь, 2009 16:49 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
С изображениями не работал...
Rafi писал(а):
могу предположить, что изменяются значения RGB из-за отсутствия в КП беззнаковых целых
Врят ли проблема не в этом.
Код:
GL  type    CP type synonym   actual CP type
------------------------------------------------------------------------
boolean   Boolean   SHORTCHAR
byte   Byte   BYTE
ubyte   Ubyte   SHORTCHAR
...
SHORTCHAR беззнаковый.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с OpenGL
СообщениеДобавлено: Четверг, 03 Декабрь, 2009 17:22 

Зарегистрирован: Суббота, 02 Август, 2008 23:01
Сообщения: 43
Хотя... Ведь все действия с изображением выполняют dll'ки: одна (FreeImage) загружает, другая (OpenGL) отображает на экран. Я-то просто их ф-ции из своего модуля вызываю. С данными не делаю никаких действий. Может, какие-то особенности FreeImage не учёл?)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с OpenGL
СообщениеДобавлено: Воскресенье, 06 Декабрь, 2009 20:55 

Зарегистрирован: Суббота, 02 Август, 2008 23:01
Сообщения: 43
Похоже, нашёл, в чём дело...
Допустим, в изображении первый пиксел красного цвета (FF0000 в RGB-формате). Но когда я вывожу значение этого пиксела в Log, то оно оказывается равным 255 (0000FF). То есть получается в виде BGR. Наверное, проблему с цветом можно было бы решить, передавая в DrawPixels и TexImage2D вместо константы GL_RGB константу GL_BGR, но такой константы нет в интерфейсном модуле.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с OpenGL
СообщениеДобавлено: Воскресенье, 06 Декабрь, 2009 20:57 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Вы не забывайте про остроконечный порядок байт!!

RGB - это как раз и есть 0BBGGRRH. Потому что сначала в памяти лежит R-байт (и это младшие разряды слова), потом G, потом B. RGB.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с OpenGL
СообщениеДобавлено: Воскресенье, 06 Декабрь, 2009 21:48 

Зарегистрирован: Суббота, 02 Август, 2008 23:01
Сообщения: 43
Так... Значит, 0000FFH - это и есть красный в RGB-формате? В чём же тогда дело?.. Почему же красный в итоге отображается синим, а синий - красным?
Придётся копать дальше)).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с OpenGL
СообщениеДобавлено: Воскресенье, 06 Декабрь, 2009 22:05 

Зарегистрирован: Суббота, 02 Август, 2008 23:01
Сообщения: 43
Добавил в интерфейсный модуль константу GL_BGR, указал её в DrawPixels. Стало выводиться правильно)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с OpenGL
СообщениеДобавлено: Понедельник, 07 Декабрь, 2009 12:38 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Может, я не понял, о чем речь, но в Ports есть платформонезависимая функция RGBColor.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с OpenGL
СообщениеДобавлено: Понедельник, 07 Декабрь, 2009 13:53 

Зарегистрирован: Суббота, 02 Август, 2008 23:01
Сообщения: 43
RGBColor опять-таки возвращает цвет в виде 0BBGGRRH. По определению это и есть RGB-форма. Но если в OpenGL указать при прорисовке пикселей (или при текcтурировании) константу GL_RGB, то почему-то пиксели записываются в форме 0RRBBGGH, то бишь как BGR. А если указать GL_BGR, то всё нормально. И непонятно, почему так. Особенности опенгла что ли?..


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с OpenGL
СообщениеДобавлено: Понедельник, 07 Декабрь, 2009 14:22 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Скорее всего. Нашёл вот что:
http://www.opengl.org/registry/doc/glsp ... 061201.pdf
Цитата:
D.2 BGRA Pixel Formats
BGRA extends the list of client memory color formats. Specifically, it provides
a component order matching file and framebuffer formats common on Windows
platforms. The additions match those of the GL EXT bgra extension.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с OpenGL
СообщениеДобавлено: Понедельник, 07 Декабрь, 2009 15:25 

Зарегистрирован: Суббота, 02 Август, 2008 23:01
Сообщения: 43
А мне попалась информация о том, что в поверхности DirectDraw значение RGB записывается в тупоконечном порядке на том основании, что так легче для восприятия (чтение слева направо). Видимо, в OpenGL на том же основании тупоконечный порядок).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с OpenGL
СообщениеДобавлено: Понедельник, 07 Декабрь, 2009 15:49 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
(общее замечание) я обычно так делаю: если что-то идёт не так, а как по стандарту не знаю - копаю стандарт... Гадать - на крайний случай :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с OpenGL
СообщениеДобавлено: Понедельник, 07 Декабрь, 2009 15:54 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Вот в DirectDraw вроде остроконечный - когда я 6 лет назад программировал эту штуку, тоже долго не мог понять, почему всё не так :) Понял, когда узнал про эндианность :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с OpenGL
СообщениеДобавлено: Среда, 17 Февраль, 2010 10:38 

Зарегистрирован: Суббота, 02 Август, 2008 23:01
Сообщения: 43
Возникла следующая проблема с массивами вершин.
Код:
(* Включаю массив вершин *)
GL.EnableClientState(GL.GL_VERTEX_ARRAY);
      
(* Указываю заполненный массив *)
GL.VertexPointer(2, GL.GL_INT, 0, vertices[0]);

(* Вызываю вершину 1 *)
GL.Begin(GL.GL_POINTS);
    GL.ArrayElement(1);
GL.End;


Выскакивает трап на ArrayElement и говорит: NIL dereference (read).
Если же поместить ArrayElement за пределы Begin - End, то трапа нет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с OpenGL
СообщениеДобавлено: Среда, 17 Февраль, 2010 11:15 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Хорошо бы весь модуль компилируемый видеть... Т.к. непонятно что представляет "заполненный массив".

Сделаю предположение, что используете Ogl и не учли:
Код:
MODULE  OglOpenGL32 ["OPENGL32.dll"];
...
TYPE
...
   Address* = INTEGER;
...
PROCEDURE  VertexPointer* ["glVertexPointer"] (size: Int; type: Enum; stride: Sizei;  pointer: Address);
...
Ogl/Docu/OglDoc писал(а):
Correspondence between Component Pascal and OpenGL data types

Simple types
GL type CP type synonym actual CP type
...
void * Address INTEGER

Pointer types (arrays)
...
2) Generic pointers
The actual type of the pointer is determined at run time through an additional parameter. Example:
Код:
void ColorPointer (int size,  enum type, sizei stride,  void * pointer);
Here, the actual type of the array passed as "pointer" is specified through the parameter "type". The Component Pascal signature for this procedure is
Код:
     PROCEDURE  ColorPointer (size: Int;  type: Enum;  stride: Sizei;   pointer: Address)
where Address is a synonym for INTEGER. The actual parameter for "pointer" is the address of the first element of the array containing the data, i.e. the procedure call is
Код:
    ColorPointer( size, type, stride, SYSTEM.ADR(colors[0]) );


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с OpenGL
СообщениеДобавлено: Среда, 17 Февраль, 2010 11:36 

Зарегистрирован: Суббота, 02 Август, 2008 23:01
Сообщения: 43
Спасибо, Евгений! Заработало.
Лишнее напоминание, что, прежде чем писать на форум, следует почитать доки))
Это, получается, я какой-то случайный адрес указывал?)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с OpenGL
СообщениеДобавлено: Пятница, 26 Ноябрь, 2010 19:09 

Зарегистрирован: Четверг, 05 Ноябрь, 2009 13:52
Сообщения: 14
Откуда: Украина, г. Харьков
Если кому интересно, простая программа http://xproger.mentalx.org/archives/44 - оригинал на Delphi.
А вот BlackBox
Код:
MODULE Demo1;

IMPORT SYSTEM, WinApi, WinGL;

VAR
   instance: WinApi.HINSTANCE;
   pfd: WinApi.PIXELFORMATDESCRIPTOR;
   DC: WinApi.HDC;
   
   result: INTEGER;
   bres: WinApi.BOOL;
BEGIN
   instance := WinApi.GetModuleHandle(NIL);
   DC := WinApi.GetDC(WinApi.CreateWindowEx(BITS(0),
                                                   "EDIT",
                                                   NIL,
                                                  WinApi.WS_POPUP+WinApi.WS_VISIBLE,
   0, 0, 640, 480, 0, 0, 0, 0));
   result:=WinApi.ShowCursor(0);
   pfd.dwFlags := WinApi.PFD_DRAW_TO_WINDOW + WinApi.PFD_SUPPORT_OPENGL + WinApi.PFD_DOUBLEBUFFER;
   bres:=WinApi.SetPixelFormat(DC,WinApi.ChoosePixelFormat(DC,pfd),pfd);
   bres:=WinApi.wglMakeCurrent(DC, WinApi.wglCreateContext(DC));
   
   WHILE WinApi.GetAsyncKeyState(27) = 0 DO
      WinGL.glBegin(WinGL.GL_QUADS);
         WinGL.glColor3f(1,0,0); WinGL.glVertex2f(-0.4, -0.4);
         WinGL.glColor3f(0,1,0); WinGL.glVertex2f( 0.4, -0.4);
         WinGL.glColor3f(0,0,1); WinGL.glVertex2f( 0.4,  0.4);
         WinGL.glColor3f(1,0,1); WinGL.glVertex2f(-0.4,  0.4);
      WinGL.glEnd();
      bres:=WinApi.SwapBuffers(DC);
   END;
   
END Demo1.

 DevCompiler.Compile
 DevLinker.LinkExe 'Projects\Demo1\Demo1.exe' := Demo1 1 'Projects\Demo1\demo1.ico' ~



Первая проба запуска OpenGL с компонентным паскалем.
(и еще можно запустить функцию, без присваивания результата какой либо переменной?)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с OpenGL
СообщениеДобавлено: Пятница, 26 Ноябрь, 2010 19:20 
Аватара пользователя

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 495
...и теперь проделайте то же самое - без WinApi.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 41 ]  На страницу Пред.  1, 2, 3  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB