OberonCore
https://forum.oberoncore.ru/

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

Автор:  prokopiy [ Понедельник, 14 Январь, 2008 11:50 ]
Заголовок сообщения:  Работа с OpenGL

Предлагаю обсудить изпользование OpenGL в BlackBox.

Автор:  prokopiy [ Понедельник, 14 Январь, 2008 11:55 ]
Заголовок сообщения:  Re: Работа с OpenGL

Может у кого есть исходники как сделать Windows-приложение (.exe) используя модули WinApi и WinGL?

Автор:  Илья Ермаков [ Понедельник, 14 Январь, 2008 12:54 ]
Заголовок сообщения:  Re: Работа с OpenGL

Есть пример с использованием GLUT - стандартной кроссплатформенной библиотеки создания Опенгль-окон. (в винде нужен glut.dll, есть на OpenGL.org, под Linux с Wine новых версий заработает сразу, там он уже есть). OpenGL-заголовки в примере не из WinOGL, а из подсистемы Ogl из коллекции http://www.zinnamturm.eu (там поудобней именование, лишний префикс gl убран, в Обероне он не нужен, т.к. модуль и так префиксуется).

Заголовок GLUT перенесён с дельфовской версии.

Программа рисует многоугольник, по клавишам-цифрам меняет "угольчатость", по Esc выходит.
Писали с Евгением Темиргалеевым.

Линкуется командером
DevLinker.LinkExe SimpleApp.exe :=
National Kernel+ Math F3dSimpleApp$

