Skip to content

Dev-Demi/GLEngine2D

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

27 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Обзор:
https://youtu.be/xxrlb3BlRn8

English:
https://youtu.be/Lq2bqSj-k7E
                                             GLEngine2D 



Движок основан на OpenGL.  

Ориентирован на то что бы заменить собой функции рисования TCanvas. 



Возможности: 

 -цвет в формате RGBA (альфаканал) 

 -разные возможные варианты работы с альфаканалом (смешивание, добавление) 

 -точки 

 -линии 

 -градиентные линии 

 -кривая по типу молнии 

 -стрелочки 

 -треугольники 

 -градиентные треугольники 

 -четырёхугольники 

 -прямоугольники 

 -градиентные четырёхугольники 

 -эллипс под углом 

 -текст 

 -отрисовка изображений TGA BMP JPEG PNG GIF (с альфаканалом и смешиванием цветов) 

 -поддержка анимации  

 -аппаратное сглаживание (AntiAlias) 

 -рисование в текстуру (FBO) 

 -экспорт текстуры в файл или в TBitMap 

 -аппаратное ускорение 

 -очень просто 


----------------------- Page 2-----------------------


1. Инициализация 



       Перед тем как приступить к рисованию, необходимо создать экземпляр класса TGLEngine и  

произвести инициализацию движка. 



Procedure TGLEngine.VisualInit(dc: HDC; width, height: word;AntiAlias:integer); 



dc – поверхность рисовани 

 width, height — ширина и высота холста 

AntiAlias — сглаживание (0 — выкл) 



Пример 



 Uses  

  GlEngine // Добавляем юнит движка 

... 

 Var 

   GLE:TGLEngine; // экземпляр класса 

   im:Cardinal; 

.... 

 GLE:=TGLEngine.Create; // создаём движок 

  // Указываем на чём рисуем и каким размером; 2 - 2х сглаживание 

 GLE.VisualInit(GetDC(Panel1.Handle),Panel1.ClientWidth,Panel1.ClientHeight,2); 


----------------------- Page 4-----------------------

2. Подготовка к рисованию и дополнительные  

     возможности 



       Рассмотрим функции которые обеспечивают общие настройки движка и самого процесса  

рисования. Начало рисования должно начинаться со строк 



       GLE.BeginRender; 



а заканчиваться строками 



       GLE.FinishRender; 



       Только после вызова FinishRender – будет осуществлён вывод сцены на поверхность  

рисования.  



Пример 



 Gle.BeginRender; 

  Gle.SetColor(1,1,1,1); 

  Gle.DrawImage(0,0,640,480,0,false,pod); 

  Gle.DrawImage(0,0,640,480,0,false,CreateTex); 

 Gle.FinishRender; 



       Для изменения размера холста используется метод: 



       Procedure Resize(w,h:integer); 



w,h – новые значание ширины и высоты холста соответственно. 



Полезными будут следующие методы: 



       function GetTimeDrawFrame:double; 

       function GetFPS:Integer; 



       GetTimeDrawFrame – возвращает время (в миллисекундах) затраченное на прорисовку  

последнего кадра. GetFPS – количество кадров реально нарисованных за последнюю секунду. 



2.1 Работа с цветами и режимами рисования 



       Для установки цвета выводимой фигуры (изображения) используется метод  



       Procedure SetColor(r,g,b,a:single);Overload; 

       Procedure SetColor(color:TGLColor);Overload; 



где TGLColor это 



       TGLColor = record 

        Red, Green, Blue, alpha:single; 

       end; 



       Для  быстрого получения цвета в TGLColor можно использовать метод: 



       function ColorGL(r,g,b,a:single):TGLColor; 



       Для установки цвета фона: 



       Procedure SetBKColor(r,g,b:single); 



       В движке предусмотрен вывод линий со сглаживанием. Включить или выключить его можно  

методом: 


----------------------- Page 5-----------------------

        Procedure AntiAlias(Enable:boolean); 



        Обратите внимание, что значение величины сглаживания — задаётся при инициализации и  

потом его изменить нельзя. Если при инициализации выставить значение, которое не поддерживаетс    

видеокартой — то соответственно сглаживание работать не будет и его включение ничего не даст.  



        Включить / выключить вертикальную синхронизацию модно методом: 



        Procedure VertSynh(Enable:boolean); 



        Сталь заливки графических примитивов (треугольников, четырёхугольников и т.д.)  

