diff --git a/InstallerSamples/OpenGL и OpenCL/Гайд по использованию OpenGL и OpenCL.html b/InstallerSamples/OpenGL и OpenCL/Гайд по использованию OpenGL и OpenCL.html index 489eed04d..c093eb42e 100644 --- a/InstallerSamples/OpenGL и OpenCL/Гайд по использованию OpenGL и OpenCL.html +++ b/InstallerSamples/OpenGL и OpenCL/Гайд по использованию OpenGL и OpenCL.html @@ -1042,7 +1042,7 @@ MyProc(default(gl_buffer));

Многие параметры подпрограмм в исходных библиотеках принимают перечисления (enum'ы).

Перечисления, как и имена, это числа. Но в отличии от имён - перечисления принимают заданные заранее константные значения.

В качестве примера:

-
procedure gl.BeginQuery(target: QueryTarget; id: QueryName);
+
procedure gl.BeginQuery(target: QueryTarget; id: gl_query)
 

Параметр target принимает одно из значений, сгрупированных в записи QueryTarget:

  QueryTarget = record
@@ -1087,8 +1087,8 @@ gl.BeginQuery(QueryTarget.VERTICES_SUBMITTED, name);
 
procedure gl.Clear(mask: ClearBufferMask);
 
gl.Clear(
-  ClearBufferMask.COLOR_BUFFER_BIT + // очистка поверхности рисования одним цветом
-  ClearBufferMask.DEPTH_BUFFER_BIT   // очистка буфера глубины - обязательна при рисовании 3D
+  ClearBufferMask.COLOR_BUFFER_BIT + // Очистка поверхности рисования одним цветом
+  ClearBufferMask.DEPTH_BUFFER_BIT   // Очистка буфера глубины - нужна при рисовании 3D
 );
 
@@ -1102,12 +1102,18 @@ gl.BeginQuery(QueryTarget.VERTICES_SUBMITTED, name);

По нажатию точки после cl вам так же покажет список всех функций в ядре OpenCL.


-

С OpenGL немного сложнее: в каждом контексте у каждой подпрограммы может быть свой адрес. -Поэтому подпрограммы надо получать в зависимости от контекста. В модуле OpenGL это реализовано так:

+

С OpenGL немного сложнее:

+
    +
  1. В каждом контексте у каждой подпрограммы может быть свой адрес.
  2. +
  3. Получение адреса подпрограммы выглядит по-разному на разных платформах.
  4. +
+

В модуле OpenGL это реализовано так:

//ToDo Создание контекста и привязка его к текущему потоку
 
 // Все адреса и экземпляры делегатов создаются в конструкторе
-var gl := new OpenGL.gl;
+// В "<>" указывается имя платформы
+// Можете написать "Pl" и нажать Ctrl+пробел, чтоб получить список платформ
+var gl := new OpenGL.gl<PlWin>;
 
 while true do
 begin
@@ -1123,25 +1129,26 @@ end;
 

У каждого расширения есть свой класс. К примеру, так используется расширение GL_AMD_debug_output:

//ToDo Опять же, сначала контекст
 
-var glDebugOutputAMD := new OpenGL.glDebugOutputAMD;
+var glDebugOutputAMD := new OpenGL.glDebugOutputAMD<PlWin>;
 ...
 glDebugOutputAMD.DebugMessageEnableAMD(...);
 

-

В модуле OpenGL так же есть особые классы, wgl и gdi:

+

В модуле OpenGL так же есть особые классы, wgl, gdi и glx:

  • gdi содержит несколько методов библиотеки gdi32.dll. На этой библиотеке основано всё в System.Windows.Forms.
    -Подпрограммы включённые в класс gdi - это то что может понадобиться вам чтоб настроить и подготовить форму для рисования на ней с помощью OpenGL.

    +Подпрограммы включённые в класс gdi - это то, что может понадобиться вам, чтоб настроить и подготовить форму для рисования на ней с помощью OpenGL.

  • -
  • wgl содержит методы для работы с OpenGL на Windows. Для других ОС есть класс glX, но он сейчас выключен из релиза. -Это потому, что у меня нет компьютера, на котором установлена не_Windows, а значит я не могу -заняться тестированием чтоб узнать как правильно объявлять всё в этом классе. Если у вас есть -другая ОС и вы хотите помочь мне разобраться - пожалуйста, свяжитесь со мной (желательно в issue).

    +
  • wgl содержит методы для подключения OpenGL к окну Windows.

    +
  • +
  • glx содержит методы для подключения OpenGL к окну XWindow.

Оба этих класса работают как класс cl, то есть им не надо создавать экземпляр.


-

И последнее что вам надо знать об этих классах: Если вы получаете NullReferenceException:

+

И последнее что вам надо знать об этих классах:
+Если вы получаете NullReferenceException, +при попытке вызова функции из инициализируемых классов, как gl:

  1. Скорее всего вы попытались вызвать подпрограмму, которой нет в реализации библиотеки на вашем компьютере.
    Проверьте версию библиотеки, или, если это подпрограмма из расширения - проверьте существование у вас этого расширения.

    @@ -1826,10 +1833,16 @@ begin d.DynamicInvoke(5); // вообще .DynamicInvoke это очень медленно var p: integer->(); -// var p: Action<integer>; // такое же объявление как на предыдущей строчке, но в другом стиле + // Такое же объявление как на предыдущей строчке, но в другом стиле +// var p: Action<integer>; + // И ещё один стиль. Этот особенный, потому что + // он неявно создаёт новый тип делегата +// var p: procedure(i: integer); p := p1; - p(5); // типизированные делегаты можно вызывать быстрее и проще, так же как обычные подпрограммы + // Типизированные делегаты можно вызывать быстрее и проще, + // так же как обычные подпрограммы + p(5); end.
@@ -1863,7 +1876,7 @@ end.
  1. cl.SetEventCallback вызывает свой коллбек тогда, когда посчитает нужным (но обычно после того как вызов cl.SetEventCallback завершился);

  2. -
  3. Делегаты - это классы. И на самом деле кроме самого адреса хранят ещё много всякой информации (как типы параметров);

    +
  4. Делегаты - это классы.

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

  6. @@ -1874,9 +1887,9 @@ end.

    Если сборщик мусора удалит делегат, а затем .dll попытается его вызвать - это приведёт или к ошибке доступа, или к моментальному беззвучному вылету.

    Чтоб запретить сборщику мусора удалять делегать - нужно создать GCHandle, привязанный к нему.
    -Но в отличии от массивов - GCHandleType.Pinned не нужно, потому что сборщик мусора может перемещать -в памяти данные о параметрах делегата, но не сам адрес (а он единственное что передаётся в .dll). -Это потому что адрес хранится в виде указателя на неуправляемый код.

    +Но в отличии от массивов - GCHandleType.Pinned не нужно, потому что сборщик мусора +не может перемещать адрес исполняемого кода (а он единственное что передаётся в .dll). +Это потому, что этот адрес хранится в виде указателя на неуправляемый код.

    uses System.Runtime.InteropServices;
     uses System;
     uses OpenCL;
    @@ -1889,8 +1902,8 @@ begin
         
         Writeln($'{ev} перешёл в состояние {st}');
         
    -    // в данном случае освобождать GCHandle станет можно тогда, когда делегат 1 раз выполнится,
    -    // а значит очень удобно поставить освобождение в конец самого делегата
    +    // В данном случае освобождать GCHandle станет можно тогда, когда делегат 1 раз выполнится,
    +    // А значит очень удобно поставить освобождение в конец самого делегата
         gc_hnd.Free;
       end;
       gc_hnd := GCHandle.Alloc(cb);
    diff --git a/InstallerSamples/OpenGL и OpenCL/Справка OpenGLABC.html b/InstallerSamples/OpenGL и OpenCL/Справка OpenGLABC.html
    index 5e1265767..73fecc8bb 100644
    --- a/InstallerSamples/OpenGL и OpenCL/Справка OpenGLABC.html	
    +++ b/InstallerSamples/OpenGL и OpenCL/Справка OpenGLABC.html	
    @@ -878,7 +878,7 @@ window.onload = ()=>{