Код:
MODULE OglSimpleApp;

   IMPORT GL := OglOpenGL32, GLUT := OglGLUT, Math, Kernel, WinApi, S := SYSTEM;

   TYPE
      Triade = ARRAY 3 OF GL.Ubyte;

   VAR
      width, height: GL.Int;
      n, nn: INTEGER;
      colors: ARRAY 7 OF Triade;

   PROCEDURE [ccall] Display;
      VAR ox, oy, x, y, r: REAL;
            i: INTEGER;
   BEGIN
      ox := width / 2; oy := height / 2; r := MIN(width, height) / 2;
      GL.ClearColor(0, 0, 0, 1);
      GL.Clear(GL.GL_COLOR_BUFFER_BIT);
      GL.Begin(GL.GL_POLYGON);
      FOR i := 0 TO n - 1 DO
         GL.Color3ubv(colors[i MOD 7, 0]);
         x := ox + r * Math.Cos(i * 2 * Math.Pi() / n);
         y := oy + r * Math.Sin(i * 2 * Math.Pi() / n);
         GL.Vertex2f(SHORT(x), SHORT(y))
      END;
      GL.End;
      GL.Finish
   END Display;

   PROCEDURE [ccall] Reshape (w, h: INTEGER);
   BEGIN
      width := w; height := h;
      GL.Viewport(0, 0, w, h);
      GL.MatrixMode(GL.GL_PROJECTION);
      GL.LoadIdentity;
      GL.Ortho(0, w, 0, h, -1.0, 1.0);
      GL.MatrixMode(GL.GL_MODELVIEW);
      GL.LoadIdentity
   END Reshape;

   PROCEDURE [ccall] Keyboard (key: SHORTCHAR; x, y: INTEGER);
   BEGIN
      CASE key OF
      | CHR(27): Kernel.Quit(0)
      | CHR(13):
         IF (nn >= 3) & (nn <= 360) & (nn # n) THEN n := nn; GLUT.PostRedisplay END;
         nn := 0
      | '0'..'9':
         nn := nn * 10 + ORD(key) - ORD('0')
      ELSE
      END
   END Keyboard;

   PROCEDURE Main;
      VAR argc: INTEGER;
            argv: ARRAY 1 OF WinApi.PtrSTR;
            s: ARRAY 16 OF CHAR;
            wnd: INTEGER;
   BEGIN
      argc  := 0;
      s := "";
      argv[0] := S.VAL(WinApi.PtrSTR, S.ADR(s));
      GLUT.Init(argc, argv);
      GLUT.InitDisplayMode(GLUT.RGB);
      GLUT.InitWindowSize(width, height);
      wnd := GLUT.CreateWindow("My beauty window");      
      GLUT.DisplayFunc(Display);
      GLUT.ReshapeFunc(Reshape);
      GLUT.KeyboardFunc(Keyboard);
      GLUT.MainLoop
   END Main;

   PROCEDURE PutTriade (r, g, b: SHORTINT; OUT t: Triade);
   BEGIN
      t[0] := SHORT(CHR(r)); t[1] := SHORT(CHR(g)); t[2] := SHORT(CHR(b))
   END PutTriade;

   PROCEDURE InitColors;
   BEGIN
      PutTriade(255, 0, 255, colors[0]);
      PutTriade(0, 0, 255, colors[1]);
      PutTriade(0, 255, 255, colors[2]);
      PutTriade(0, 255, 0, colors[3]);
      PutTriade(255, 255, 0, colors[4]);
      PutTriade(255, 128, 0, colors[5]);
      PutTriade(255, 0, 0, colors[6])
   END InitColors;

BEGIN
   n := 3; width := 400; height := 300;
   InitColors;
   Main
END OglSimpleApp.


Код:
MODULE OglGLUT['glut32'];

   IMPORT GL := OglOpenGL32;

   CONST
      (* Display mode bit masks *)
      RGB* = {};
      RGBA* = RGB;
      INDEX* = {0};
      SINGLE* = {};
      DOUBLE* = {1};
      ACCUM* = {2};
      ALPHA* = {3};
      DEPTH* = {4};
      STENCIL* = {5};
      MULTISAMPLE* = {7};
      STEREO* = {8};
      LIMINANCE* = {9};

      (* Mouse buttons *)
      LEFT_BUTTON* = 0;
      MIDDLE_BUTTON* = 1;
      RIGHT_BUTTON* = 2;

      (* Mouse button state *)
      DOWN* = 0;
      UP* = 1;

      (* function keys *)
      KEY_F1* = 1;
      KEY_F2* = 2;
      KEY_F3* = 3;
      KEY_F4* = 4;
      KEY_F5* = 5;
      KEY_F6* = 6;
      KEY_F7* = 7;
      KEY_F8* = 8;
      KEY_F9* = 9;
      KEY_F10* = 10;
      KEY_F11* = 11;
      KEY_F12* = 12;
      (* directional keys *)
      KEY_LEFT* = 100;
      KEY_UP* = 101;
      KEY_RIGHT* = 102;
      KEY_DOWN* = 103;
      KEY_PAGE_UP* = 104;
      KEY_PAGE_DOWN* = 105;
      KEY_HOME* = 106;
      KEY_END* = 107;
      KEY_INSERT* = 108;

      (* Entry/exit state *)
      LEFT* = 0;
      ENTERED* = 1;

      (* Menu usage state *)
      MENU_NOT_IN_USE* = 0;
      MENU_IN_USE* = 1;

      (* Visibility state *)
      NOT_VISIBLE* = 0;
      VISIBLE* = 1;

      (* Window status state *)
      HIDDEN* = 0;
      FULLY_RETAINED* = 1;
      PARTIALLY_RETAINED* = 2;
      FULLY_COVERED* = 3;

      (* Color index component selection values *)
      RED* = 0;
      GREEN* = 1;
      BLUE* = 2;

      (* Layers for use *)
      NORMAL* = 0;
      OVERLAY* = 1;

      (* Stroke font constants (use these in GLUT program) *)
      STROKE_ROMAN* = 0;
      STROKE_MONO_ROMAN* = 1;

      (* Bitmap font constants (use these in GLUT program) *)
      BITMAP_9_BY_15* = 2;
      BITMAP_8_BY_13* = 3;
      BITMAP_TIMES_ROMAN_10* = 4;
      BITMAP_TIMES_ROMAN_24* = 5;
      BITMAP_HELVETICA_10* = 6;
      BITMAP_HELVETICA_12* = 7;
      BITMAP_HELVETICA_18* = 8;

      (* glutGet parameters *)
      WINDOW_X* = 100;
      WINDOW_Y* = 101;
      WINDOW_WIDTH* = 102;
      WINDOW_HEIGHT* = 103;
      WINDOW_BUFFER_SIZE* = 104;
      WINDOW_STENCIL_SIZE* = 105;
      WINDOW_DEPTH_SIZE* = 106;
      WINDOW_RED_SIZE* = 107;
      WINDOW_GREEN_SIZE* = 108;
      WINDOW_BLUE_SIZE* = 109;
      WINDOW_ALPHA_SIZE* = 110;
      WINDOW_ACCUM_RED_SIZE* = 111;
      WINDOW_ACCUM_GREEN_SIZE* = 112;
      WINDOW_ACCUM_BLUE_SIZE* = 113;
      WINDOW_ACCUM_ALPHA_SIZE* = 114;
      WINDOW_DOUBLEBUFFER* = 115;
      WINDOW_RGBA* = 116;
      WINDOW_PARENT* = 117;
      WINDOW_NUM_CHILDREN* = 118;
      WINDOW_COLORMAP_SIZE* = 119;
      WINDOW_NUM_SAMPLES* = 120;
      WINDOW_STEREO* = 121;
      WINDOW_CURSOR* = 122;
      SCREEN_WIDTH* = 200;
      SCREEN_HEIGHT* = 201;
      SCREEN_WIDTH_MM* = 202;
      SCREEN_HEIGHT_MM* = 203;
      MENU_NUM_ITEMS* = 300;
      DISPLAY_MODE_POSSIBLE* = 400;
      INIT_WINDOW_X* = 500;
      INIT_WINDOW_Y* = 501;
      INIT_WINDOW_WIDTH* = 502;
      INIT_WINDOW_HEIGHT* = 503;
      INIT_DISPLAY_MODE* = 504;
      ELAPSED_TIME* = 700;

      (* glutDeviceGet parameters *)
      HAS_KEYBOARD* = 600;
      HAS_MOUSE* = 601;
      HAS_SPACEBALL* = 602;
      HAS_DIAL_AND_BUTTON_BOX* = 603;
      HAS_TABLET* = 604;
      NUM_MOUSE_BUTTONS* = 605;
      NUM_SPACEBALL_BUTTONS* = 606;
      NUM_BUTTON_BOX_BUTTONS* = 607;
      NUM_DIALS* = 608;
      NUM_TABLET_BUTTONS* = 609;

      (* glutLayerGet parameters *)
      OVERLAY_POSSIBLE* = 800;
      LAYER_IN_USE* = 801;
      HAS_OVERLAY* = 802;
      TRANSPARENT_INDEX* = 803;
      NORMAL_DAMAGED* = 804;
      OVERLAY_DAMAGED* = 805;

      (* glutVideoResizeGet parameters *)
      VIDEO_RESIZE_POSSIBLE* = 900;
      VIDEO_RESIZE_IN_USE* = 901;
      VIDEO_RESIZE_X_DELTA* = 902;
      VIDEO_RESIZE_Y_DELTA* = 903;
      VIDEO_RESIZE_WIDTH_DELTA* = 904;
      VIDEO_RESIZE_HEIGHT_DELTA* = 905;
      VIDEO_RESIZE_X* = 906;
      VIDEO_RESIZE_Y* = 907;
      VIDEO_RESIZE_WIDTH* = 908;
      VIDEO_RESIZE_HEIGHT* = 909;

      (* glutGetModifiers return mask *)
      ACTIVE_SHIFT* = {0};
      ACTIVE_CTRL* = {1};
      ACTIVE_ALT* = {2};

      (* glutSetCursor parameters *)
      (* Basic arrows *)
      CURSOR_RIGHT_ARROW* = 0;
      CURSOR_LEFT_ARROW* = 1;
      (* Symbolic cursor shapes *)
      CURSOR_INFO* = 2;
      CURSOR_DESTROY* = 3;
      CURSOR_HELP* = 4;
      CURSOR_CYCLE* = 5;
      CURSOR_SPRAY* = 6;
      CURSOR_WAIT* = 7;
      CURSOR_TEXT* = 8;
      CURSOR_CROSSHAIR* = 9;
      (* Directional cursors *)
      CURSOR_UP_DOWN* = 10;
      CURSOR_LEFT_RIGHT* = 11;
      (* Sizing cursors *)
      CURSOR_TOP_SIDE* = 12;
      CURSOR_BOTTOM_SIDE* = 13;
      CURSOR_LEFT_SIDE* = 14;
      CURSOR_RIGHT_SIDE* = 15;
      CURSOR_TOP_LEFT_CORNER* = 16;
      CURSOR_TOP_RIGHT_CORNER* = 17;
      CURSOR_BOTTOM_RIGHT_CORNER* = 18;
      CURSOR_BOTTOM_LEFT_CORNER* = 19;
      (* Inherit from parent window *)
      CURSOR_INHERIT* = 100;
      (* Blank cursor *)
      CURSOR_NONE* = 101;
      (* Fullscreen crosshair (if available) *)
      CURSOR_FULL_CROSSHAIR* = 102;

   TYPE
      Address* = GL.Address;
      PtrSTR* = POINTER TO ARRAY [untagged] OF SHORTCHAR;

   (* GLUT Initialization sub-API *)
   PROCEDURE Init* ['glutInit'] (VAR argc: INTEGER; VAR argv: ARRAY [untagged] OF PtrSTR);
   PROCEDURE InitDisplayMode* ['glutInitDisplayMode'] (mode: SET);
   PROCEDURE InitDisplayString* ['glutInitDisplayString'] (string: PtrSTR);
   PROCEDURE InitWindowPosition* ['glutInitWindowPosition'] (x, y: INTEGER);
   PROCEDURE InitWindowSize* ['glutInitWindowSize'] (width, height: INTEGER);
   PROCEDURE MainLoop* ['glutMainLoop'];

   (* GLUT Window sub-API *)
   PROCEDURE CreateWindow* ['glutCreateWindow'] (title: PtrSTR): INTEGER;
   PROCEDURE CreateSubWindow* ['glutCreateSubWindow'] (win, x, y, width, height: INTEGER): INTEGER;
   PROCEDURE DestroyWindow* ['glutDestroyWindow'] (win: INTEGER);
   PROCEDURE PostRedisplay* ['glutPostRedisplay'];
   PROCEDURE PostWindowRedisplay* ['glutPostWindowRedisplay'] (win: INTEGER);
   PROCEDURE SwapBuffers* ['glutSwapBuffers'];
   PROCEDURE GetWindow* ['glutGetWindow'] (): INTEGER;
   PROCEDURE SetWindow* ['glutSetWindow'] (win: INTEGER);
   PROCEDURE SetWindowTitle* ['glutSetWindowTitle'] (name: PtrSTR);
   PROCEDURE SetIconTitle* ['glutSetIconTitle'] (name: PtrSTR);
   PROCEDURE PositionWindow* ['glutPositionWindow'] (x, y: INTEGER);
   PROCEDURE ReshapeWindow* ['glutReshapeWindow'] (width, height: INTEGER);
   PROCEDURE PopWindow* ['glutPopWindow'];
   PROCEDURE PushWindow* ['glutPushWindow'];
   PROCEDURE IconifyWindow* ['glutIconifyWindow'];
   PROCEDURE ShowWindow* ['glutShowWindow'];
   PROCEDURE HideWindow* ['glutHideWindow'];
   PROCEDURE FullScreen* ['glutFullScreen'];
   PROCEDURE SetCursor* ['glutSetCursor'] (cursor: INTEGER);
   PROCEDURE WrapPointer* ['glutWrapPointer'] (x, y: INTEGER);
   
   (* GLUT Overlay sub-API *)
   PROCEDURE EstablishOverlay* ['glutEstablishOverlay'];
   PROCEDURE RemoveOverlay* ['glutRemoveOverlay'];
   PROCEDURE UseLayer* ['glutUseLayer'] (layer: GL.Enum);
   PROCEDURE PostOverlayRedisplay* ['glutPostOverlayRedisplay'];
   PROCEDURE PostWindowOverlayRedisplay* ['glutPostWindowOverlayRedisplay'] (win: INTEGER);
   PROCEDURE ShowOverlay* ['glutShowOverlay'];
   PROCEDURE HideOverlay* ['glutHideOverlay'];
   
   (* GLUT Menu sub-API *)
   PROCEDURE CreateMenu* ['glutCreateMenu'] (func: PROCEDURE (value: INTEGER)): INTEGER;
   PROCEDURE DestroyMenu* ['glutDestroyMenu'] (menu: INTEGER);
   PROCEDURE GetMenu* ['glutGetMenu'] (): INTEGER;
   PROCEDURE SetMenu* ['glutSetMenu'] (menu: INTEGER);
   PROCEDURE AddMenuEntry* ['glutAddMenuEntry'] (name: PtrSTR; value: INTEGER);
   PROCEDURE AddSubMenu* ['glutAddSubMenu'] (name: PtrSTR; menu: INTEGER);
   PROCEDURE ChangeToMenuEntry* ['glutChangeToMenuEntry'] (entry: INTEGER; name: PtrSTR; value: INTEGER);
   PROCEDURE ChangeToSubMenu* ['glutChangeToSubMenu'] (entry: INTEGER; name: PtrSTR; value: INTEGER);
   PROCEDURE RemoveMenuItem* ['glutRemoveMenuItem'] (entry: INTEGER);
   PROCEDURE AttachMenu* ['glutAttachMenu'] (button: INTEGER);
   PROCEDURE DetachMenu* ['glutDetachMenu'] (button: INTEGER);
   
   (* GLUT sub-API *)
   PROCEDURE DisplayFunc* ['glutDisplayFunc'] (f: PROCEDURE);
   PROCEDURE ReshapeFunc* ['glutReshapeFunc'] (f: PROCEDURE (width, height: INTEGER));
   PROCEDURE KeyboardFunc* ['glutKeyboardFunc'] (f: PROCEDURE (key: SHORTCHAR; x, y: INTEGER));
   PROCEDURE MouseFunc* ['glutMouseFunc'] (f: PROCEDURE (button, state, x, y: INTEGER));
   PROCEDURE MotionFunc* ['glutMotionFunc'] (f: PROCEDURE (x, y: INTEGER));
   PROCEDURE PassiveMotionFunc* ['glutPassiveMotionFunc'] (f: PROCEDURE (x, y: INTEGER));
   PROCEDURE EntryFunc* ['glutEntryFunc'] (f: PROCEDURE (state: INTEGER));
   PROCEDURE VisibilityFunc* ['glutVisibilityFunc'] (f: PROCEDURE (state: INTEGER));
   PROCEDURE IdleFunc* ['glutIdleFunc'] (f: PROCEDURE);
   PROCEDURE TimerFunc* ['glutTimerFunc'] (msecs: INTEGER; f: PROCEDURE (value: INTEGER); value: INTEGER);
   PROCEDURE MenuStateFunc* ['glutMenuStateFunc'] (f: PROCEDURE (status: INTEGER));
   PROCEDURE SpecialFunc* ['glutSpecialFunc'] (f: PROCEDURE (key, x, y: INTEGER));
   PROCEDURE SpaceballMotionFunc* ['glutSpaceballMotionFunc'] (f: PROCEDURE (x, y, z: INTEGER));
   PROCEDURE SpaceballRotateFunc* ['glutSpaceballRotateFunc'] (f: PROCEDURE (x, y, z: INTEGER));
   PROCEDURE SpaceballButtonFunc* ['glutSpaceballButtonFunc'] (f: PROCEDURE (button, state: INTEGER));
   PROCEDURE ButtonBoxFunc* ['glutButtonBoxFunc'] (f: PROCEDURE (button, state: INTEGER));
   PROCEDURE DialsFunc* ['glutDialsFunc'] (f: PROCEDURE (dial, value: INTEGER));
   PROCEDURE TabletMotionFunc* ['glutTabletMotionFunc'] (f: PROCEDURE (x, y: INTEGER));
   PROCEDURE TabletButtonFunc* ['glutTabletButtonFunc'] (f: PROCEDURE (button, state, x, y: INTEGER));
   PROCEDURE MenuStatusFunc* ['glutMenuStatusFunc'] (f: PROCEDURE (status, x, y: INTEGER));
   PROCEDURE OverlayDisplayFunc* ['glutOverlayDisplayFunc'] (f: PROCEDURE);
   PROCEDURE WindowStatusFunc* ['glutWindowStatusFunc'] (f: PROCEDURE (state: INTEGER));
   
   (* GLUT color index sub-API *)
   PROCEDURE SetColor* ['glutSetColor'] (cell: INTEGER; red, green, blue: GL.Float);
   PROCEDURE GetColor* ['glutGetColor'] (cell, component: INTEGER): GL.Float;
   PROCEDURE CopyColormap* ['glutCopyColormap'] (win: INTEGER);
   
   (* GLUT retrieval sub-API *)
   PROCEDURE Get* ['glutGet'] (state: GL.Enum): INTEGER;
   PROCEDURE DeviceGet* ['glutDeviceGet'] (info: GL.Enum): INTEGER;
   PROCEDURE ExtensionSupported* ['glutExtensionSupported'] (extension: PtrSTR): INTEGER;
   PROCEDURE GetModifiers* ['glutGetModifiers'] (): SET;
   PROCEDURE LayerGet* ['glutLayerGet'] (info: GL.Enum): INTEGER;
   
   (* GLUT font sub-API *)
   PROCEDURE BitmapCharacter* ['glutBitmapCharacter'] (font: Address; character: INTEGER);
   PROCEDURE BitmapWidth* ['glutBitmapWidth'] (font: Address; character: INTEGER): INTEGER;
   PROCEDURE StrokeCharacter* ['glutStrokeCharacter'] (font: Address; character: INTEGER);
   PROCEDURE StrokeWidth* ['glutStrokeWidth'] (font: Address; character: INTEGER): INTEGER;
   PROCEDURE BitmapLength* ['glutBitmapLength'] (font: Address; string: PtrSTR): INTEGER;
   PROCEDURE StrokeLength* ['glutStrokeLength'] (font: Address; string: PtrSTR): INTEGER;
   
   (* GLUT pre-build models sub-API *)
   PROCEDURE WireSphere* ['glutWireSphere'] (radius: GL.Double; slices, stacks: GL.Int);
   PROCEDURE SolidSphere* ['glutSolidSphere'] (radius: GL.Double; slices, stacks: GL.Int);
   PROCEDURE WireCone* ['glutWireCone'] (base, height: GL.Double; slices, stacks: GL.Int);
   PROCEDURE SolidCone* ['glutSolidCone'] (base, height: GL.Double; slices, stacks: GL.Int);
   PROCEDURE WireCube* ['glutWireCube'] (sizet: GL.Double);
   PROCEDURE SolidCube* ['glutSolidCube'] (size: GL.Double);
   PROCEDURE WireTorus* ['glutWireTorus'] (innerRadius, outerRadius: GL.Double; sides, rings: GL.Int);
   PROCEDURE SolidTorus* ['glutSolidTorus'] (innerRadius, outerRadius: GL.Double; sides, rings: GL.Int);
   PROCEDURE WireDodecahedron* ['glutWireDodecahedron'];
   PROCEDURE SolidDodecahedron* ['glutSolidDodecahedron'];
   PROCEDURE WireTeapot* ['glutWireTeapot'] (sizet: GL.Double);
   PROCEDURE SolidTeapot* ['glutSolidTeapot'] (size: GL.Double);
   PROCEDURE WireOctahedron* ['glutWireOctahedron'];
   PROCEDURE SolidOctahedron* ['glutSolidOctahedron'];
   PROCEDURE WireTetrahedron* ['glutWireTetrahedron'];
   PROCEDURE SolidTetrahedron* ['glutSolidTetrahedron'];
   PROCEDURE WireIcosahedron* ['glutWireIcosahedron'];
   PROCEDURE SolidIcosahedron* ['glutSolidIcosahedron'];
   
   (* GLUT video resize sub-API *)
   PROCEDURE VideoResizeGet* ['glutVideoResizeGet'] (param: GL.Enum);
   PROCEDURE SetupVideoResizing* ['glutSetupVideoResizing'];
   PROCEDURE StopVideoResizing* ['glutStopVideoResizing'];
   PROCEDURE VideoResize* ['glutVideoResize'] (x, y, width, height: INTEGER);
   PROCEDURE VideoPan* ['glutVideoPan'] (x, y, width, height: INTEGER);

   (* GLUT debugging sub-API *)
   PROCEDURE ReportErrors* ['glutReportErrors'];

END OglGLUT.

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

Илья, то есть, как я понял, OpenGL-окно создаётся средствами GLUT и получается аппаратное ускорение?

Автор:  Илья Ермаков [ Понедельник, 14 Январь, 2008 14:36 ]
Заголовок сообщения:  Re: Работа с OpenGL

Насколько я понял, зависит от режима, в котором создано окно.
Но то, что GLUT может использоваться в полноэкранном "аппаратном" режиме - это точно.
Тот движок, про который мы говорили, использует для создания окна именно GLUT (от ручного WinApi окна он в конце концов отказался. Да и кросслатформенность это есть гут). Собственно, мы с Темиргалеевым и написали этот пример и перевели заголовок, дабы "сподвигнуть" человека...

Автор:  prokopiy [ Вторник, 15 Январь, 2008 17:39 ]
Заголовок сообщения:  Re: Работа с OpenGL

Попробовал выше приведённый пример с использованием GLUT, не могу понять почему при изменении размеров окна оно исчезает?

Автор:  Илья Ермаков [ Вторник, 15 Январь, 2008 18:53 ]
Заголовок сообщения:  Re: Работа с OpenGL

Странно... Ничего похожего не наблюдается. Может быть, старая версия ГЛУТа?

Автор:  prokopiy [ Вторник, 15 Январь, 2008 19:00 ]
Заголовок сообщения:  Re: Работа с OpenGL

Илья Ермаков писал(а):
Странно... Ничего похожего не наблюдается. Может быть, старая версия ГЛУТа?


Использовал BB 1.6rc5, glut-3.7.6 скачал с opengl.org

Автор:  Илья Ермаков [ Вторник, 15 Январь, 2008 19:46 ]
Заголовок сообщения:  Re: Работа с OpenGL

Тогда не знаю... Мы на BB 1.5 работаем, но это вроде бы влиять не должно :-)

