zgl_matrix.pas 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. unit zgl_matrix;
  2. {$mode delphi}
  3. {$I zgl_config.cfg}
  4. interface
  5. uses
  6. Math,
  7. zgl_window,
  8. zgl_types,
  9. zgl_gltypeconst,
  10. zgl_pasOpenGL,
  11. zgl_file;
  12. // RU: матрица перспективы.
  13. // EN: perspective matrix.
  14. procedure Matrix4_Perspective(fovy, aspect, _near, _far: Single);
  15. // RU: ортографическая матрица.
  16. // EN: orthographic matrix.
  17. procedure Matrix4_Orthographic(Left, Right, Bottom, Top, _Near, _Far: Single);
  18. // RU: загрузка шейдера, компиляция и проверка на успех компиляции.
  19. // EN: loading the shader, compiling and checking for compilation success.
  20. function LoadAndCreateShader(name: string; shade: GLuint): Boolean;
  21. var
  22. // RU: массив матрицы проекции.
  23. // EN:
  24. projMatr: array[0..15] of Single;
  25. implementation
  26. procedure Matrix4_Perspective(fovy, aspect, _near, _far: Single);
  27. var
  28. f: Single;
  29. begin
  30. f := 1 / tan(fovy * Pi / 180);
  31. projMatr[0] := f / aspect;
  32. projMatr[1] := 0;
  33. projMatr[2] := 0;
  34. projMatr[3] := 0;
  35. projMatr[4] := 0;
  36. projMatr[5] := f;
  37. projMatr[6] := 0;
  38. projMatr[7] := 0;
  39. projMatr[8] := 0;
  40. projMatr[9] := 0;
  41. projMatr[10] := (_far + _near) / (_near - _far);
  42. projMatr[11] := 2 * _far * _near / (_near - _far);
  43. projMatr[12] := 0;
  44. projMatr[13] := 0;
  45. projMatr[14] := - 1;
  46. projMatr[15] := 0;
  47. end;
  48. procedure Matrix4_Orthographic(Left, Right, Bottom, Top, _Near, _Far: Single);
  49. var
  50. f: Single;
  51. begin
  52. f := Right - Left;
  53. projMatr[0] := 2 / f;
  54. projMatr[1] := 0;
  55. projMatr[2] := 0;
  56. projMatr[3] := -(Right + Left) / f;
  57. f := Top - Bottom;
  58. projMatr[4] := 0;
  59. projMatr[5] := 2 / f;
  60. projMatr[6] := 0;
  61. projMatr[7] := -(top + Bottom) / f;
  62. f := _Far - _Near;
  63. projMatr[8] := 0;
  64. projMatr[9] := 0;
  65. projMatr[10] := - 2 / f;
  66. projMatr[11] := -(_Far + _Near) / f;
  67. projMatr[12] := 0;
  68. projMatr[13] := 0;
  69. projMatr[14] := 0;
  70. projMatr[15] := 1;
  71. end;
  72. function LoadAndCreateShader(name: string; shade: GLuint): Boolean;
  73. var
  74. Ftext: zglTFile;
  75. Fmem: zglTMemory;
  76. status: GLint;
  77. begin
  78. Result := False;
  79. // RU: проверка существования загружаемого файла.
  80. // EN: Checking the existence of the downloaded file.
  81. if not file_Exists(name) then
  82. Exit;
  83. // RU: открываем файл.
  84. // EN: open the file.
  85. if file_Open(Ftext, name, FOM_OPENR)then
  86. begin
  87. Fmem.Size := file_GetSize(Ftext);
  88. Fmem.Position := 0;
  89. // RU: подготавливаем память для загрузки шейдера.
  90. // EN: prepare memory for loading the shader.
  91. zgl_GetMem(Fmem.Memory, Fmem.Size);
  92. // RU: загружаем шейдер в память.
  93. // EN: load the shader into memory.
  94. file_Read(Ftext, Fmem.Memory^, Fmem.Size);
  95. file_Close(Ftext);
  96. // RU: исходный код шейдера и его компиляция. Обратите внимание, "Fmem.Memory"
  97. // это указатель на память, где находится строка. И мы передаём указатель
  98. // на данный участок памяти. Это работает правильно, потому что данные
  99. // должны идти под двойным указателем (PPGLchar).
  100. // EN: shader source code and its compilation. Note that "Fmem.Memory" is a
  101. // pointer to the memory where the string is located. And we pass a
  102. // pointer to this memory location. This works correctly because the data
  103. // must go under a double pointer (PPGLchar).
  104. glShaderSource(shade, 1, @Fmem.Memory, @Fmem.Size);
  105. glCompileShader(shade);
  106. // RU: освобождаем память, данный текст больше не нужен.
  107. // EN: freeing up memory, this text is no longer needed.
  108. zgl_FreeMem(Fmem.Memory);
  109. end;
  110. // RU: проверяем на успех компиляции шейдера.
  111. // EN: check for success of shader compilation.
  112. glGetShaderiv(shade, GL_COMPILE_STATUS, @status);
  113. if status <> 1 then
  114. Exit;
  115. Result := True;
  116. end;
  117. end.