1 (изменено: Freeman, 05.12.2020 в 18:34)

Тема: TinyGL(подмножество OpenGL)

В KolibriOS существует порт библиотеки TinyGL, она была переписана на ассемблере
Есть тема на форуме KolibriOS.
Я решил использовать эту библиотеку на Delphi.
В качестве примера вот такой вращающийся куб:

misc.php?action=pun_attachment&item=52&download=0

Модуль TinyGL для KolibriOS
(*
    KolibriOS TinyGL unit
*)

unit TinyGL;

interface

type
  GLEnum     = LongWord;
  GLBoolean  = ByteBool;
  GLBitfield = LongWord;
  GLByte     = Shortint;
  GLShort    = SmallInt;
  GLInt      = LongInt;
  GLSizei    = LongInt;
  GLUByte    = Byte;
  GLUShort   = Word;
  GLUInt     = LongWord;
  GLFloat    = Single;
  GLClampf   = Single;
  GLDouble   = Double;
  GLClampd   = Double;
  GLVoid     = Pointer;

  PGLBoolean = ^GLBoolean;
  PGLByte    = ^GLByte;
  PGLShort   = ^GLShort;
  PGLInt     = ^GLInt;
  PGLSizei   = ^GLSizei;
  PGLUByte   = ^GLUByte;
  PGLUShort  = ^GLUShort;
  PGLUInt    = ^GLUInt;
  PGLClampf  = ^GLClampf;
  PGLFloat   = ^GLFloat;
  PGLDouble  = ^GLDouble;
  PGLClampd  = ^GLClampd;
  PGLVoid    = ^GLVoid;

  TGLArrayi4 = array [0..3] of GLInt;
  TGLArrayf3 = array [0..2] of GLFloat;
  TGLArrayf4 = array [0..3] of GLFloat;

  _GLUquadricObj = record end;
  GLUquadricObj = ^_GLUquadricObj;

  TKOSGLContext = packed record
    GLContext: Pointer;
    XSize, YSize: LongWord;
    DX, DY, X, Y: LongInt;
  end;

const
// Error Code
  GL_NO_ERROR          = 0;
  GL_INVALID_ENUM      = $0500;
  GL_INVALID_VALUE     = $0501;
  GL_INVALID_OPERATION = $0502;
  GL_STACK_OVERFLOW    = $0503;
  GL_STACK_UNDERFLOW   = $0504;
  GL_OUT_OF_MEMORY     = $0505;

// Attribute Mask
  GL_CURRENT_BIT         = $00000001;
  GL_POINT_BIT           = $00000002;
  GL_LINE_BIT            = $00000004;
  GL_POLYGON_BIT         = $00000008;
  GL_POLYGON_STIPPLE_BIT = $00000010;
  GL_PIXEL_MODE_BIT      = $00000020;
  GL_LIGHTING_BIT        = $00000040;
  GL_FOG_BIT             = $00000080;
  GL_DEPTH_BUFFER_BIT    = $00000100;
  GL_ACCUM_BUFFER_BIT    = $00000200;
  GL_STENCIL_BUFFER_BIT  = $00000400;
  GL_VIEWPORT_BIT        = $00000800;
  GL_TRANSFORM_BIT       = $00001000;
  GL_ENABLE_BIT          = $00002000;
  GL_COLOR_BUFFER_BIT    = $00004000;
  GL_HINT_BIT            = $00008000;
  GL_EVAL_BIT            = $00010000;
  GL_LIST_BIT            = $00020000;
  GL_TEXTURE_BIT         = $00040000;
  GL_SCISSOR_BIT         = $00080000;
  GL_ALL_ATTRIB_BITS     = $000fffff;

// Boolean
  GL_FALSE = Boolean(0);
  GL_TRUE  = Boolean(1);

// Begin Mode
  GL_POINTS         = $0000;
  GL_LINES          = $0001;
  GL_LINE_LOOP      = $0002;
  GL_LINE_STRIP     = $0003;
  GL_TRIANGLES      = $0004;
  GL_TRIANGLE_STRIP = $0005;
  GL_TRIANGLE_FAN   = $0006;
  GL_QUADS          = $0007;
  GL_QUAD_STRIP     = $0008;
  GL_POLYGON        = $0009;

// Accum Op
  GL_ACCUM  = $0100;
  GL_LOAD   = $0101;
  GL_RETURN = $0102;
  GL_MULT   = $0103;
  GL_ADD    = $0104;

// Alpha Function
  GL_NEVER    = $0200;
  GL_LESS     = $0201;
  GL_EQUAL    = $0202;
  GL_LEQUAL   = $0203;
  GL_GREATER  = $0204;
  GL_NOTEQUAL = $0205;
  GL_GEQUAL   = $0206;
  GL_ALWAYS   = $0207;

// Blending Factor Dst
  GL_ZERO                = 0;
  GL_ONE                 = 1;
  GL_SRC_COLOR           = $0300;
  GL_ONE_MINUS_SRC_COLOR = $0301;
  GL_SRC_ALPHA           = $0302;
  GL_ONE_MINUS_SRC_ALPHA = $0303;
  GL_DST_ALPHA           = $0304;
  GL_ONE_MINUS_DST_ALPHA = $0305;

// Blending Factor Src
  GL_DST_COLOR           = $0306;
  GL_ONE_MINUS_DST_COLOR = $0307;
  GL_SRC_ALPHA_SATURATE  = $0308;

// Draw Buffer Mode
  GL_NONE           = 0;
  GL_FRONT_LEFT     = $0400;
  GL_FRONT_RIGHT    = $0401;
  GL_BACK_LEFT      = $0402;
  GL_BACK_RIGHT     = $0403;
  GL_FRONT          = $0404;
  GL_BACK           = $0405;
  GL_LEFT           = $0406;
  GL_RIGHT          = $0407;
  GL_FRONT_AND_BACK = $0408;
  GL_AUX0           = $0409;
  GL_AUX1           = $040A;
  GL_AUX2           = $040B;
  GL_AUX3           = $040C;

// Feed Back Mode
  GL_2D               = $0600;
  GL_3D               = $0601;
  GL_3D_COLOR         = $0602;
  GL_3D_COLOR_TEXTURE = $0603;
  GL_4D_COLOR_TEXTURE = $0604;

// Feed Back Token
  GL_PASS_THROUGH_TOKEN = $0700;
  GL_POINT_TOKEN        = $0701;
  GL_LINE_TOKEN         = $0702;
  GL_POLYGON_TOKEN      = $0703;
  GL_BITMAP_TOKEN       = $0704;
  GL_DRAW_PIXEL_TOKEN   = $0705;
  GL_COPY_PIXEL_TOKEN   = $0706;
  GL_LINE_RESET_TOKEN   = $0707;

// Fog Mode
  GL_EXP  = $0800;
  GL_EXP2 = $0801;

// Front Face Direction
  GL_CW  = $0900;
  GL_CCW = $0901;

// Get Map Target
  GL_COEFF  = $0A00;
  GL_ORDER  = $0A01;
  GL_DOMAIN = $0A02;

// Get Pixel Map
  GL_PIXEL_MAP_I_TO_I = $0C70;
  GL_PIXEL_MAP_S_TO_S = $0C71;
  GL_PIXEL_MAP_I_TO_R = $0C72;
  GL_PIXEL_MAP_I_TO_G = $0C73;
  GL_PIXEL_MAP_I_TO_B = $0C74;
  GL_PIXEL_MAP_I_TO_A = $0C75;
  GL_PIXEL_MAP_R_TO_R = $0C76;
  GL_PIXEL_MAP_G_TO_G = $0C77;
  GL_PIXEL_MAP_B_TO_B = $0C78;
  GL_PIXEL_MAP_A_TO_A = $0C79;

// Get Target
  GL_CURRENT_COLOR                  = $0B00;
  GL_CURRENT_INDEX                  = $0B01;
  GL_CURRENT_NORMAL                 = $0B02;
  GL_CURRENT_TEXTURE_COORDS         = $0B03;
  GL_CURRENT_RASTER_COLOR           = $0B04;
  GL_CURRENT_RASTER_INDEX           = $0B05;
  GL_CURRENT_RASTER_TEXTURE_COORDS  = $0B06;
  GL_CURRENT_RASTER_POSITION        = $0B07;
  GL_CURRENT_RASTER_POSITION_VALID  = $0B08;
  GL_CURRENT_RASTER_DISTANCE        = $0B09;
  GL_POINT_SMOOTH                   = $0B10;
  GL_POINT_SIZE                     = $0B11;
  GL_POINT_SIZE_RANGE               = $0B12;
  GL_POINT_SIZE_GRANULARITY         = $0B13;
  GL_LINE_SMOOTH                    = $0B20;
  GL_LINE_WIDTH                     = $0B21;
  GL_LINE_WIDTH_RANGE               = $0B22;
  GL_LINE_WIDTH_GRANULARITY         = $0B23;
  GL_LINE_STIPPLE                   = $0B24;
  GL_LINE_STIPPLE_PATTERN           = $0B25;
  GL_LINE_STIPPLE_REPEAT            = $0B26;
  GL_LIST_MODE                      = $0B30;
  GL_MAX_LIST_NESTING               = $0B31;
  GL_LIST_BASE                      = $0B32;
  GL_LIST_INDEX                     = $0B33;
  GL_POLYGON_MODE                   = $0B40;
  GL_POLYGON_SMOOTH                 = $0B41;
  GL_POLYGON_STIPPLE                = $0B42;
  GL_EDGE_FLAG                      = $0B43;
  GL_CULL_FACE                      = $0B44;
  GL_CULL_FACE_MODE                 = $0B45;
  GL_FRONT_FACE                     = $0B46;
  GL_LIGHTING                       = $0B50;
  GL_LIGHT_MODEL_LOCAL_VIEWER       = $0B51;
  GL_LIGHT_MODEL_TWO_SIDE           = $0B52;
  GL_LIGHT_MODEL_AMBIENT            = $0B53;
  GL_SHADE_MODEL                    = $0B54;
  GL_COLOR_MATERIAL_FACE            = $0B55;
  GL_COLOR_MATERIAL_PARAMETER       = $0B56;
  GL_COLOR_MATERIAL                 = $0B57;
  GL_FOG                            = $0B60;
  GL_FOG_INDEX                      = $0B61;
  GL_FOG_DENSITY                    = $0B62;
  GL_FOG_START                      = $0B63;
  GL_FOG_END                        = $0B64;
  GL_FOG_MODE                       = $0B65;
  GL_FOG_COLOR                      = $0B66;
  GL_DEPTH_RANGE                    = $0B70;
  GL_DEPTH_TEST                     = $0B71;
  GL_DEPTH_WRITEMASK                = $0B72;
  GL_DEPTH_CLEAR_VALUE              = $0B73;
  GL_DEPTH_FUNC                     = $0B74;
  GL_ACCUM_CLEAR_VALUE              = $0B80;
  GL_STENCIL_TEST                   = $0B90;
  GL_STENCIL_CLEAR_VALUE            = $0B91;
  GL_STENCIL_FUNC                   = $0B92;
  GL_STENCIL_VALUE_MASK             = $0B93;
  GL_STENCIL_FAIL                   = $0B94;
  GL_STENCIL_PASS_DEPTH_FAIL        = $0B95;
  GL_STENCIL_PASS_DEPTH_PASS        = $0B96;
  GL_STENCIL_REF                    = $0B97;
  GL_STENCIL_WRITEMASK              = $0B98;
  GL_MATRIX_MODE                    = $0BA0;
  GL_NORMALIZE                      = $0BA1;
  GL_VIEWPORT                       = $0BA2;
  GL_MODELVIEW_STACK_DEPTH          = $0BA3;
  GL_PROJECTION_STACK_DEPTH         = $0BA4;
  GL_TEXTURE_STACK_DEPTH            = $0BA5;
  GL_MODELVIEW_MATRIX               = $0BA6;
  GL_PROJECTION_MATRIX              = $0BA7;
  GL_TEXTURE_MATRIX                 = $0BA8;
  GL_ATTRIB_STACK_DEPTH             = $0BB0;
  GL_ALPHA_TEST                     = $0BC0;
  GL_ALPHA_TEST_FUNC                = $0BC1;
  GL_ALPHA_TEST_REF                 = $0BC2;
  GL_DITHER                         = $0BD0;
  GL_BLEND_DST                      = $0BE0;
  GL_BLEND_SRC                      = $0BE1;
  GL_BLEND                          = $0BE2;
  GL_LOGIC_OP_MODE                  = $0BF0;
  GL_LOGIC_OP                       = $0BF1;
  GL_AUX_BUFFERS                    = $0C00;
  GL_DRAW_BUFFER                    = $0C01;
  GL_READ_BUFFER                    = $0C02;
  GL_SCISSOR_BOX                    = $0C10;
  GL_SCISSOR_TEST                   = $0C11;
  GL_INDEX_CLEAR_VALUE              = $0C20;
  GL_INDEX_WRITEMASK                = $0C21;
  GL_COLOR_CLEAR_VALUE              = $0C22;
  GL_COLOR_WRITEMASK                = $0C23;
  GL_INDEX_MODE                     = $0C30;
  GL_RGBA_MODE                      = $0C31;
  GL_DOUBLEBUFFER                   = $0C32;
  GL_STEREO                         = $0C33;
  GL_RENDER_MODE                    = $0C40;
  GL_PERSPECTIVE_CORRECTION_HINT    = $0C50;
  GL_POINT_SMOOTH_HINT              = $0C51;
  GL_LINE_SMOOTH_HINT               = $0C52;
  GL_POLYGON_SMOOTH_HINT            = $0C53;
  GL_FOG_HINT                       = $0C54;
  GL_TEXTURE_GEN_S                  = $0C60;
  GL_TEXTURE_GEN_T                  = $0C61;
  GL_TEXTURE_GEN_R                  = $0C62;
  GL_TEXTURE_GEN_Q                  = $0C63;
  GL_PIXEL_MAP_I_TO_I_SIZE          = $0CB0;
  GL_PIXEL_MAP_S_TO_S_SIZE          = $0CB1;
  GL_PIXEL_MAP_I_TO_R_SIZE          = $0CB2;
  GL_PIXEL_MAP_I_TO_G_SIZE          = $0CB3;
  GL_PIXEL_MAP_I_TO_B_SIZE          = $0CB4;
  GL_PIXEL_MAP_I_TO_A_SIZE          = $0CB5;
  GL_PIXEL_MAP_R_TO_R_SIZE          = $0CB6;
  GL_PIXEL_MAP_G_TO_G_SIZE          = $0CB7;
  GL_PIXEL_MAP_B_TO_B_SIZE          = $0CB8;
  GL_PIXEL_MAP_A_TO_A_SIZE          = $0CB9;
  GL_UNPACK_SWAP_BYTES              = $0CF0;
  GL_UNPACK_LSB_FIRST               = $0CF1;
  GL_UNPACK_ROW_LENGTH              = $0CF2;
  GL_UNPACK_SKIP_ROWS               = $0CF3;
  GL_UNPACK_SKIP_PIXELS             = $0CF4;
  GL_UNPACK_ALIGNMENT               = $0CF5;
  GL_PACK_SWAP_BYTES                = $0D00;
  GL_PACK_LSB_FIRST                 = $0D01;
  GL_PACK_ROW_LENGTH                = $0D02;
  GL_PACK_SKIP_ROWS                 = $0D03;
  GL_PACK_SKIP_PIXELS               = $0D04;
  GL_PACK_ALIGNMENT                 = $0D05;
  GL_MAP_COLOR                      = $0D10;
  GL_MAP_STENCIL                    = $0D11;
  GL_INDEX_SHIFT                    = $0D12;
  GL_INDEX_OFFSET                   = $0D13;
  GL_RED_SCALE                      = $0D14;
  GL_RED_BIAS                       = $0D15;
  GL_ZOOM_X                         = $0D16;
  GL_ZOOM_Y                         = $0D17;
  GL_GREEN_SCALE                    = $0D18;
  GL_GREEN_BIAS                     = $0D19;
  GL_BLUE_SCALE                     = $0D1A;
  GL_BLUE_BIAS                      = $0D1B;
  GL_ALPHA_SCALE                    = $0D1C;
  GL_ALPHA_BIAS                     = $0D1D;
  GL_DEPTH_SCALE                    = $0D1E;
  GL_DEPTH_BIAS                     = $0D1F;
  GL_MAX_EVAL_ORDER                 = $0D30;
  GL_MAX_LIGHTS                     = $0D31;
  GL_MAX_CLIP_PLANES                = $0D32;
  GL_MAX_TEXTURE_SIZE               = $0D33;
  GL_MAX_PIXEL_MAP_TABLE            = $0D34;
  GL_MAX_ATTRIB_STACK_DEPTH         = $0D35;
  GL_MAX_MODELVIEW_STACK_DEPTH      = $0D36;
  GL_MAX_NAME_STACK_DEPTH           = $0D37;
  GL_MAX_PROJECTION_STACK_DEPTH     = $0D38;
  GL_MAX_TEXTURE_STACK_DEPTH        = $0D39;
  GL_MAX_VIEWPORT_DIMS              = $0D3A;
  GL_SUBPIXEL_BITS                  = $0D50;
  GL_INDEX_BITS                     = $0D51;
  GL_RED_BITS                       = $0D52;
  GL_GREEN_BITS                     = $0D53;
  GL_BLUE_BITS                      = $0D54;
  GL_ALPHA_BITS                     = $0D55;
  GL_DEPTH_BITS                     = $0D56;
  GL_STENCIL_BITS                   = $0D57;
  GL_ACCUM_RED_BITS                 = $0D58;
  GL_ACCUM_GREEN_BITS               = $0D59;
  GL_ACCUM_BLUE_BITS                = $0D5A;
  GL_ACCUM_ALPHA_BITS               = $0D5B;
  GL_NAME_STACK_DEPTH               = $0D70;
  GL_AUTO_NORMAL                    = $0D80;
  GL_MAP1_COLOR_4                   = $0D90;
  GL_MAP1_INDEX                     = $0D91;
  GL_MAP1_NORMAL                    = $0D92;
  GL_MAP1_TEXTURE_COORD_1           = $0D93;
  GL_MAP1_TEXTURE_COORD_2           = $0D94;
  GL_MAP1_TEXTURE_COORD_3           = $0D95;
  GL_MAP1_TEXTURE_COORD_4           = $0D96;
  GL_MAP1_VERTEX_3                  = $0D97;
  GL_MAP1_VERTEX_4                  = $0D98;
  GL_MAP2_COLOR_4                   = $0DB0;
  GL_MAP2_INDEX                     = $0DB1;
  GL_MAP2_NORMAL                    = $0DB2;
  GL_MAP2_TEXTURE_COORD_1           = $0DB3;
  GL_MAP2_TEXTURE_COORD_2           = $0DB4;
  GL_MAP2_TEXTURE_COORD_3           = $0DB5;
  GL_MAP2_TEXTURE_COORD_4           = $0DB6;
  GL_MAP2_VERTEX_3                  = $0DB7;
  GL_MAP2_VERTEX_4                  = $0DB8;
  GL_MAP1_GRID_DOMAIN               = $0DD0;
  GL_MAP1_GRID_SEGMENTS             = $0DD1;
  GL_MAP2_GRID_DOMAIN               = $0DD2;
  GL_MAP2_GRID_SEGMENTS             = $0DD3;
  GL_TEXTURE_1D                     = $0DE0;
  GL_TEXTURE_2D                     = $0DE1;
  GL_TEXTURE_WIDTH                  = $1000;
  GL_TEXTURE_HEIGHT                 = $1001;
  GL_TEXTURE_COMPONENTS             = $1003;
  GL_TEXTURE_BORDER_COLOR           = $1004;
  GL_TEXTURE_BORDER                 = $1005;

