GXSL.Shader.pas 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604
  1. //
  2. // The graphics engine GLXEngine. The unit of GXScene for Delphi
  3. //
  4. unit GXSL.Shader;
  5. (* GLXLShader is a wrapper for all GLX shaders *)
  6. interface
  7. {$I Stage.Defines.inc}
  8. uses
  9. Winapi.OpenGL,
  10. Winapi.OpenGLext,
  11. System.Classes,
  12. System.SysUtils,
  13. Stage.VectorGeometry,
  14. Stage.VectorTypes,
  15. GXS.Texture,
  16. GXS.Context,
  17. GXS.RenderContextInfo,
  18. Stage.TextureFormat,
  19. GXSL.CustomShader,
  20. GXSL.Parameter;
  21. type
  22. TGXSLShaderParameter = class;
  23. TGXSLCustomShader = class;
  24. EGXSLShaderException = class(ECustomShaderException);
  25. TGXSLShaderEvent = procedure(Shader: TGXSLCustomShader) of object;
  26. TGXSLShaderUnApplyEvent = procedure(Shader: TGXSLCustomShader;
  27. var ThereAreMorePasses: Boolean) of object;
  28. TGXSLShaderEventEx = procedure(Shader: TGXSLCustomShader;
  29. Sender: TObject) of object;
  30. TgxActiveAttrib = record
  31. Name: string;
  32. Size: Integer;
  33. AType: TgxSLDataType;
  34. Location: Integer;
  35. end;
  36. TgxActiveAttribArray = array of TgxActiveAttrib;
  37. TGXSLCustomShader = class(TgxCustomShader)
  38. private
  39. FGXSLProg: TgxProgramHandle;
  40. FParam: TGXSLShaderParameter;
  41. FActiveVarying: TStrings;
  42. FTransformFeedBackMode: TgxTransformFeedBackMode;
  43. FOnInitialize: TGXSLShaderEvent;
  44. FOnApply: TGXSLShaderEvent;
  45. FOnUnApply: TGXSLShaderUnApplyEvent;
  46. FOnInitializeEx: TGXSLShaderEventEx;
  47. FOnApplyEx: TGXSLShaderEventEx;
  48. function GetParam(const Index: string): TGXSLShaderParameter;
  49. function GetDirectParam(const Index: Cardinal): TGXSLShaderParameter;
  50. procedure OnChangeActiveVarying(Sender: TObject);
  51. protected
  52. property OnApply: TGXSLShaderEvent read FOnApply write FOnApply;
  53. property OnUnApply: TGXSLShaderUnApplyEvent read FOnUnApply write FOnUnApply;
  54. property OnInitialize: TGXSLShaderEvent read FOnInitialize write FOnInitialize;
  55. property OnInitializeEx: TGXSLShaderEventEx read FOnInitializeEx write FOnInitializeEx;
  56. property OnApplyEx: TGXSLShaderEventEx read FOnApplyEx write FOnApplyEx;
  57. function GetGXSLProg: TgxProgramHandle; virtual;
  58. function GetCurrentParam: TGXSLShaderParameter; virtual;
  59. procedure SetActiveVarying(const Value: TStrings);
  60. procedure SetTransformFeedBackMode(const Value: TgxTransformFeedBackMode);
  61. procedure DoInitialize(var rci: TgxRenderContextInfo; Sender: TObject); override;
  62. procedure DoFinalize; override;
  63. procedure DoApply(var rci: TgxRenderContextInfo; Sender: TObject); override;
  64. function DoUnApply(var rci: TgxRenderContextInfo): Boolean; override;
  65. public
  66. constructor Create(AOwner: TComponent); override;
  67. destructor Destroy; override;
  68. procedure Assign(Source: TPersistent); override;
  69. function ShaderSupported: Boolean; override;
  70. function GetActiveAttribs: TgxActiveAttribArray;
  71. property Param[const Index: string]: TGXSLShaderParameter read GetParam;
  72. property DirectParam[const Index: Cardinal]: TGXSLShaderParameter read GetDirectParam;
  73. property ActiveVarying: TStrings read FActiveVarying write SetActiveVarying;
  74. property TransformFeedBackMode: TgxTransformFeedBackMode read FTransformFeedBackMode write SetTransformFeedBackMode default tfbmInterleaved;
  75. end;
  76. // Wrapper around a parameter of a GLSL program.
  77. TGXSLShaderParameter = class(TgxCustomShaderParameter)
  78. private
  79. FGXSLProg: TgxProgramHandle;
  80. FParameterID: Integer;
  81. protected
  82. function GetAsVector1f: Single; override;
  83. function GetAsVector2f: TVector2f; override;
  84. function GetAsVector3f: TVector3f; override;
  85. function GetAsVector4f: TVector4f; override;
  86. function GetAsVector1i: Integer; override;
  87. function GetAsVector2i: TVector2i; override;
  88. function GetAsVector3i: TVector3i; override;
  89. function GetAsVector4i: TVector4i; override;
  90. function GetAsVector1ui: Cardinal; override;
  91. function GetAsVector2ui: TVector2ui; override;
  92. function GetAsVector3ui: TVector3ui; override;
  93. function GetAsVector4ui: TVector4ui; override;
  94. procedure SetAsVector1f(const Value: Single); override;
  95. procedure SetAsVector2f(const Value: TVector2f); override;
  96. procedure SetAsVector3f(const Value: TVector3f); override;
  97. procedure SetAsVector4f(const Value: TVector4f); override;
  98. procedure SetAsVector1i(const Value: Integer); override;
  99. procedure SetAsVector2i(const Value: TVector2i); override;
  100. procedure SetAsVector3i(const Value: TVector3i); override;
  101. procedure SetAsVector4i(const Value: TVector4i); override;
  102. procedure SetAsVector1ui(const Value: Cardinal); override;
  103. procedure SetAsVector2ui(const Value: TVector2ui); override;
  104. procedure SetAsVector3ui(const Value: TVector3ui); override;
  105. procedure SetAsVector4ui(const Value: TVector4ui); override;
  106. function GetAsMatrix2f: TMatrix2f; override;
  107. function GetAsMatrix3f: TMatrix3f; override;
  108. function GetAsMatrix4f: TMatrix4f; override;
  109. procedure SetAsMatrix2f(const Value: TMatrix2f); override;
  110. procedure SetAsMatrix3f(const Value: TMatrix3f); override;
  111. procedure SetAsMatrix4f(const Value: TMatrix4f); override;
  112. function GetAsCustomTexture(const TextureIndex: Integer;
  113. TextureTarget: TglTextureTarget): Cardinal; override;
  114. procedure SetAsCustomTexture(const TextureIndex: Integer;
  115. TextureTarget: TglTextureTarget; const Value: Cardinal); override;
  116. function GetAsUniformBuffer: GLenum; override;
  117. procedure SetAsUniformBuffer( UBO: GLenum); override;
  118. public
  119. // Nothing here ...yet.
  120. end;
  121. TGXSLShader = class(TGXSLCustomShader)
  122. published
  123. property FragmentProgram;
  124. property VertexProgram;
  125. property GeometryProgram;
  126. property OnApply;
  127. property OnApplyEx;
  128. property OnUnApply;
  129. property OnInitialize;
  130. property OnInitializeEx;
  131. property ShaderStyle;
  132. property FailedInitAction;
  133. property ActiveVarying;
  134. property TransformFeedBackMode;
  135. end;
  136. //=============================================================
  137. implementation
  138. //=============================================================
  139. uses
  140. GXS.State;
  141. //---------------------------------
  142. // TGXSLCustomShader
  143. //---------------------------------
  144. procedure TGXSLCustomShader.DoApply(var rci: TgxRenderContextInfo; Sender: TObject);
  145. begin
  146. FGXSLProg.UseProgramObject;
  147. if Assigned(FOnApply) then
  148. FOnApply(Self);
  149. if Assigned(FOnApplyEx) then
  150. FOnApplyEx(Self, Sender);
  151. end;
  152. procedure TGXSLCustomShader.DoInitialize(var rci: TgxRenderContextInfo; Sender: TObject);
  153. const
  154. cBufferMode: array[tfbmInterleaved..tfbmSeparate] of GLenum = (
  155. GL_INTERLEAVED_ATTRIBS_EXT, GL_SEPARATE_ATTRIBS_EXT);
  156. var
  157. i, NumVarying: Integer;
  158. sVaryings: array of AnsiString;
  159. pVaryings: array of PGLChar;
  160. begin
  161. try
  162. if not ShaderSupported then
  163. HandleFailedInitialization
  164. else
  165. try
  166. FGXSLProg.AllocateHandle;
  167. if FGXSLProg.IsDataNeedUpdate then
  168. begin
  169. if Name <> '' then
  170. FGXSLProg.Name := Name
  171. else
  172. FGXSLProg.Name := ClassName;
  173. FGXSLProg.DetachAllObject;
  174. if VertexProgram.Enabled then
  175. FGXSLProg.AddShader(TgxVertexShaderHandle, VertexProgram.Code.Text, FDebugMode);
  176. if FragmentProgram.Enabled then
  177. FGXSLProg.AddShader(TgxFragmentShaderHandle, FragmentProgram.Code.Text, FDebugMode);
  178. if GeometryProgram.Enabled then
  179. FGXSLProg.AddShader(TgxGeometryShaderHandle, GeometryProgram.Code.Text, FDebugMode);
  180. if VertexProgram.Enabled or FragmentProgram.Enabled or GeometryProgram.Enabled then
  181. begin
  182. if GeometryProgram.Enabled then
  183. begin
  184. glProgramParameteri(FGXSLProg.Handle, GL_GEOMETRY_INPUT_TYPE_EXT,
  185. cGXgsInTypes[GeometryProgram.InputPrimitiveType]);
  186. glProgramParameteri(FGXSLProg.Handle, GL_GEOMETRY_OUTPUT_TYPE_EXT,
  187. cGXgsOutTypes[GeometryProgram.OutputPrimitiveType]);
  188. glProgramParameteri(FGXSLProg.Handle, GL_GEOMETRY_VERTICES_OUT_EXT,
  189. GeometryProgram.VerticesOut);
  190. end;
  191. NumVarying := FActiveVarying.Count;
  192. if NumVarying > 0 then
  193. begin
  194. // Activate varying
  195. SetLength(sVaryings, NumVarying);
  196. SetLength(pVaryings, NumVarying);
  197. for i := 0 to NumVarying - 1 do
  198. begin
  199. sVaryings[i] := AnsiString(FActiveVarying.Strings[i]) + #0;
  200. pVaryings[i] := PAnsiChar( sVaryings[i] );
  201. end;
  202. glTransformFeedbackVaryings(
  203. FGXSLProg.Handle, NumVarying, @pVaryings[0],
  204. cBufferMode[FTransformFeedBackMode] );
  205. end;
  206. if (not FGXSLProg.LinkProgram) then
  207. raise eGXSLShaderException.Create(FGXSLProg.InfoLog);
  208. end;
  209. FGXSLProg.NotifyDataUpdated;
  210. end;
  211. except
  212. on E: Exception do
  213. begin
  214. Enabled := False;
  215. HandleFailedInitialization(E.Message);
  216. end;
  217. end;
  218. finally
  219. if Enabled then
  220. try
  221. if Assigned(FOnInitialize) then
  222. begin
  223. FGXSLProg.UseProgramObject;
  224. FOnInitialize(Self);
  225. FGXSLProg.EndUseProgramObject;
  226. end;
  227. if Assigned(FOnInitializeEx) then
  228. begin
  229. FGXSLProg.UseProgramObject;
  230. FOnInitializeEx(Self, Sender);
  231. FGXSLProg.EndUseProgramObject;
  232. end;
  233. if (not FGXSLProg.ValidateProgram) then
  234. raise eGXSLShaderException.Create(FGXSLProg.InfoLog);
  235. except
  236. on E: Exception do
  237. begin
  238. Enabled := False;
  239. HandleFailedInitialization(E.Message);
  240. end;
  241. end;
  242. end;
  243. end;
  244. function TGXSLCustomShader.DoUnApply(var rci: TgxRenderContextInfo): Boolean;
  245. begin
  246. Result := False;
  247. if Assigned(FOnUnApply) then
  248. FOnUnApply(Self, Result);
  249. if not Result then
  250. FGXSLProg.EndUseProgramObject;
  251. end;
  252. function TGXSLCustomShader.ShaderSupported: Boolean;
  253. begin
  254. Result := True; (* (GL_ARB_shader_objects and GL_ARB_vertex_program and
  255. GL_ARB_vertex_shader and GL_ARB_fragment_shader); *)
  256. end;
  257. function TGXSLCustomShader.GetActiveAttribs: TgxActiveAttribArray;
  258. var
  259. LRci: TgxRenderContextInfo;
  260. i, j: Integer;
  261. buff: array[0..127] of AnsiChar;
  262. len: GLsizei;
  263. max: GLInt;
  264. glType: GLEnum;
  265. begin
  266. DoInitialize(LRci, Self);
  267. SetLength(Result, 16);
  268. j := 0;
  269. if FGXSLProg.Handle<>0 then
  270. begin
  271. glGetProgramiv(FGXSLProg.Handle, GL_ACTIVE_ATTRIBUTES, @max);
  272. for i := 0 to 16 - 1 do
  273. if i<max then
  274. begin
  275. glGetActiveAttrib(FGXSLProg.Handle, i, Length(buff), @len, @Result[j].Size,
  276. @glType, @buff[0]);
  277. if glType > 0 then
  278. with Result[j] do
  279. begin
  280. case glType of
  281. GL_FLOAT: AType := GLSLType1F;
  282. GL_FLOAT_VEC2: AType := GLSLType2F;
  283. GL_FLOAT_VEC3: AType := GLSLType3F;
  284. GL_FLOAT_VEC4: AType := GLSLType4F;
  285. GL_INT: AType := GLSLType1I;
  286. GL_INT_VEC2: AType := GLSLType2I;
  287. GL_INT_VEC3: AType := GLSLType3I;
  288. GL_INT_VEC4: AType := GLSLType4I;
  289. GL_UNSIGNED_INT: AType := GLSLType1UI;
  290. GL_UNSIGNED_INT_VEC2: AType := GLSLType2UI;
  291. GL_UNSIGNED_INT_VEC3: AType := GLSLType3UI;
  292. GL_UNSIGNED_INT_VEC4: AType := GLSLType4UI;
  293. GL_BOOL: AType := GLSLType1I;
  294. GL_BOOL_VEC2: AType := GLSLType2I;
  295. GL_BOOL_VEC3: AType := GLSLType3I;
  296. GL_BOOL_VEC4: AType := GLSLType4I;
  297. GL_FLOAT_MAT2: AType := GLSLTypeMat2F;
  298. GL_FLOAT_MAT3: AType := GLSLTypeMat3F;
  299. GL_FLOAT_MAT4: AType := GLSLTypeMat4F;
  300. end;
  301. Name := Copy(string(buff), 0, len);
  302. Location := i;
  303. Inc(j);
  304. end;
  305. end;
  306. end;
  307. SetLength(Result, j);
  308. end;
  309. procedure TGXSLCustomShader.Assign(Source: TPersistent);
  310. begin
  311. inherited Assign(Source);
  312. if Source is TGXSLCustomShader then
  313. begin
  314. FreeAndNil(FGXSLProg); //just free the handle for it to be recreated on next initialization
  315. end;
  316. end;
  317. procedure TGXSLCustomShader.DoFinalize;
  318. begin
  319. inherited;
  320. if Assigned(FGXSLProg) then
  321. FGXSLProg.NotifyChangesOfData;
  322. end;
  323. function TGXSLCustomShader.GetGXSLProg: TgxProgramHandle;
  324. begin
  325. Result := FGXSLProg;
  326. end;
  327. function TGXSLCustomShader.GetParam(
  328. const Index: string): TGXSLShaderParameter;
  329. begin
  330. FParam.FParameterID := FGXSLProg.GetUniformLocation(Index);
  331. Result := FParam;
  332. end;
  333. function TGXSLCustomShader.GetDirectParam(
  334. const Index: Cardinal): TGXSLShaderParameter;
  335. begin
  336. FParam.FParameterID := Index;
  337. Result := FParam;
  338. end;
  339. function TGXSLCustomShader.GetCurrentParam: TGXSLShaderParameter;
  340. begin
  341. Result := FParam;
  342. end;
  343. constructor TGXSLCustomShader.Create(AOwner: TComponent);
  344. begin
  345. inherited;
  346. FGXSLProg := TgxProgramHandle.Create;
  347. FParam := TGXSLShaderParameter.Create;
  348. FParam.FGXSLProg := FGXSLProg;
  349. FActiveVarying := TStringList.Create;
  350. TStringList(FActiveVarying).OnChange := OnChangeActiveVarying;
  351. FTransformFeedBackMode := tfbmInterleaved;
  352. end;
  353. destructor TGXSLCustomShader.Destroy;
  354. begin
  355. FreeAndNil(FGXSLProg);
  356. FreeAndNil(FParam);
  357. FreeAndNil(FActiveVarying);
  358. inherited;
  359. end;
  360. procedure TGXSLCustomShader.SetActiveVarying(const Value: TStrings);
  361. begin
  362. FActiveVarying.Assign(Value);
  363. NotifyChange(Self);
  364. end;
  365. procedure TGXSLCustomShader.SetTransformFeedBackMode(const Value: TgxTransformFeedBackMode);
  366. begin
  367. if Value <> FTransformFeedBackMode then
  368. begin
  369. FTransformFeedBackMode := Value;
  370. NotifyChange(Self);
  371. end;
  372. end;
  373. procedure TGXSLCustomShader.OnChangeActiveVarying(Sender: TObject);
  374. begin
  375. NotifyChange(Self);
  376. end;
  377. //------------------------------------------------------------
  378. // TGXSLShaderParameter
  379. //------------------------------------------------------------
  380. function TGXSLShaderParameter.GetAsCustomTexture(
  381. const TextureIndex: Integer; TextureTarget: TglTextureTarget): Cardinal;
  382. begin
  383. glGetUniformiv(FGXSLProg.Handle, TextureIndex, @Result);
  384. end;
  385. function TGXSLShaderParameter.GetAsMatrix2f: TMatrix2f;
  386. begin
  387. glGetUniformfv(FGXSLProg.Handle, FParameterID, @Result);
  388. end;
  389. function TGXSLShaderParameter.GetAsMatrix3f: TMatrix3f;
  390. begin
  391. glGetUniformfv(FGXSLProg.Handle, FParameterID, @Result);
  392. end;
  393. function TGXSLShaderParameter.GetAsMatrix4f: TMatrix4f;
  394. begin
  395. glGetUniformfv(FGXSLProg.Handle, FParameterID, @Result);
  396. end;
  397. function TGXSLShaderParameter.GetAsVector1f: Single;
  398. begin
  399. glGetUniformfv(FGXSLProg.Handle, FParameterID, @Result);
  400. end;
  401. function TGXSLShaderParameter.GetAsVector1i: Integer;
  402. begin
  403. glGetUniformiv(FGXSLProg.Handle, FParameterID, @Result);
  404. end;
  405. function TGXSLShaderParameter.GetAsVector2f: TVector2f;
  406. begin
  407. glGetUniformfv(FGXSLProg.Handle, FParameterID, @Result);
  408. end;
  409. function TGXSLShaderParameter.GetAsVector2i: TVector2i;
  410. begin
  411. glGetUniformiv(FGXSLProg.Handle, FParameterID, @Result);
  412. end;
  413. function TGXSLShaderParameter.GetAsVector3f: TVector3f;
  414. begin
  415. glGetUniformfv(FGXSLProg.Handle, FParameterID, @Result);
  416. end;
  417. function TGXSLShaderParameter.GetAsVector3i: TVector3i;
  418. begin
  419. glGetUniformiv(FGXSLProg.Handle, FParameterID, @Result);
  420. end;
  421. function TGXSLShaderParameter.GetAsVector4f: TVector4f;
  422. begin
  423. glGetUniformfv(FGXSLProg.Handle, FParameterID, @Result);
  424. end;
  425. function TGXSLShaderParameter.GetAsVector4i: TVector4i;
  426. begin
  427. glGetUniformiv(FGXSLProg.Handle, FParameterID, @Result);
  428. end;
  429. procedure TGXSLShaderParameter.SetAsCustomTexture(
  430. const TextureIndex: Integer; TextureTarget: TglTextureTarget;
  431. const Value: Cardinal);
  432. begin
  433. CurrentContext.gxStates.TextureBinding[TextureIndex, TextureTarget] := Value;
  434. glUniform1i(FParameterID, TextureIndex);
  435. end;
  436. procedure TGXSLShaderParameter.SetAsMatrix2f(const Value: TMatrix2f);
  437. begin
  438. glUniformMatrix2fv(FParameterID, 1, 1, @Value);
  439. end;
  440. procedure TGXSLShaderParameter.SetAsMatrix3f(const Value: TMatrix3f);
  441. begin
  442. glUniformMatrix3fv(FParameterID, 1, 1, @Value);
  443. end;
  444. procedure TGXSLShaderParameter.SetAsMatrix4f(const Value: TMatrix4f);
  445. begin
  446. glUniformMatrix4fv(FParameterID, 1, 1, @Value);
  447. end;
  448. procedure TGXSLShaderParameter.SetAsVector1f(const Value: Single);
  449. begin
  450. glUniform1f(FParameterID, Value);
  451. end;
  452. procedure TGXSLShaderParameter.SetAsVector1i(const Value: Integer);
  453. begin
  454. glUniform1i(FParameterID, Value);
  455. end;
  456. procedure TGXSLShaderParameter.SetAsVector2f(const Value: TVector2f);
  457. begin
  458. glUniform2f(FParameterID, Value.X, Value.Y);
  459. end;
  460. procedure TGXSLShaderParameter.SetAsVector2i(const Value: TVector2i);
  461. begin
  462. glUniform2i(FParameterID, Value.X, Value.Y);
  463. end;
  464. procedure TGXSLShaderParameter.SetAsVector3f(const Value: TVector3f);
  465. begin
  466. glUniform3f(FParameterID, Value.X, Value.Y, Value.Z);
  467. end;
  468. procedure TGXSLShaderParameter.SetAsVector3i(const Value: TVector3i);
  469. begin
  470. glUniform3i(FParameterID, Value.X, Value.Y, Value.Z);
  471. end;
  472. procedure TGXSLShaderParameter.SetAsVector4f(const Value: TVector4f);
  473. begin
  474. glUniform4f(FParameterID, Value.X, Value.Y, Value.Z, Value.W);
  475. end;
  476. procedure TGXSLShaderParameter.SetAsVector4i(const Value: TVector4i);
  477. begin
  478. glUniform4i(FParameterID, Value.X, Value.Y, Value.Z, Value.W);
  479. end;
  480. function TGXSLShaderParameter.GetAsUniformBuffer: GLenum;
  481. begin
  482. glGetUniformiv(FGXSLProg.Handle, FParameterID, @Result);
  483. end;
  484. function TGXSLShaderParameter.GetAsVector1ui: GLuint;
  485. begin
  486. glGetUniformuiv(FGXSLProg.Handle, FParameterID, @Result);
  487. end;
  488. procedure TGXSLShaderParameter.SetAsVector1ui(const Value: GLuint);
  489. begin
  490. glUniform1ui(FParameterID, Value);
  491. end;
  492. function TGXSLShaderParameter.GetAsVector2ui: TVector2ui;
  493. begin
  494. glGetUniformiv(FGXSLProg.Handle, FParameterID, @Result);
  495. end;
  496. procedure TGXSLShaderParameter.SetAsVector2ui(const Value: TVector2ui);
  497. begin
  498. glUniform2ui(FParameterID, Value.X, Value.Y);
  499. end;
  500. function TGXSLShaderParameter.GetAsVector3ui: TVector3ui;
  501. begin
  502. glGetUniformiv(FGXSLProg.Handle, FParameterID, @Result);
  503. end;
  504. procedure TGXSLShaderParameter.SetAsVector3ui(const Value: TVector3ui);
  505. begin
  506. glUniform3ui(FParameterID, Value.X, Value.Y, Value.Z);
  507. end;
  508. function TGXSLShaderParameter.GetAsVector4ui: TVector4ui;
  509. begin
  510. glGetUniformiv(FGXSLProg.Handle, FParameterID, @Result);
  511. end;
  512. procedure TGXSLShaderParameter.SetAsVector4ui(const Value: TVector4ui);
  513. begin
  514. glUniform4ui(FParameterID, Value.X, Value.Y, Value.Z, Value.W);
  515. end;
  516. procedure TGXSLShaderParameter.SetAsUniformBuffer(UBO: Cardinal);
  517. begin
  518. CurrentContext.gxStates.UniformBufferBinding := UBO;
  519. glUniformBufferEXT(FGXSLProg.Handle, FParameterID, UBO);
  520. end;
  521. //=======================================================
  522. initialization
  523. //=======================================================
  524. RegisterClasses([TGXSLCustomShader, TGXSLShader]);
  525. end.