устанавливается при помощи метода: 



        Procedure SetFill(Mode:TGLFill); 



где, Mode может принимать значения glPoint, glLine, glFill соответственно - точки, линии, сплошна   

заливка. 



        Следует так же обратить внимание на то, что все цвета задаются в режиме RGBA, и  

следовательно имеют альфаканал. В GLEngine имеется возможность указать как работать с  

альфаканалом, для этого следует воспользоваться методом: 



        Procedure SwichBlendMode(BlendMode:TGLBlendMode); 



где TGLBlendMode=(bmAdd,bmNormal).  



bmNormal — режим нормального смешивания и является режимом «по умолчанию». 

bmAdd – режим добавления (умножения цветов). 


----------------------- Page 6-----------------------

3. Графические примитивы 



3.1 Точки 



        Для вывода на экран точки используется метод: 



        Procedure Point(x1,y1:single); 



где x1 и y1 – x и y координаты точки соответственно.  

        Так же для точки можно установить её размер: 



        Procedure PointSize(Size:single); 



где Size – это размер точки в «виртуальных пикселях». 

        При выводе точки размером например 4, в разных задачах это может быть как круг диаметром  

4, так и квадрат со стороной 4. Что бы определить однозначно, что выводить используется метод: 



        Procedure PointSmooth(Enable:Boolean); 



где Enable – указывает режим сглаживания точки при масштабировании. Если  Enable = True, то на  

экране будет круг, если Enable = False – соответственно квадрат. 



3.2 Линии 



        Что бы нарисовать линию необходимо вызвать метод 



        Procedure Line(x1,y1,x2,y2:single); 



где x1,y1,x2,y2 — это координаты начальной (x1,y1) и конечной (x2,y2) точек. Так же можно управлять  

шириной выводимых линий: 



        Procedure LineWidth(W:single); 



где W – ширина линии в пикселях. 

        Так же можно осуществить вывод градиентной линии, у которой цвет будет плавно менятьс         

от цвета начальной точки до цвета конечной.   



        Procedure LineGrad(x1,y1,x2,y2:single;Color1,Color2:TGLColor); 



где x1,y1,x2,y2 — это координаты начальной (x1,y1) и конечной (x2,y2) точек, а Color1 и Color2 – цвет  

начальной и конечной точки соответственно. 



3.3 Треугольники 



        Треугольники задаются тремя точками своих вершин (X1,Y1) (X2,Y2) (X3,Y3): 



        Procedure Triangle(x1,y1,x2,y2,x3,y3:single); 



        Можно вывести треугольник закрашенный градиентом, для этого необходимо ещё указать цвет  

каждой вершины: 



        Procedure TriangleGrad(x1,y1,x2,y2,x3,y3:single;c1,c2,c3:TGLColor); 



где C1,C2,C3 – соответственно цвета первой, второй и третьей вершины. 



3.4  Четырёхугольники и прямоугольники 



        Для задания прямоугольника достаточно указать две точки, по которым он будет построен 


----------------------- Page 7-----------------------

        Procedure Bar(x1, y1, x2, y2:single); 



или можно указать координаты середины(X,Y) прямоугольника, его длину (W) и ширину (H), а так же  

угол поворота(angle): 



        Procedure Bar(x, y, w, h, angle:single); 



        Для не закрашенного прямоугольника (только рамочка, вне зависимости от настроек SetFill): 



        Procedure Rectangle(x1, y1, x2, y2:single); 



        Четырёхугольник задаётся 4 вершинами: 



        Procedure Bar(x1, y1, x2, y2, x3, y3, x4, y4:single);  



        Можно задать каждой вершине цвет, и тогда получим четырёхугольник с градиентной  

заливкой:  



        Procedure BarGrad(x1,y1,x2,y2,x3,y3,x4,y4:single;c1,c2,c3,c4:TGLColor); 



                                    Рисунок 3.4.1 «Пример выполнени    

 Gle.BarGrad(10,10,10,470,630,470,630,10,gle.ColorGL(1,0,0,0.9),gle.ColorGL(0,1,0,0.9),gle.ColorGL(0,0,1, 

                                        0.9),gle.ColorGL(1,1,1,0.9));» 



3.5 Круги, окружности и эллипс 



        Реализуются одним методом: 



        Procedure Ellipse(x,y,r1,r2,AngleRotate:single;n:integer); 