// Hint Mode
  GL_DONT_CARE = $1100;
  GL_FASTEST   = $1101;
  GL_NICEST    = $1102;

// Light Parameter
  GL_AMBIENT               = $1200;
  GL_DIFFUSE               = $1201;
  GL_SPECULAR              = $1202;
  GL_POSITION              = $1203;
  GL_SPOT_DIRECTION        = $1204;
  GL_SPOT_EXPONENT         = $1205;
  GL_SPOT_CUTOFF           = $1206;
  GL_CONSTANT_ATTENUATION  = $1207;
  GL_LINEAR_ATTENUATION    = $1208;
  GL_QUADRATIC_ATTENUATION = $1209;

// List Mode
  GL_COMPILE             = $1300;
  GL_COMPILE_AND_EXECUTE = $1301;

// List Name Type
  GL_BYTE           = $1400;
  GL_UNSIGNED_BYTE  = $1401;
  GL_SHORT          = $1402;
  GL_UNSIGNED_SHORT = $1403;
  GL_INT            = $1404;
  GL_UNSIGNED_INT   = $1405;
  GL_FLOAT          = $1406;
  GL_2_BYTES        = $1407;
  GL_3_BYTES        = $1408;
  GL_4_BYTES        = $1409;

// Logic Op
  GL_CLEAR         = $1500;
  GL_AND           = $1501;
  GL_AND_REVERSE   = $1502;
  GL_COPY          = $1503;
  GL_AND_INVERTED  = $1504;
  GL_NOOP          = $1505;
  GL_XOR           = $1506;
  GL_OR            = $1507;
  GL_NOR           = $1508;
  GL_EQUIV         = $1509;
  GL_INVERT        = $150A;
  GL_OR_REVERSE    = $150B;
  GL_COPY_INVERTED = $150C;
  GL_OR_INVERTED   = $150D;
  GL_NAND          = $150E;
  GL_SET           = $150F;

// Material Parameter
  GL_EMISSION            = $1600;
  GL_SHININESS           = $1601;
  GL_AMBIENT_AND_DIFFUSE = $1602;
  GL_COLOR_INDEXES       = $1603;

// Matrix Mode
  GL_MODELVIEW  = $1700;
  GL_PROJECTION = $1701;
  GL_TEXTURE    = $1702;

// Pixel Copy Type
  GL_COLOR   = $1800;
  GL_DEPTH   = $1801;
  GL_STENCIL = $1802;

// Pixel Format
  GL_COLOR_INDEX     = $1900;
  GL_STENCIL_INDEX   = $1901;
  GL_DEPTH_COMPONENT = $1902;
  GL_RED             = $1903;
  GL_GREEN           = $1904;
  GL_BLUE            = $1905;
  GL_ALPHA           = $1906;
  GL_RGB             = $1907;
  GL_RGBA            = $1908;
  GL_LUMINANCE       = $1909;
  GL_LUMINANCE_ALPHA = $190A;

// Pixel Type
  GL_BITMAP = $1A00;

// Polygon Mode
  GL_POINT = $1B00;
  GL_LINE  = $1B01;
  GL_FILL  = $1B02;

// Rendering Mode
  GL_RENDER   = $1C00;
  GL_FEEDBACK = $1C01;
  GL_SELECT   = $1C02;

// Shading Model
  GL_FLAT   = $1D00;
  GL_SMOOTH = $1D01;

// Stencil Op
  GL_KEEP    = $1E00;
  GL_REPLACE = $1E01;
  GL_INCR    = $1E02;
  GL_DECR    = $1E03;

// String Name
  GL_VENDOR     = $1F00;
  GL_RENDERER   = $1F01;
  GL_VERSION    = $1F02;
  GL_EXTENSIONS = $1F03;

// Texture Coord Name
  GL_S = $2000;
  GL_T = $2001;
  GL_R = $2002;
  GL_Q = $2003;

// Texture Env Mode
  GL_MODULATE = $2100;
  GL_DECAL    = $2101;

// Texture Env Parameter
  GL_TEXTURE_ENV_MODE  = $2200;
  GL_TEXTURE_ENV_COLOR = $2201;

// Texture Env Target
  GL_TEXTURE_ENV = $2300;

// Texture Gen Mode
  GL_EYE_LINEAR    = $2400;
  GL_OBJECT_LINEAR = $2401;
  GL_SPHERE_MAP    = $2402;

// Texture Gen Parameter
  GL_TEXTURE_GEN_MODE = $2500;
  GL_OBJECT_PLANE     = $2501;
  GL_EYE_PLANE        = $2502;

// Texture Mag Filter
  GL_NEAREST = $2600;
  GL_LINEAR  = $2601;

// Texture Min Filter
  GL_NEAREST_MIPMAP_NEAREST = $2700;
  GL_LINEAR_MIPMAP_NEAREST  = $2701;
  GL_NEAREST_MIPMAP_LINEAR  = $2702;
  GL_LINEAR_MIPMAP_LINEAR   = $2703;

// Texture Parameter Name
  GL_TEXTURE_MAG_FILTER = $2800;
  GL_TEXTURE_MIN_FILTER = $2801;
  GL_TEXTURE_WRAP_S     = $2802;
  GL_TEXTURE_WRAP_T     = $2803;

// Texture Wrap Mode
  GL_CLAMP  = $2900;
  GL_REPEAT = $2901;

// Clip Plane Name
  GL_CLIP_PLANE0 = $3000;
  GL_CLIP_PLANE1 = $3001;
  GL_CLIP_PLANE2 = $3002;
  GL_CLIP_PLANE3 = $3003;
  GL_CLIP_PLANE4 = $3004;
  GL_CLIP_PLANE5 = $3005;

// Light Name
  GL_LIGHT0 = $4000;
  GL_LIGHT1 = $4001;
  GL_LIGHT2 = $4002;
  GL_LIGHT3 = $4003;
  GL_LIGHT4 = $4004;
  GL_LIGHT5 = $4005;
  GL_LIGHT6 = $4006;
  GL_LIGHT7 = $4007;

// Extensions
  GL_EXT_vertex_array = 1;
  GL_WIN_swap_hint    = 1;

// Ext Vertex Array
  GL_VERTEX_ARRAY_EXT                = $8074;
  GL_NORMAL_ARRAY_EXT                = $8075;
  GL_COLOR_ARRAY_EXT                 = $8076;
  GL_INDEX_ARRAY_EXT                 = $8077;
  GL_TEXTURE_COORD_ARRAY_EXT         = $8078;
  GL_EDGE_FLAG_ARRAY_EXT             = $8079;
  GL_VERTEX_ARRAY_SIZE_EXT           = $807A;
  GL_VERTEX_ARRAY_TYPE_EXT           = $807B;
  GL_VERTEX_ARRAY_STRIDE_EXT         = $807C;
  GL_VERTEX_ARRAY_COUNT_EXT          = $807D;
  GL_NORMAL_ARRAY_TYPE_EXT           = $807E;
  GL_NORMAL_ARRAY_STRIDE_EXT         = $807F;
  GL_NORMAL_ARRAY_COUNT_EXT          = $8080;
  GL_COLOR_ARRAY_SIZE_EXT            = $8081;
  GL_COLOR_ARRAY_TYPE_EXT            = $8082;
  GL_COLOR_ARRAY_STRIDE_EXT          = $8083;
  GL_COLOR_ARRAY_COUNT_EXT           = $8084;
  GL_INDEX_ARRAY_TYPE_EXT            = $8085;
  GL_INDEX_ARRAY_STRIDE_EXT          = $8086;
  GL_INDEX_ARRAY_COUNT_EXT           = $8087;
  GL_TEXTURE_COORD_ARRAY_SIZE_EXT    = $8088;
  GL_TEXTURE_COORD_ARRAY_TYPE_EXT    = $8089;
  GL_TEXTURE_COORD_ARRAY_STRIDE_EXT  = $808A;
  GL_TEXTURE_COORD_ARRAY_COUNT_EXT   = $808B;
  GL_EDGE_FLAG_ARRAY_STRIDE_EXT      = $808C;
  GL_EDGE_FLAG_ARRAY_COUNT_EXT       = $808D;
  GL_VERTEX_ARRAY_POINTER_EXT        = $808E;
  GL_NORMAL_ARRAY_POINTER_EXT        = $808F;
  GL_COLOR_ARRAY_POINTER_EXT         = $8090;
  GL_INDEX_ARRAY_POINTER_EXT         = $8091;
  GL_TEXTURE_COORD_ARRAY_POINTER_EXT = $8092;
  GL_EDGE_FLAG_ARRAY_POINTER_EXT     = $8093;