Автор:  serge [ Среда, 16 Январь, 2008 09:07 ]
Заголовок сообщения:  Re: Работа с OpenGL

prokopiy писал(а):
Попробовал выше приведённый пример с использованием GLUT, не могу понять почему при изменении размеров окна оно исчезает?

А Вы случаем [ccall] из описания процедур не удаляли? У меня под 1.6 вообще не компилировался из за несоответствия типов. Для это примера достаточно поправить в OglGLUT:
...
(* GLUT sub-API *)
PROCEDURE DisplayFunc* ['glutDisplayFunc'] (f: PROCEDURE [ccall]);
PROCEDURE ReshapeFunc* ['glutReshapeFunc'] (f: PROCEDURE [ccall] (width, height: INTEGER));
PROCEDURE KeyboardFunc* ['glutKeyboardFunc'] (f: PROCEDURE [ccall] (key: SHORTCHAR; x, y: INTEGER));
...

Автор:  Илья Ермаков [ Среда, 16 Январь, 2008 09:51 ]
Заголовок сообщения:  Re: Работа с OpenGL

О как, в 1.6 швяйцарцы поправили компилятор!

Автор:  prokopiy [ Среда, 16 Январь, 2008 13:07 ]
Заголовок сообщения:  Re: Работа с OpenGL

serge писал(а):
prokopiy писал(а):
Попробовал выше приведённый пример с использованием GLUT, не могу понять почему при изменении размеров окна оно исчезает?

А Вы случаем [ccall] из описания процедур не удаляли? У меня под 1.6 вообще не компилировался из за несоответствия типов. Для это примера достаточно поправить в OglGLUT:
...
(* GLUT sub-API *)
PROCEDURE DisplayFunc* ['glutDisplayFunc'] (f: PROCEDURE [ccall]);
PROCEDURE ReshapeFunc* ['glutReshapeFunc'] (f: PROCEDURE [ccall] (width, height: INTEGER));
PROCEDURE KeyboardFunc* ['glutKeyboardFunc'] (f: PROCEDURE [ccall] (key: SHORTCHAR; x, y: INTEGER));
...



Удалял, было дело...

Автор:  Евгений Темиргалеев [ Четверг, 19 Июнь, 2008 20:36 ]
Заголовок сообщения:  Re: Работа с OpenGL

prokopiy писал(а):
Предлагаю обсудить изпользование OpenGL в BlackBox.

Кстати, если кто не в курсе, у Зина подсистема Ogl - там прилада, чтобы во вьюшках рисовать и куча примеров.
OglGlut - как дополнение - вышеуказанный заголовок для glut.dll, доведенный до ума, и перевод на русский документации Ogl.

Автор:  Rafi [ Воскресенье, 03 Август, 2008 00:11 ]
Заголовок сообщения:  Re: Работа с OpenGL

Скажите, а как можно загрузить BMP-файл для использования его в качестве текстуры?

Автор:  Valery Solovey [ Воскресенье, 03 Август, 2008 10:01 ]
Заголовок сообщения:  Re: Работа с OpenGL

Rafi писал(а):
Скажите, а как можно загрузить BMP-файл для использования его в качестве текстуры?
Для какого элемента управления или для чего вообще? Есть подозрение, что Вы попали не туда : ).

Автор:  Rafi [ Воскресенье, 03 Август, 2008 11:18 ]
Заголовок сообщения:  Re: Работа с OpenGL

Цитата:
Для какого элемента управления или для чего вообще?

Для того, чтобы использовать его в качестве параметра ф-ции GL.TexImage2D().
Я пробовал загружать BMP с помощью модуля ViBmp, но вот что с ним делать далее, не соображу.

Автор:  Алексей_В [ Пятница, 12 Декабрь, 2008 21:49 ]
Заголовок сообщения:  Re: Работа с OpenGL

Приветствую!
Подскажите пожалуста...
Поставил в BlackBox пакеты Ogl и OglGlut. Все работает замечательно. Одного не могу понять - как у Евгения, автора OglGlut получается так просто и изящно получить исполняемый файл. Например в OglGLUTColors. С установкой версии ядра итп разобрался - все работает. Поражает краткость строки линкера - DevLinker.LinkExe OglGLUTColors.exe := National Kernel+ OglGLUTLib OglGLUTColors.
Не пойму - где перечисление кучи модулей, которые наверняка импортруются?
Пробовал сделать исполняемый файл из OglColors. Полуэмпирически пришел к строке вида:
"DevLinker.LinkExe test1.exe := National Kernel+ Log Files HostFiles Dialog Math Strings HostRegistry Fonts HostFonts Dialog Math Strings Ports Services HostPorts Stores Meta Converters Sequencers Models Views OglContexts Controllers Properties Mechanisms Containers TextModels TextMappers Dates Printers Printing TextRulers TextSetters TextViews Documents Windows OleData HostMechanisms HostWindows HostPrinters StdDialog StdApi StdCmds StdCFrames HostCFrames HostDialog TextControllers StdLog Out OglLib OglContexts OglColors"
Файл получается, но не работает, пишет (см. рисунок)
В чем тут дело?