где:    x,y – координаты центра 

        r1,r2 – радиусы эллипса 

        AngleRotate — угол поворота эллипса в градусах 

        n – количество сегментов из которых состоит эллипс 



3.6 Текст 



        Вывести текст в нужной позиции позволяет метод: 



        Procedure TextOut(x,y:single; text:string); 


----------------------- Page 8-----------------------

где:    x,y – координаты начала строки 

        text – сама строка выводимого текста 



        Для изменения шрифта и размера текста используется метод 



        Procedure SetTextStyle(NameFont:string; size:integer); 



где:    NameFont – название шрифта, например «Times New Roman» 

        size – размер шрифта. 



3.7 Прочие примитив 



        Так же доступны примитивы, которые несколько упрощают жизнь разработчику: 



        Procedure Bolt(x1,y1,x2,y2:single); 



        Этот метод выводит извилистую линию от точки (x1,y1) до точки (x2,y2). 



        Procedure Arrow(x1,y1,x2,y2, size,angle:single;Solid:Boolean); 



        Стрелочка от точки (x1,y1) в точку (x2,y2). Size – размер самой стрелочки, angle – угол наклона  

линий, образующих стрелочку, Solid – если равен True – стрелочка закрашенная, иначе — нет. 


----------------------- Page 9-----------------------

4. Работа с изображениями 



4.1 Загрузка и создание 



        Прежде чем выводить изображение его необходимо загрузить из файла или создать. Работа с  

изображениями происходит по указателям. Указателем выступает переменная типа Cardinal.  



Пример 



Var 

 im:Cardinal; 



       GLEngine может работать с файлами следующих типов: TGA BMP JPEG PNG GIF. Загрузка  

изображения осуществляется вызовом метода: 



        function  LoadImage(Filename: String; var Texture : Cardinal;  

LoadFromRes : Boolean) : Boolean; 



где:    Filename – строка содержащая путь к загружаемому файлу 

       Texture – переменная которая будет содержать указатель на загруженное изображение 

        LoadFromres – если равен True загрузка происходит из ресурсов, иначе из внешнего файла. 

        Помимо загрузки из файла возможна загрузка из TBitMap: 



       procedure AddBMPImage(Bmp:TBitMap;var Texture : TGLuint); 



однако следует иметь в виду, что BMP должен быть с 32-битной глубиной цвета. 

       Так же можно создать «пустое» изображение: 



       Function  CreateImage(w,h:integer):Cardinal; 



где: w и h – это ширина и высота создаваемого изображения соответственно. Следует иметь ввиду,  

что имеются аппаратные ограничения на размер изображений. Как правило это 4096x4096 хотя могут  

быть и другие. 

       Следует отметить что после завершения работы с изображением, необходимо освободить  

занимаемую им память методом: 



        Procedure FreeImage(var Texture : Cardinal); 



       Освобождением памяти занимается драйвер вашей видеокарты. 



4.2 Отрисовка изображений 



       Для вывода изображения используется метод: 



        Procedure DrawImage(x,y,w,h,Angle:single;Center:boolean;Image:Cardinal); 



где:   x,y – координаты где будет располагаться изображение 

       w,h – ширина и высота выводимого изображения  

       Angle – угол поворота изображения  

       Center – если принимает значение True, то изображение будет центроваться (центр  

изображения будет находится в координатах X,Y), иначе — X,Y – координаты нижнего левого угла. 

        Image — переменная изображения. 



       Следует отметить что если перед тем как вывести изображение вызвать SetColor, то  

изображение будет выводиться согласно заданному цвету.  



4.3 Рисование на изображении (FBO) 



        По-умолчанию рисование происходит на компоненте, чей хендл был указан при  

инициализации GLEngine2D. Что бы рисовать не на компоненте, а на изображении используют метод: 


----------------------- Page 10-----------------------

       Procedure BeginRenderToTex(Image:Cardinal; w,h:glint); 



где:   Image – изображение на котором будет происходить рисование. 

       W,H – ширина и высота этого изображения соответственно. 

       Что бы вернуться к рисованию на компоненте надо вызвать метод: 



       Procedure EndRenderToTex; 



Пример 



var 

  CreateTex:Cardinal; 

