1
unit LUX.GPU.OpenGL.Atom.Progra;
3
interface //#################################################################### ■
5
uses System.SysUtils, System.Classes,
6
Winapi.OpenGL, Winapi.OpenGLext,
9
LUX.GPU.OpenGL.Atom.Porter;
11
type //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【型】
13
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【レコード】
15
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【クラス】
17
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TGLProgra
19
IGLProgra = interface( LUX.GPU.OpenGL.Atom.IGLProgra )
20
['{8EB00198-A04B-4632-8B23-1DF1B171A75F}']
23
function GetFramers :TGLPorterF;
26
property Framers :TGLPorterF read GetFramers;
29
//-------------------------------------------------------------------------
31
TGLProgra = class( TGLAtomer, IGLProgra )
40
function GetStatus :Boolean;
41
function GetErrors :TStringList;
42
function GetFramers :TGLPorterF;
44
function GetOnLinked :TProc;
45
procedure SetOnLinked( const OnLinked_:TProc );
46
procedure DoOnLinked; virtual;
48
function glGetStatus :Boolean;
49
function glGetErrors :String;
52
destructor Destroy; override;
54
property Status :Boolean read GetStatus ;
55
property Errors :TStringList read GetErrors ;
56
property Framers :TGLPorterF read GetFramers;
58
property OnLinked :TProc read GetOnLinked write SetOnLinked;
60
function GetAttribLocation( const Name_:String ) :GLuint;
61
function GetUniformLocation( const Name_:String ) :GLuint;
62
function GetProgramResourceLocation( const Kind_:GLenum; const Name_:String ) :GLuint;
63
function GetUniformBlockIndex( const Name_:String ) :GLuint;
64
function GetProgramResourceIndex( const Kind_:GLenum; const Name_:String ) :GLuint;
65
procedure BindFragDataLocation( const BinP_:GLuint; const Name_:String );
66
procedure Attach( const Shader_:IGLShader ); virtual;
67
procedure Detach( const Shader_:IGLShader ); virtual;
69
procedure Use; virtual;
70
procedure Unuse; virtual;
73
//const //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【定数】
75
//var //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【変数】
77
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【ルーチン】
79
implementation //############################################################### ■
81
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【レコード】
83
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【クラス】
85
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TGLProgra
87
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
89
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
91
/////////////////////////////////////////////////////////////////////// アクセス
93
function TGLProgra.GetStatus :Boolean;
98
function TGLProgra.GetErrors :TStringList;
103
//------------------------------------------------------------------------------
105
function TGLProgra.GetFramers :TGLPorterF;
110
/////////////////////////////////////////////////////////////////////// イベント
112
function TGLProgra.GetOnLinked :TProc;
117
procedure TGLProgra.SetOnLinked( const OnLinked_:TProc );
119
_OnLinked := OnLinked_;
122
procedure TGLProgra.DoOnLinked;
124
if Assigned( _OnLinked ) then _OnLinked;
127
/////////////////////////////////////////////////////////////////////// メソッド
129
function TGLProgra.glGetStatus :Boolean;
133
glGetProgramiv( _ID, GL_LINK_STATUS, @S );
135
Result := ( S = GL_TRUE );
138
function TGLProgra.glGetErrors :String;
144
glGetProgramiv( _ID, GL_INFO_LOG_LENGTH, @N );
148
glGetProgramInfoLog( _ID, N, @CsN, PGLchar( Cs ) );
150
SetString( Result, PGLchar( Cs ), CsN );
153
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
155
constructor TGLProgra.Create;
159
_Errors := TStringList.Create;
161
_Framers := TGLPorterF.Create( Self as IGLProgra );
163
_ID := glCreateProgram;
169
destructor TGLProgra.Destroy;
171
glDeleteProgram( _ID );
180
/////////////////////////////////////////////////////////////////////// メソッド
182
function TGLProgra.GetAttribLocation( const Name_:String ) :GLuint;
184
Result := glGetAttribLocation( _ID, PAnsiChar( AnsiString( Name_ ) ) );
187
function TGLProgra.GetUniformLocation( const Name_:String ) :GLuint;
189
Result := glGetUniformLocation( _ID, PAnsiChar( AnsiString( Name_ ) ) );
192
function TGLProgra.GetProgramResourceLocation( const Kind_:GLenum; const Name_:String ) :GLuint;
194
Result := glGetProgramResourceLocation( _ID, Kind_, PAnsiChar( AnsiString( Name_ ) ) );
197
//------------------------------------------------------------------------------
199
function TGLProgra.GetUniformBlockIndex( const Name_:String ) :GLuint;
201
Result := glGetUniformBlockIndex( _ID, PAnsiChar( AnsiString( Name_ ) ) );
204
function TGLProgra.GetProgramResourceIndex( const Kind_:GLenum; const Name_:String ) :GLuint;
206
Result := glGetProgramResourceIndex( _ID, Kind_, PAnsiChar( AnsiString( Name_ ) ) );
209
//------------------------------------------------------------------------------
211
procedure TGLProgra.BindFragDataLocation( const BinP_:GLuint; const Name_:String );
213
glBindFragDataLocation( _ID, BinP_, PGLchar( AnsiString( Name_ ) ) );
216
//------------------------------------------------------------------------------
218
procedure TGLProgra.Attach( const Shader_:IGLShader );
220
glAttachShader( _ID, Shader_.ID );
223
procedure TGLProgra.Detach( const Shader_:IGLShader );
225
glDetachShader( _ID, Shader_.ID );
228
//------------------------------------------------------------------------------
230
procedure TGLProgra.Link;
232
glLinkProgram( _ID );
234
_Status := glGetStatus;
235
_Errors.Text := glGetErrors;
240
//------------------------------------------------------------------------------
242
procedure TGLProgra.Use;
247
procedure TGLProgra.Unuse;
252
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【ルーチン】
254
//############################################################################## □
256
initialization //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 初期化
258
finalization //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 最終化
260
end. //######################################################################### ■