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 реагировало на него? Не совсем понятен Ваш вопрос. Касательно GLUT:...И например, если бы Вы собрались написать несложную игру или 3D редактор под 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 SHORTCHAR беззнаковый.
------------------------------------------------------------------------ boolean Boolean SHORTCHAR byte Byte BYTE ubyte Ubyte 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/ |