Вложения:
trap.JPG
trap.JPG [ 21.36 КБ | Просмотров: 19532 ]

Автор:  Алексей_В [ Пятница, 12 Декабрь, 2008 22:11 ]
Заголовок сообщения:  Re: Работа с OpenGL

Хм. Нашел в документации:

"Ограничения по использованию

Поскольку библиотека GLUT обеспечивает свой интерфейс управления окнами и управляет главным циклом обработки сообщений приложения, её использование ограничивается созданием автономных выполняемых файлов. Иными словами - средства GLUT не приспособлены для использования совместно с каркасом BlackBox.

Для использования графики OpenGL совместно с каркасом BlackBox - используйте средства модуля OglContext."
Опять вопросы...

1. Что значит "не приспособлены для использования совместно с каркасом BlackBox" ?
Что такое каркас и что например нельзя использовать из возможностей, предоставляемых им?
2. Можно ли получить автономный файл того же OglGLUTColors например? Без среды?

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

Под каркасом имеется в виду BlackBox FrameWork. Каркас занимается обработкой ввода и выводом. GLUT занимается тем же, поэтому "внутри" каркаса его не попользуешь.

Автор:  Алексей_В [ Пятница, 12 Декабрь, 2008 22:57 ]
Заголовок сообщения:  Re: Работа с OpenGL

Ага, примерно понятно... спасибо.

Но - можно ли реализовать в этом графическом приложении с Glut например меню, типа как в играх, под мышь, и чтоб приложение написанное на BlackBox реагировало на него?
В принципе? Детали мне сейчас не важны... все равно еще разбираться и разбираться...

И например, если бы Вы собрались написать несложную игру или 3D редактор под Glut
чего именно не хватало бы из фреймворка? Так ли это серьезно, или этот функционал можно обеспечить и самому... Так на примере мне проще понять... Подскажите, пожалуста.

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