... 

 CreateTex:=GLE.CreateImage(640,480); 

 GLE.Resize(640,480); 

 Gle.BeginRenderToTex(CreateTex,640,480); 

 Gle.BarGrad(10,10,10,470,630,470,630,10,gle.ColorGL(1,0,0,0.9),gle.ColorGL(0,1, 

0,0.9),gle.ColorGL(0,0,1,0.9),gle.ColorGL(1,1,1,0.9  ; 

 gle.EndRenderToTex; 



4.4 Сохранение 



       Для сохранения изображения можно воспользоваться одним из методов: 



       Procedure SaveImage(FileName:string;var Texture : Cardinal); 



где:   FileName – строка, содержащая адрес файла, в который будет сохранено изображение  

Texture. Изображение будет сохранено в формате BMP с глубиной цвета 32. 



       Procedure SaveImageAsPNG(Filename:String; Im:Cardinal); 



где:   FileName – строка, содержащая адрес файла, в который будет сохранено изображение Im.  

Изображение будет сохранено в формате PNG с глубиной цвета 32. 



       Procedure GetBMP32FromImage(Im:Cardinal;var BMP32:TBitMap); 



где:   Im – изображение которое будет сохранятся в BMP32. BMP32 должен быть создан и уже  

существовать. Формат цвета и размеры изменяются автоматически. 



Пример 



var 

 bmp:TBitMap; 

... 

 bmp:=TBitMap.Create; 

 gle.GetBMP32FromImage(CreateTex,bmp); 

 image1.Picture.Assign(bmp); 

 bmp.Free; 


----------------------- Page 11-----------------------

5. Работа с шейдерами 



5.1 Введение (взято с gamedev.ru и elite-games.ru) 



        GLSL (OpenGL Shading Language) - glSLang - новый язык высокого уровня для создания  

фрагментных и вершинных шейдеров. В отличии от HLSL/Cg он создавался в расчете на будущее  

железо, поэтому теоретически он намного мощнее. В частности, GLSL много взял от RenderMan  

Shading Language. Существует два вида шейдеров: 



        Вершинный вызывается для каждой вершины. Ему на вход поступает координата вершины  

в мировой системе координат, текстурные координаты, нормали и еще много разных параметров (в  

том числе и любые другие, которые вы захотите. Скорость выполнения вершинного шейдера на  

процессоре видеокарты (GPU) довольно высока, по крайней мере, превышает скорость CPU в разы.  

Но пиксельные шейдеры – вот настоящая скорость... 



        Пиксельный вызывается для каждого (внимание!) пикселя. Скорость его настолько высока,  

что у меня, например, на GeForce 6600 пиксельный шейдер, на котором сделано гауссово размытие,  

замедляет счетчик FPS всего лишь на 20 кадров в секунду. Ни один CPU не сравнится по скорости с  

GPU. Пиксельному шейдеры поступают на вход измененные данные из вершинного шейдера и из  

вашей программы, а на выход должен выйти лишь один параметр – цвет пикселя. 



5.2 Загрузка и создание 



        Прежде чем работать с шейдерами их необходимо создать или загрузить из файла. Работа с  

шейдерами происходит, как и с изображениями, по указателям. Указателем выступает переменна          

типа Cardinal.  



Пример 



Var 

 s,b:cardinal; 



        Для загрузки шейдеров из файлов используется метод: 



        Function ShaderCreate(FragmentShaderFileName,VertexShaderFileName:String ):  

Integer; 



где:    FragmentShaderFileName и VertexShaderFileName — строки, содержащие адреса файлов с  

текстом шейдеров. 



Пример 



        s:=Gle.ShaderCreate('b.fp','b.vp'); 

        b:=Gle.ShaderCreate('blur.fp','blur.vp'); 



где:    FragmentShaderFileName и VertexShaderFileName — строки, содержащие адреса файлов с  

текстом шейдеров. 



5.3 Использование 



        Для того что бы использовать загруженный шейдер используется метод: 



        Procedure ShaderStart(Shader:Integer); 



Что бы вернуться в нормальный режим рисования и отменить действия шейдера используется метод: 



        Procedure ShaderStop(Shader:Integer); 



Пример 


----------------------- Page 12-----------------------

 gle.ShaderStart(s); 

  gle.Bar(170,165,310,310,0); 

 gle.ShaderStop(s); 



Продолжение следует... 

About

2d opengl engine for Delphi / 2D библиотека основанная на OpenGl для Delphi

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages