OberonCore
https://forum.oberoncore.ru/

Работа с OpenGL
https://forum.oberoncore.ru/viewtopic.php?f=24&t=825
Страница 2 из 3

Автор:  Иван Кузьмицкий [ Пятница, 12 Декабрь, 2008 23:22 ]
Заголовок сообщения:  Re: Работа с OpenGL

Да было б куда контекст OpenGL положить, и мышку\клаву на нём отловить. Это для минимума. Тут концепция отображений ББ как бы не особо и нужна.

Автор:  Евгений Темиргалеев [ Суббота, 13 Декабрь, 2008 21:50 ]
Заголовок сообщения:  Re: Работа с OpenGL

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

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

Автор:  Rafi [ Четверг, 03 Декабрь, 2009 16:11 ]
Заголовок сообщения:  Re: Работа с OpenGL

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

Автор:  Евгений Темиргалеев [ Четверг, 03 Декабрь, 2009 16:49 ]
Заголовок сообщения:  Re: Работа с OpenGL

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

Автор:  Rafi [ Четверг, 03 Декабрь, 2009 17:22 ]
Заголовок сообщения:  Re: Работа с OpenGL

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

Автор:  Rafi [ Воскресенье, 06 Декабрь, 2009 20:55 ]
Заголовок сообщения:  Re: Работа с OpenGL

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

Автор:  Илья Ермаков [ Воскресенье, 06 Декабрь, 2009 20:57 ]
Заголовок сообщения:  Re: Работа с OpenGL

Вы не забывайте про остроконечный порядок байт!!

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

Автор:  Rafi [ Воскресенье, 06 Декабрь, 2009 21:48 ]
Заголовок сообщения:  Re: Работа с OpenGL

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

Автор:  Rafi [ Воскресенье, 06 Декабрь, 2009 22:05 ]
Заголовок сообщения:  Re: Работа с OpenGL

Добавил в интерфейсный модуль константу GL_BGR, указал её в DrawPixels. Стало выводиться правильно)

Автор:  Info21 [ Понедельник, 07 Декабрь, 2009 12:38 ]
Заголовок сообщения:  Re: Работа с OpenGL

Может, я не понял, о чем речь, но в Ports есть платформонезависимая функция RGBColor.

Автор:  Rafi [ Понедельник, 07 Декабрь, 2009 13:53 ]
Заголовок сообщения:  Re: Работа с OpenGL

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

Автор:  Евгений Темиргалеев [ Понедельник, 07 Декабрь, 2009 14:22 ]
Заголовок сообщения:  Re: Работа с OpenGL

Скорее всего. Нашёл вот что:
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.

Автор:  Rafi [ Понедельник, 07 Декабрь, 2009 15:25 ]
Заголовок сообщения:  Re: Работа с OpenGL

А мне попалась информация о том, что в поверхности DirectDraw значение RGB записывается в тупоконечном порядке на том основании, что так легче для восприятия (чтение слева направо). Видимо, в OpenGL на том же основании тупоконечный порядок).

Автор:  Евгений Темиргалеев [ Понедельник, 07 Декабрь, 2009 15:49 ]
Заголовок сообщения:  Re: Работа с OpenGL

(общее замечание) я обычно так делаю: если что-то идёт не так, а как по стандарту не знаю - копаю стандарт... Гадать - на крайний случай :)

Автор:  Илья Ермаков [ Понедельник, 07 Декабрь, 2009 15:54 ]
Заголовок сообщения:  Re: Работа с OpenGL

Вот в DirectDraw вроде остроконечный - когда я 6 лет назад программировал эту штуку, тоже долго не мог понять, почему всё не так :) Понял, когда узнал про эндианность :)

Автор:  Rafi [ Среда, 17 Февраль, 2010 10:38 ]
Заголовок сообщения:  Re: Работа с OpenGL

Возникла следующая проблема с массивами вершин.
Код:
(* Включаю массив вершин *)
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, то трапа нет.

Автор:  Евгений Темиргалеев [ Среда, 17 Февраль, 2010 11:15 ]
Заголовок сообщения:  Re: Работа с OpenGL

Хорошо бы весь модуль компилируемый видеть... Т.к. непонятно что представляет "заполненный массив".

Сделаю предположение, что используете 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]) );

Автор:  Rafi [ Среда, 17 Февраль, 2010 11:36 ]
Заголовок сообщения:  Re: Работа с OpenGL

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

Автор:  niello [ Пятница, 26 Ноябрь, 2010 19:09 ]
Заголовок сообщения:  Re: Работа с OpenGL

Если кому интересно, простая программа 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 с компонентным паскалем.
(и еще можно запустить функцию, без присваивания результата какой либо переменной?)

Автор:  Димыч [ Пятница, 26 Ноябрь, 2010 19:20 ]
Заголовок сообщения:  Re: Работа с OpenGL

...и теперь проделайте то же самое - без WinApi.

Страница 2 из 3 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/