var
  kosglSwapBuffers:      procedure() stdcall;
  kosglMakeCurrent:      function(X, Y: LongInt; SizeX, SizeY: LongWord; var CTX: TKOSGLContext): LongInt stdcall;

  glEnable:              procedure(Cap: GLEnum) stdcall;
  glDisable:             procedure(Cap: GLEnum) stdcall;

  glShadeModel:          procedure(Mode: GLEnum) stdcall;
  glCullFace:            procedure(Mode: GLEnum) stdcall;
  glPolygonMode:         procedure(Face, Mode: GLEnum) stdcall;

  glBegin:               procedure(Mode: GLEnum) stdcall;
  glEnd:                 procedure() stdcall;

  glVertex2f:            procedure(X, Y: GLFloat) stdcall;
  glVertex2d:            procedure(X, Y: GLDouble) stdcall;
  glVertex2fv:           procedure(V: PGLFloat) stdcall;
  glVertex2dv:           procedure(V: PGLDouble) stdcall;
  glVertex3f:            procedure(X, Y, Z: GLFloat) stdcall;
  glVertex3d:            procedure(X, Y, Z: GLDouble) stdcall;
  glVertex3fv:           procedure(V: PGLFloat) stdcall;
  glVertex3dv:           procedure(V: PGLDouble) stdcall;
  glVertex4f:            procedure(X, Y, Z, W: GLFloat) stdcall;
  glVertex4d:            procedure(X, Y, Z, W: GLDouble) stdcall;
  glVertex4fv:           procedure(V: PGLFloat) stdcall;
  glVertex4dv:           procedure(V: PGLDouble) stdcall;

  glColor3f:             procedure(Red, Green, Blue: GLFloat) stdcall;
  glColor3d:             procedure(Red, Green, Blue: GLDouble) stdcall;
  glColor3fv:            procedure(V: PGLFloat) stdcall;
  glColor3dv:            procedure(V: PGLDouble) stdcall;
  glColor3ub:            procedure(Red, Green, Blue: GLUByte) stdcall;
  glColor4f:             procedure(Red, Green, Blue, Alpha: GLFloat) stdcall;
  glColor4d:             procedure(Red, Green, Blue, Alpha: GLDouble) stdcall;
  glColor4fv:            procedure(V: PGLFloat) stdcall;
  glColor4dv:            procedure(V: PGLDouble) stdcall;

  glNormal3f:            procedure(nX, nY, nZ: GLFloat) stdcall;
  glNormal3d:            procedure(nX, nY, nZ: GLDouble) stdcall;
  glNormal3fv:           procedure(V: PGLFloat) stdcall;
  glNormal3dv:           procedure(V: PGLDouble) stdcall;

  glTexCoord1f:          procedure(S: GLFloat) stdcall;
  glTexCoord1d:          procedure(S: GLDouble) stdcall;
  glTexCoord1fv:         procedure(V: PGLFloat) stdcall;
  glTexCoord1dv:         procedure(V: PGLDouble) stdcall;
  glTexCoord2f:          procedure(S, T: GLFloat) stdcall;
  glTexCoord2d:          procedure(S, T: GLDouble) stdcall;
  glTexCoord2fv:         procedure(V: PGLFloat) stdcall;
  glTexCoord2dv:         procedure(V: PGLDouble) stdcall;
  glTexCoord3f:          procedure(S, T, R: GLFloat) stdcall;
  glTexCoord3d:          procedure(S, T, R: GLDouble) stdcall;
  glTexCoord3fv:         procedure(V: PGLFloat) stdcall;
  glTexCoord3dv:         procedure(V: PGLDouble) stdcall;
  glTexCoord4f:          procedure(S, T, R, Q: GLFloat) stdcall;
  glTexCoord4d:          procedure(S, T, R, Q: GLDouble) stdcall;
  glTexCoord4fv:         procedure(V: PGLFloat) stdcall;
  glTexCoord4dv:         procedure(V: PGLDouble) stdcall;

  glEdgeFlag:            procedure(Flag: GLBoolean) stdcall;

  glMatrixMode:          procedure(Mode: GLEnum) stdcall;
  glLoadMatrixf:         procedure(M: PGLFloat) stdcall;
  glLoadIdentity:        procedure() stdcall;
  glMultMatrixf:         procedure(M: PGLFloat) stdcall;
  glPushMatrix:          procedure() stdcall;
  glPopMatrix:           procedure() stdcall;
  glRotatef:             procedure(Angle, X, Y, Z: GLFloat) stdcall;
  glTranslatef:          procedure(X, Y, Z: GLFloat) stdcall;
  glScalef:              procedure(X, Y, Z: GLFloat) stdcall;

  glViewport:            procedure(X, Y: GLInt; Width, Height: GLSizei) stdcall;
  glFrustum:             procedure(Left, Right, Bottom, Top, zNear, zFar: GLDouble) stdcall;

  glGenLists:            function(Range: GLSizei): GLUInt stdcall;
  glIsList:              function(List: GLUInt): GLBoolean stdcall;
  glNewList:             procedure(ListIndex: GLUInt; Mode: GLEnum) stdcall;
  glEndList:             procedure() stdcall;
  glCallList:            procedure(List: GLUInt) stdcall;

  glClear:               procedure(Mask: GLBitfield) stdcall;
  glClearColor:          procedure(Red, Green, Blue, Alpha: GLClampf) stdcall;
  glClearDepth:          procedure(Depth: GLClampd) stdcall;

  glRenderMode:          function(Mode: GLEnum): GLInt stdcall;
  glSelectBuffer:        procedure(Size: GLSizei; Buffer: PGLUInt) stdcall;

  glInitNames:           procedure() stdcall;
  glPushName:            procedure(Name: GLUInt) stdcall;
  glPopName:             procedure() stdcall;
  glLoadName:            procedure(Name: GLUInt) stdcall;

  glGenTextures:         procedure(N: GLSizei; var Textures: GLUInt) stdcall;
  glDeleteTextures:      procedure(N: GLSizei; Textures: PGLUInt) stdcall;
  glBindTexture:         procedure(Target: GLEnum; Texture: GLUInt) stdcall;
  glTexImage2D:          procedure(Target: GLEnum; Level, Components: GLInt; Width, Height: GLSizei; Border: GLInt; Format, _Type: GLEnum; Pixels: Pointer) stdcall;
  glTexEnvi:             procedure(Target, PName: GLEnum; Param: GLInt) stdcall;
  glTexParameteri:       procedure(Target, PName: GLEnum; Param: GLInt) stdcall;
  glPixelStorei:         procedure(PName: GLEnum; Param: GLInt) stdcall;

  glMaterialf:           procedure(Face, PName: GLEnum; Param: GLFloat) stdcall;
  glMaterialfv:          procedure(Face, PName: GLEnum; Params: PGLFloat) stdcall;
  glColorMaterial:       procedure(Face, Mode: GLEnum) stdcall;

  glLightfv:             procedure(Light, PName: GLEnum; Params: PGLFloat) stdcall;
  glLightf:              procedure(Light, PName: GLEnum; Param: GLFloat) stdcall;
  glLightModeli:         procedure(PName: GLEnum; Param: GLInt) stdcall;
  glLightModelfv:        procedure(PName: GLEnum; Params: PGLFloat) stdcall;

  glFlush:               procedure() stdcall;
  glHint:                procedure(Target, Mode: GLEnum) stdcall;
  glGetIntegerv:         procedure(PName: GLenum; Params: PGLInt) stdcall;
  glGetFloatv:           procedure(PName: GLenum; Params: PGLFloat) stdcall;
  glFrontFace:           procedure(Mode: GLEnum) stdcall;

  glEnableClientState:   procedure(Cap: GLEnum) stdcall;
  glDisableClientState:  procedure(Cap: GLEnum) stdcall;
  glArrayElement:        procedure(Index: GLInt) stdcall;
  glDrawArrays:          procedure(Mode: GLEnum; First: GLInt; Count: GLSizei) stdcall;
  glDrawElements:        procedure(Mode: GLEnum; Count: GLSizei; _Type: GLEnum; const Indices: GLVoid) stdcall;
  glVertexPointer:       procedure(Size: GLInt; _Type: GLEnum; Stride: GLSizei; const Pointer: GLVoid) stdcall;
  glColorPointer:        procedure(Size: GLInt; _Type: GLEnum; Stride: GLSizei; const Pointer: GLVoid) stdcall;
  glNormalPointer:       procedure(_Type: GLEnum; Stride: GLSizei; const Pointer: GLVoid) stdcall;
  glTexCoordPointer:     procedure(Size: GLInt; _Type: GLEnum; Stride: GLSizei; const Pointer: GLVoid) stdcall;
  glPolygonOffset:       procedure(Factor: GLFloat; Units: GLFloat) stdcall;

  gluNewQuadric:         function(): GLUquadricObj stdcall;
  gluDeleteQuadric:      procedure(State: GLUquadricObj) stdcall;
  gluQuadricDrawStyle:   procedure(QuadObject: GLUquadricObj; DrawStyle: GLEnum) stdcall;
  gluQuadricOrientation: procedure(QuadObject: GLUquadricObj; Orientation: GLEnum) stdcall;
  gluQuadricTexture:     procedure(QuadObject: GLUquadricObj; TextureCoords: GLBoolean );stdcall;
  gluCylinder:           procedure(QuadObject: GLUquadricObj; BaseRadius, TopRadius, Height: GLDouble; Slices, Stacks: GLInt) stdcall;
  gluSphere:             procedure(QuadObject: GLUquadricObj; Radius: GLDouble; Slices, Loops: GLInt) stdcall;

implementation

uses
  KolibriOS;

var
  hTinyGL: Pointer;

initialization
  hTinyGL := LoadLibrary('/sys/lib/TinyGL.obj');
  kosglSwapBuffers      := GetProcAddress(hTinyGL, 'kosglSwapBuffers');
  kosglMakeCurrent      := GetProcAddress(hTinyGL, 'kosglMakeCurrent');
  glEnable              := GetProcAddress(hTinyGL, 'glEnable');
  glDisable             := GetProcAddress(hTinyGL, 'glDisable');
  glShadeModel          := GetProcAddress(hTinyGL, 'glShadeModel');
  glCullFace            := GetProcAddress(hTinyGL, 'glCullFace');
  glPolygonMode         := GetProcAddress(hTinyGL, 'glPolygonMode');
  glBegin               := GetProcAddress(hTinyGL, 'glBegin');
  glEnd                 := GetProcAddress(hTinyGL, 'glEnd');
  glVertex2f            := GetProcAddress(hTinyGL, 'glVertex2f');
  glVertex2d            := GetProcAddress(hTinyGL, 'glVertex2d');
  glVertex2fv           := GetProcAddress(hTinyGL, 'glVertex2fv');
  glVertex2dv           := GetProcAddress(hTinyGL, 'glVertex2dv');
  glVertex3f            := GetProcAddress(hTinyGL, 'glVertex3f');
  glVertex3d            := GetProcAddress(hTinyGL, 'glVertex3d');
  glVertex3fv           := GetProcAddress(hTinyGL, 'glVertex3fv');
  glVertex3dv           := GetProcAddress(hTinyGL, 'glVertex3dv');
  glVertex4f            := GetProcAddress(hTinyGL, 'glVertex4f');
  glVertex4d            := GetProcAddress(hTinyGL, 'glVertex4d');
  glVertex4fv           := GetProcAddress(hTinyGL, 'glVertex4fv');
  glVertex4dv           := GetProcAddress(hTinyGL, 'glVertex4dv');
  glColor3f             := GetProcAddress(hTinyGL, 'glColor3f');
  glColor3d             := GetProcAddress(hTinyGL, 'glColor3d');
  glColor3fv            := GetProcAddress(hTinyGL, 'glColor3fv');
  glColor3dv            := GetProcAddress(hTinyGL, 'glColor3dv');
  glColor3ub            := GetProcAddress(hTinyGL, 'glColor3ub');
  glColor4f             := GetProcAddress(hTinyGL, 'glColor4f');
  glColor4d             := GetProcAddress(hTinyGL, 'glColor4d');
  glColor4fv            := GetProcAddress(hTinyGL, 'glColor4fv');
  glColor4dv            := GetProcAddress(hTinyGL, 'glColor4dv');
  glNormal3f            := GetProcAddress(hTinyGL, 'glNormal3f');
  glNormal3d            := GetProcAddress(hTinyGL, 'glNormal3d');
  glNormal3fv           := GetProcAddress(hTinyGL, 'glNormal3fv');
  glNormal3dv           := GetProcAddress(hTinyGL, 'glNormal3dv');
  glTexCoord1f          := GetProcAddress(hTinyGL, 'glTexCoord1f');
  glTexCoord1d          := GetProcAddress(hTinyGL, 'glTexCoord1d');
  glTexCoord1fv         := GetProcAddress(hTinyGL, 'glTexCoord1fv');
  glTexCoord1dv         := GetProcAddress(hTinyGL, 'glTexCoord1dv');
  glTexCoord2f          := GetProcAddress(hTinyGL, 'glTexCoord2f');
  glTexCoord2d          := GetProcAddress(hTinyGL, 'glTexCoord2d');
  glTexCoord2fv         := GetProcAddress(hTinyGL, 'glTexCoord2fv');
  glTexCoord2dv         := GetProcAddress(hTinyGL, 'glTexCoord2dv');
  glTexCoord3f          := GetProcAddress(hTinyGL, 'glTexCoord3f');
  glTexCoord3d          := GetProcAddress(hTinyGL, 'glTexCoord3d');
  glTexCoord3fv         := GetProcAddress(hTinyGL, 'glTexCoord3fv');
  glTexCoord3dv         := GetProcAddress(hTinyGL, 'glTexCoord3dv');
  glTexCoord4f          := GetProcAddress(hTinyGL, 'glTexCoord4f');
  glTexCoord4d          := GetProcAddress(hTinyGL, 'glTexCoord4d');
  glTexCoord4fv         := GetProcAddress(hTinyGL, 'glTexCoord4fv');
  glTexCoord4dv         := GetProcAddress(hTinyGL, 'glTexCoord4dv');
  glEdgeFlag            := GetProcAddress(hTinyGL, 'glEdgeFlag');
  glMatrixMode          := GetProcAddress(hTinyGL, 'glMatrixMode');
  glLoadMatrixf         := GetProcAddress(hTinyGL, 'glLoadMatrixf');
  glLoadIdentity        := GetProcAddress(hTinyGL, 'glLoadIdentity');
  glMultMatrixf         := GetProcAddress(hTinyGL, 'glMultMatrixf');
  glPushMatrix          := GetProcAddress(hTinyGL, 'glPushMatrix');
  glPopMatrix           := GetProcAddress(hTinyGL, 'glPopMatrix');
  glRotatef             := GetProcAddress(hTinyGL, 'glRotatef');
  glTranslatef          := GetProcAddress(hTinyGL, 'glTranslatef');
  glScalef              := GetProcAddress(hTinyGL, 'glScalef');
  glViewport            := GetProcAddress(hTinyGL, 'glViewport');
  glFrustum             := GetProcAddress(hTinyGL, 'glFrustum');
  glGenLists            := GetProcAddress(hTinyGL, 'glGenLists');
  glIsList              := GetProcAddress(hTinyGL, 'glIsList');
  glNewList             := GetProcAddress(hTinyGL, 'glNewList');
  glEndList             := GetProcAddress(hTinyGL, 'glEndList');
  glCallList            := GetProcAddress(hTinyGL, 'glCallList');
  glClear               := GetProcAddress(hTinyGL, 'glClear');
  glClearColor          := GetProcAddress(hTinyGL, 'glClearColor');
  glClearDepth          := GetProcAddress(hTinyGL, 'glClearDepth');
  glRenderMode          := GetProcAddress(hTinyGL, 'glRenderMode');
  glSelectBuffer        := GetProcAddress(hTinyGL, 'glSelectBuffer');
  glInitNames           := GetProcAddress(hTinyGL, 'glInitNames');
  glPushName            := GetProcAddress(hTinyGL, 'glPushName');
  glPopName             := GetProcAddress(hTinyGL, 'glPopName');
  glLoadName            := GetProcAddress(hTinyGL, 'glLoadName');
  glGenTextures         := GetProcAddress(hTinyGL, 'glGenTextures');
  glDeleteTextures      := GetProcAddress(hTinyGL, 'glDeleteTextures');
  glBindTexture         := GetProcAddress(hTinyGL, 'glBindTexture');
  glTexImage2D          := GetProcAddress(hTinyGL, 'glTexImage2D');
  glTexEnvi             := GetProcAddress(hTinyGL, 'glTexEnvi');
  glTexParameteri       := GetProcAddress(hTinyGL, 'glTexParameteri');
  glPixelStorei         := GetProcAddress(hTinyGL, 'glPixelStorei');
  glMaterialf           := GetProcAddress(hTinyGL, 'glMaterialf');
  glMaterialfv          := GetProcAddress(hTinyGL, 'glMaterialfv');
  glColorMaterial       := GetProcAddress(hTinyGL, 'glColorMaterial');
  glLightfv             := GetProcAddress(hTinyGL, 'glLightfv');
  glLightf              := GetProcAddress(hTinyGL, 'glLightf');
  glLightModeli         := GetProcAddress(hTinyGL, 'glLightModeli');
  glLightModelfv        := GetProcAddress(hTinyGL, 'glLightModelfv');
  glFlush               := GetProcAddress(hTinyGL, 'glFlush');
  glHint                := GetProcAddress(hTinyGL, 'glHint');
  glGetIntegerv         := GetProcAddress(hTinyGL, 'glGetIntegerv');
  glGetFloatv           := GetProcAddress(hTinyGL, 'glGetFloatv');
  glFrontFace           := GetProcAddress(hTinyGL, 'glFrontFace');
  glEnableClientState   := GetProcAddress(hTinyGL, 'glEnableClientState');
  glDisableClientState  := GetProcAddress(hTinyGL, 'glDisableClientState');
  glArrayElement        := GetProcAddress(hTinyGL, 'glArrayElement');
  glDrawArrays          := GetProcAddress(hTinyGL, 'glDrawArrays');
  glDrawElements        := GetProcAddress(hTinyGL, 'glDrawElements');
  glVertexPointer       := GetProcAddress(hTinyGL, 'glVertexPointer');
  glColorPointer        := GetProcAddress(hTinyGL, 'glColorPointer');
  glNormalPointer       := GetProcAddress(hTinyGL, 'glNormalPointer');
  glTexCoordPointer     := GetProcAddress(hTinyGL, 'glTexCoordPointer');
  glPolygonOffset       := GetProcAddress(hTinyGL, 'glPolygonOffset');
  gluNewQuadric         := GetProcAddress(hTinyGL, 'gluNewQuadric');
  gluDeleteQuadric      := GetProcAddress(hTinyGL, 'gluDeleteQuadric');
  gluQuadricDrawStyle   := GetProcAddress(hTinyGL, 'gluQuadricDrawStyle');
  gluQuadricOrientation := GetProcAddress(hTinyGL, 'gluQuadricOrientation');
  gluQuadricTexture     := GetProcAddress(hTinyGL, 'gluQuadricTexture');
  gluCylinder           := GetProcAddress(hTinyGL, 'gluCylinder');
  gluSphere             := GetProcAddress(hTinyGL, 'gluSphere');
end.
Пример использования TinyGL в KolibriOS — вращающийся куб
program ColorCube;

uses
  KolibriOS, TinyGL;

var
  Rotation: GLFloat = 0;
  Speed:    GLFloat = 3.5;
  ZTr:      GLFloat = -4.7;
  dZ:       GLFloat = 0.145;
  CTX:      TKOSGLContext;

  WndLeft, WndTop, WndWidth, WndHeight: LongInt;

function Tan(const X: Extended): Extended;
asm
  FLD X
  FPTAN
  FSTP ST(0)
  FWAIT
end;

(*
  https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glFrustum.xml
  https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glLoadMatrix.xml
*)
procedure Frustum(Left, Right, Bottom, Top, zNear, zFar: GLDouble);
var
  M: array[0..15] of GLFloat;
  A, B, C, D, M0, M5: GLFloat;
begin
  A  := (Right + Left) / (Right - Left);
  B  := (Top + Bottom) / (Top - Bottom);
  C  := -(zFar + zNear) / (zFar - zNear);
  D  := -(2 * zFar * zNear) / (zFar - zNear);
  M0 := (2 * zNear) / (Right - Left);
  M5 := (2 * zNear) / (Top - Bottom);

  M[0] := M0;   M[4] := 0;    M[8]  := A;    M[12] := 0;
  M[1] := 0;    M[5] := M5;   M[9]  := B;    M[13] := 0;
  M[2] := 0;    M[6] := 0;    M[10] := C;    M[14] := D;
  M[3] := 0;    M[7] := 0;    M[11] := -1;   M[15] := 0;

  glLoadMatrixf(@M[0]);
end;

(*
  https://nehe.gamedev.net/article/replacement_for_gluperspective/21002/
*)
procedure Perspective(fovY, Aspect, zNear, zFar: GLDouble);
var
  fW, fH: GLDouble;
begin
    fH := Tan(fovY * PI / 360) * zNear;
    fW := fH * Aspect;
    //glFrustum(-fW, fW, -fH, fH, zNear, zFar); // not work, crashes
     Frustum(-fW, fW, -fH, fH, zNear, zFar);
end;

procedure GLDraw;
var
  ThreadInfo: TThreadInfo;
begin
  GetThreadInfo($FFFFFFFF, ThreadInfo);
  if ThreadInfo.Client.Bottom <= 3 then Exit; // otherwise app crashes

  kosglMakeCurrent(0, 0, ThreadInfo.Client.Right, ThreadInfo.Client.Bottom, CTX);
  glViewPort (0, 0, ThreadInfo.Client.Right, ThreadInfo.Client.Bottom);

  glClearColor(0.33, 0.33, 0.33, 0.0);
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  glEnable(GL_DEPTH_TEST);

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  //gluPerspective(45.0, ThreadInfo.Client.Right / ThreadInfo.Client.Bottom, 0.1, 100.0); // not supported
       Perspective(45.0, ThreadInfo.Client.Right / ThreadInfo.Client.Bottom, 0.1, 100.0);

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity;

  glTranslatef(0.0, 0.0, ZTr);
  glRotatef(Rotation, 0.3, 0.6, 0.6);

  glBegin(GL_QUAD_STRIP);
    glColor3f(1, 0, 1); glVertex3f(-1, 1, 1);   // near upper left
    glColor3f(1, 0, 0); glVertex3f(-1, -1, 1);  // near lower left
    glColor3f(1, 1, 1); glVertex3f(1, 1, 1);    // near upper right
    glColor3f(1, 1, 0); glVertex3f(1, -1, 1);   // near lower right
    glColor3f(0, 1, 1); glVertex3f(1, 1, -1);   // far  upper right
    glColor3f(0, 1, 0); glVertex3f(1, -1, -1);  // far  lower right
    glColor3f(0, 0, 1); glVertex3f(-1, 1, -1);  // far  upper left
    glColor3f(0, 0, 0); glVertex3f(-1, -1, -1); // far  lower left
    glColor3f(1, 0, 1); glVertex3f(-1, 1, 1);   // near upper left
    glColor3f(1, 0, 0); glVertex3f(-1, -1, 1);  // near lower left
  glEnd;
  glBegin(GL_QUADS);
    glColor3f(1, 0, 1); glVertex3f(-1, 1, 1);   // near upper left
    glColor3f(1, 1, 1); glVertex3f(1, 1, 1);    // near upper right
    glColor3f(0, 1, 1); glVertex3f(1, 1, -1);   // far  upper right
    glColor3f(0, 0, 1); glVertex3f(-1, 1, -1);  // far  upper left
  glEnd;
  glBegin(GL_QUADS);
    glColor3f(1, 0, 0); glVertex3f(-1, -1, 1);  // near lower left
    glColor3f(1, 1, 0); glVertex3f(1, -1, 1);   // near lower right
    glColor3f(0, 1, 0); glVertex3f(1, -1, -1);  // far  lower right
    glColor3f(0, 0, 0); glVertex3f(-1, -1, -1); // far  lower left
  glEnd;

  kosglSwapBuffers;

  Rotation := Rotation + Speed;

  ZTr := ZTr + dZ;
  if (ZTr < -16) or (ZTr > -4.5) then
  begin
    dZ := - dZ;
    ZTr := ZTr + dZ;
  end;
end;

begin
  with GetScreenSize do
  begin
    WndWidth  := Width div 3;
    WndHeight := Height div 3;
    WndLeft   := (Width - WndWidth) div 2;
    WndTop    := (Height - WndHeight) div 2;
  end;
  while True do
    case WaitEventByTime(1) of
      REDRAW_EVENT:
        begin
          BeginDraw;
          DrawWindow(WndLeft, WndTop, WndWidth, WndHeight, 'TinyGL program', $00FFFFFF,
            WS_SKINNED_SIZABLE + WS_CLIENT_COORDS + WS_CAPTION, CAPTION_MOVABLE);
          GLDraw;
          EndDraw;
        end;
      KEY_EVENT:
        GetKey;
      BUTTON_EVENT:
        if GetButton.ID = 1 then
          TerminateThread;
    else
      GLDraw;
    end;
end.

Также прилагаю ColorCube.kex — уже скомпилированное и сжатое приложение для KolibriOS.

Возникшие\обнаруженные проблемы:
Была нужна функция gluPerspective, но она в библиотеке не реализована, пришлось написать аналог(функция Perspective).
Но для работы функции Perspective необходима функция glFrustum.
Проблема в том, что эта функция есть, но интерфейс реализован не правильно.
Это стандартная функция и должна принимать в качестве параметров значения типа GLDouble  — https://www.khronos.org/registry/OpenGL … rustum.xml
Но в KolibriOS сделано так, что она принимает указатели на GLDoublehttp://websvn.kolibrios.org/filedetails … 3#line-541
Пример Gears, использующий TinyGL, работает, так как тоже передаёт указатели, но это не правильно — http://websvn.kolibrios.org/filedetails … 3#line-114
Для работы своего примера я переписал функцию Frustum согласно официальной спецификации — так всё работает smile
Ещё есть проблема при выводе изображения в окно: координаты нижнего и правого края изображения при изменении размеров окна меняются на несколько пикселей как-то сами по себе, больше похоже на баг в библиотеке.

Ещё есть замечание по поводу структуры TThreadInfo из нашего SDK.

  TThreadInfo = packed record    
........................
    Window:       TRect;
........................
    Client:       TRect;
........................

всё же правильнее будет не TRect, а TBox.

Post's attachments

Иконка вложений ColorCube.kex 2.16 Кб, 132 скачиваний с 2020-08-21 

OpenGLTest.gif, 383.16 Кб, 160 x 120
OpenGLTest.gif 383.16 Кб, 79 скачиваний с 2020-08-21 

2

Re: TinyGL(подмножество OpenGL)

http://board.kolibrios.org/viewtopic.ph … 858#p74858

Ещё есть проблема при выводе изображения в окно: координаты нижнего и правого края изображения при изменении размеров окна меняются на несколько пикселей как-то сами по себе, больше похоже на баг в библиотеке.

Ответ IgorA: В библиотеке TinyGL (на C++) изменение размеров окна делается с кратностью в 4 пикселя. Может оно будет правильно работать и при изменении размеров на 1 пиксель я не проверял. В asm версии также сделал изменение размеров кратное 4-м пикселям.

3

Re: TinyGL(подмножество OpenGL)

Leency пишет:

изменение размеров окна делается с кратностью в 4 пикселя

Причина понятна.
Но разве это стандартное поведение для OpenGL?
И как в таком случае писать программы с изменяемым размером?
ИМХО разруливаться всё должно внутри самой библиотеки.

4

Re: TinyGL(подмножество OpenGL)

Ответ IgorA:

Почитал замечания от 0CodErr и сделал такие правки:
rev 8059
- добавлена функция gluPerspective,
- исправлена функция glFrustum (принимает параметры double через стек, раньше принимались указатели на double),
- немного доработан пример gears.

Сборка почему-то не пересобралась и ошибок никаких не выдала :?:

5

Re: TinyGL(подмножество OpenGL)

Leency, да, это здорово, что библиотека TinyGL поддерживается и развивается!
Теперь, думаю, можно уже переписать пример с использованием библиотечных функций.

Только не понятно, что делать с этим

изменение размеров окна делается с кратностью в 4 пикселя

Вручную закрашивать края? А почему сама библиотека не может это сделать?
Просто не очень удобно каждый раз пересчитывать, сколько пикселей нужно закрасить.
Да и вообще это не стандартное поведение.
С чем, интересно, связано такое изменение размеров с кратностью 4?

6

Re: TinyGL(подмножество OpenGL)

Есть еще обновления библиотеки rev 8062, 8063
- добавлена функция glOrtho
- оптимизации и чистка кода

Только не понятно, что делать с этим

изменение размеров окна делается с кратностью в 4 пикселя

Вручную закрашивать края? А почему сама библиотека не может это сделать?

Корень проблемы в функции закраски цветом 24-битного буфера. Наверное для оптимизации по скорости была сделана закраска блоками по 12 байт (минимальное число кратное 3 и 4, функция memset_RGB24).
По идее можно из библиотеки безболезненно убрать ограничение по высоте буфера. А для снятия ограничения по ширине нужно доработать функцию memset_RGB24 http://websvn.kolibrios.org/filedetails … 3#line-441.