| @@ -82,7 +82,7 @@ unit uglcArrayBuffer; | |||||
| interface | interface | ||||
| uses | uses | ||||
| dglOpenGL, sysutils, uglcTypes; | |||||
| {$IFNDEF OPENGL_ES}dglOpenGL{$ELSE}dglOpenGLES{$ENDIF}, sysutils, uglcTypes; | |||||
| type | type | ||||
| EglcArrayBuffer = class(Exception); | EglcArrayBuffer = class(Exception); | ||||
| @@ -103,6 +103,7 @@ type | |||||
| procedure BufferData(const aDataCount, aDataSize: Cardinal; const aUsage: TglcBufferUsage; const aData: Pointer); | procedure BufferData(const aDataCount, aDataSize: Cardinal; const aUsage: TglcBufferUsage; const aData: Pointer); | ||||
| function MapBuffer(const aAccess: TglcBufferAccess): Pointer; | function MapBuffer(const aAccess: TglcBufferAccess): Pointer; | ||||
| function MapBufferRange(const aOffset: GLintptr; const aSize: GLsizeiptr; const aAccess: TglcBufferAccess): Pointer; | |||||
| procedure UnmapBuffer; | procedure UnmapBuffer; | ||||
| procedure Bind; | procedure Bind; | ||||
| procedure Unbind; | procedure Unbind; | ||||
| @@ -133,14 +134,40 @@ begin | |||||
| result := nil; | result := nil; | ||||
| if (fDataCount * fDataSize) <= 0 then | if (fDataCount * fDataSize) <= 0 then | ||||
| exit; | exit; | ||||
| {$IFNDEF OPENGL_ES} | |||||
| result := glMapBuffer(GLenum(fTarget), GLenum(aAccess)); | result := glMapBuffer(GLenum(fTarget), GLenum(aAccess)); | ||||
| {$ELSE} | |||||
| if not GL_OES_mapbuffer then | |||||
| raise EglcArrayBuffer.Create('map buffer is not supported by video card'); | |||||
| result := glMapBufferOES(GLenum(fTarget), GLenum(aAccess)); | |||||
| {$ENDIF} | |||||
| glcCheckAndRaiseError; | glcCheckAndRaiseError; | ||||
| end; | end; | ||||
| /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c] | |||||
| function TglcArrayBuffer.MapBufferRange(const aOffset: GLintptr; const aSize: GLsizeiptr; const aAccess: TglcBufferAccess): Pointer; | |||||
| begin | |||||
| {$IFNDEF OPENGL_ES} | |||||
| if not (GL_ARB_map_buffer_range or GL_VERSION_3_0) then | |||||
| raise EglcArrayBuffer.Create('map buffer range is not supported by video card'); | |||||
| result := glMapBufferRange(GLenum(fTarget), aOffset, aSize, GLenum(aAccess)); | |||||
| {$ELSE} | |||||
| if not GL_VERSION_3_0 then | |||||
| raise EglcArrayBuffer.Create('map buffer range is not supported by video card'); | |||||
| result := glMapBufferRange(GLenum(fTarget), aOffset, aSize, GLenum(aAccess)); | |||||
| {$ENDIF} | |||||
| end; | |||||
| /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c] | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c] | ||||
| procedure TglcArrayBuffer.UnmapBuffer; | procedure TglcArrayBuffer.UnmapBuffer; | ||||
| begin | begin | ||||
| {$IFNDEF OPENGL_ES} | |||||
| glUnmapBuffer(GLenum(fTarget)); | glUnmapBuffer(GLenum(fTarget)); | ||||
| {$ELSE} | |||||
| if not (GL_OES_mapbuffer or GL_VERSION_3_0) then | |||||
| raise EglcArrayBuffer.Create('unmap buffer is not supported by video card'); | |||||
| glUnmapBuffer(GLenum(fTarget)); | |||||
| {$ENDIF} | |||||
| end; | end; | ||||
| /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c] | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c] | ||||
| @@ -158,13 +185,19 @@ end; | |||||
| /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c] | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c] | ||||
| constructor TglcArrayBuffer.Create(const aTarget: TglcBufferTarget); | constructor TglcArrayBuffer.Create(const aTarget: TglcBufferTarget); | ||||
| begin | begin | ||||
| if not GL_ARB_Vertex_Buffer_Object then | |||||
| {$IFNDEF OPENGL_ES} | |||||
| if not (GL_ARB_Vertex_Buffer_Object or GL_VERSION_2_0) then | |||||
| raise EglcArrayBuffer.Create('Create - VertexBuffer: not supported'); | |||||
| {$ELSE} | |||||
| if not GL_VERSION_2_0 then | |||||
| raise EglcArrayBuffer.Create('Create - VertexBuffer: not supported'); | raise EglcArrayBuffer.Create('Create - VertexBuffer: not supported'); | ||||
| {$ENDIF} | |||||
| inherited Create; | inherited Create; | ||||
| glGenBuffers(1, @fID); | glGenBuffers(1, @fID); | ||||
| fDataCount := 0; | fDataCount := 0; | ||||
| fDataSize := 0; | fDataSize := 0; | ||||
| fTarget := aTarget; | fTarget := aTarget; | ||||
| glcCheckAndRaiseError; | |||||
| end; | end; | ||||
| /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c] | /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////[c] | ||||
| @@ -1320,11 +1320,16 @@ type | |||||
| {$IFEND} | {$IFEND} | ||||
| TglcBitmapFormat = TglBitmapFormat; | TglcBitmapFormat = TglBitmapFormat; | ||||
| TglcBitmap1D = TglBitmap1D; | |||||
| TglcBitmap2D = TglBitmap2D; | TglcBitmap2D = TglBitmap2D; | ||||
| {$IF NOT DEFINED(OPENGL_ES)} | |||||
| TglcBitmap1D = TglBitmap1D; | |||||
| TglcBitmapCubeMap = TglBitmapCubeMap; | |||||
| TglcBitmapNormalMap = TglBitmapNormalMap; | |||||
| {$ELSEIF DEFINED(OPENGL_ES_2_0)} | |||||
| TglcBitmapCubeMap = TglBitmapCubeMap; | TglcBitmapCubeMap = TglBitmapCubeMap; | ||||
| TglcBitmapNormalMap = TglBitmapNormalMap; | TglcBitmapNormalMap = TglBitmapNormalMap; | ||||
| {$IFEND} | |||||
| const | const | ||||
| NULL_SIZE: TglBitmapPixelPosition = (Fields: []; X: 0; Y: 0); | NULL_SIZE: TglBitmapPixelPosition = (Fields: []; X: 0; Y: 0); | ||||
| @@ -57,7 +57,9 @@ type | |||||
| procedure Perspective(const aFOVAngle, aAspectRatio, aNear, aFar: Single); | procedure Perspective(const aFOVAngle, aAspectRatio, aNear, aFar: Single); | ||||
| procedure Ortho(const aLeft, aRight, aBottom, aTop, aNear, aFar: Single); | procedure Ortho(const aLeft, aRight, aBottom, aTop, aNear, aFar: Single); | ||||
| procedure Activate; | procedure Activate; | ||||
| {$IFNDEF OPENGL_ES} | |||||
| procedure Render; | procedure Render; | ||||
| {$ENDIF} | |||||
| constructor Create; | constructor Create; | ||||
| end; | end; | ||||
| @@ -82,7 +84,7 @@ type | |||||
| implementation | implementation | ||||
| uses | uses | ||||
| Math, dglOpenGL; | |||||
| Math, {$IFNDEF OPENGL_ES}dglOpenGL{$ELSE}dglOpenGLES{$ENDIF}; | |||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| //TglcFrustum/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //TglcFrustum/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| @@ -152,13 +154,14 @@ begin | |||||
| glMatrixMode(GL_PROJECTION); | glMatrixMode(GL_PROJECTION); | ||||
| glLoadIdentity; | glLoadIdentity; | ||||
| if fIsOrthogonal then | if fIsOrthogonal then | ||||
| glOrtho(fLeft, fRight, fBottom, fTop, fNear, fFar) | |||||
| {$IFNDEF OPENGL_ES}glOrtho{$ELSE}glOrthof{$ENDIF}(fLeft, fRight, fBottom, fTop, fNear, fFar) | |||||
| else | else | ||||
| glFrustum(fLeft, fRight, fBottom, fTop, fNear, fFar); | |||||
| {$IFNDEF OPENGL_ES}glFrustum{$ELSE}glFrustumf{$ENDIF}(fLeft, fRight, fBottom, fTop, fNear, fFar); | |||||
| glMatrixMode(GL_MODELVIEW); | glMatrixMode(GL_MODELVIEW); | ||||
| end; | end; | ||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| {$IFNDEF OPENGL_ES} | |||||
| procedure TglcFrustum.Render; | procedure TglcFrustum.Render; | ||||
| var | var | ||||
| min, max: TgluVector2f; | min, max: TgluVector2f; | ||||
| @@ -189,6 +192,7 @@ begin | |||||
| glVertex3f(0, 0, 0); glVertex3f(max[0], min[0], -fFar); | glVertex3f(0, 0, 0); glVertex3f(max[0], min[0], -fFar); | ||||
| glEnd; | glEnd; | ||||
| end; | end; | ||||
| {$ENDIF} | |||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| constructor TglcFrustum.Create; | constructor TglcFrustum.Create; | ||||
| @@ -39,7 +39,7 @@ unit uglcFrameBufferObject; | |||||
| interface | interface | ||||
| uses | uses | ||||
| Classes, SysUtils, fgl, dglOpenGl, uglcTypes; | |||||
| Classes, SysUtils, fgl, {$IFNDEF OPENGL_ES}dglOpenGl{$ELSE}dglOpenGLES{$ENDIF}, uglcTypes; | |||||
| type | type | ||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| @@ -126,6 +126,9 @@ type | |||||
| fWidth: Integer; | fWidth: Integer; | ||||
| fHeight: Integer; | fHeight: Integer; | ||||
| fBuffers: TglcAttachmentContainerList; | fBuffers: TglcAttachmentContainerList; | ||||
| {$IFDEF OPENGL_ES} | |||||
| fOldViewport: array[0..3] of GLint; | |||||
| {$ENDIF} | |||||
| function GetBuffer(const aIndex: Integer): TglcBuffer; | function GetBuffer(const aIndex: Integer): TglcBuffer; | ||||
| procedure SetBuffer(const aIndex: Integer; const aValue: TglcBuffer); | procedure SetBuffer(const aIndex: Integer; const aValue: TglcBuffer); | ||||
| @@ -322,8 +325,8 @@ begin | |||||
| glGenTextures(1, @fID); | glGenTextures(1, @fID); | ||||
| Bind(false); | Bind(false); | ||||
| glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); | |||||
| glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); | |||||
| glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, {$IFNDEF OPENGL_ES}GL_CLAMP{$ELSE}GL_CLAMP_TO_EDGE{$ENDIF}); | |||||
| glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, {$IFNDEF OPENGL_ES}GL_CLAMP{$ELSE}GL_CLAMP_TO_EDGE{$ENDIF}); | |||||
| glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); | ||||
| glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | ||||
| Unbind(false); | Unbind(false); | ||||
| @@ -466,6 +469,7 @@ begin | |||||
| raise EglcFrameBufferObject.Create('Incomplete attachment'); | raise EglcFrameBufferObject.Create('Incomplete attachment'); | ||||
| GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: | GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: | ||||
| raise EglcFrameBufferObject.Create('Missing attachment'); | raise EglcFrameBufferObject.Create('Missing attachment'); | ||||
| {$IFNDEF OPENGL_ES} | |||||
| GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT: | GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT: | ||||
| raise EglcFrameBufferObject.Create('Incomplete dimensions'); | raise EglcFrameBufferObject.Create('Incomplete dimensions'); | ||||
| GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT: | GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT: | ||||
| @@ -474,6 +478,7 @@ begin | |||||
| raise EglcFrameBufferObject.Create('Incomplete draw buffer'); | raise EglcFrameBufferObject.Create('Incomplete draw buffer'); | ||||
| GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER: | GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER: | ||||
| raise EglcFrameBufferObject.Create('Incomplete read buffer'); | raise EglcFrameBufferObject.Create('Incomplete read buffer'); | ||||
| {$ENDIF} | |||||
| GL_FRAMEBUFFER_UNSUPPORTED: | GL_FRAMEBUFFER_UNSUPPORTED: | ||||
| raise EglcFrameBufferObject.Create('Framebufferobjects unsupported'); | raise EglcFrameBufferObject.Create('Framebufferobjects unsupported'); | ||||
| end; | end; | ||||
| @@ -490,7 +495,9 @@ procedure TglcFrameBufferObject.UpdateAndCheckFBO; | |||||
| var | var | ||||
| buff: array of GLenum; | buff: array of GLenum; | ||||
| {$IFNDEF OPENGL_ES} | |||||
| b: GLboolean; | b: GLboolean; | ||||
| {$ENDIF} | |||||
| i: Integer; | i: Integer; | ||||
| begin | begin | ||||
| if (fBuffers.Count = 0) then | if (fBuffers.Count = 0) then | ||||
| @@ -508,14 +515,24 @@ begin | |||||
| //set Read and Draw Buffer | //set Read and Draw Buffer | ||||
| if (Length(buff) = 0) then begin | if (Length(buff) = 0) then begin | ||||
| glReadBuffer(GL_NONE); | glReadBuffer(GL_NONE); | ||||
| {$IFNDEF OPENGL_ES} | |||||
| glDrawBuffer(GL_NONE); | glDrawBuffer(GL_NONE); | ||||
| {$ELSE} | |||||
| SetLength(buff, 1); | |||||
| buff[0] := GL_NONE; | |||||
| glDrawBuffers(1, @buff[0]); | |||||
| {$ENDIF} | |||||
| end else begin | end else begin | ||||
| glDrawBuffers(Length(buff), @buff[0]); | glDrawBuffers(Length(buff), @buff[0]); | ||||
| {$IFNDEF OPENGL_ES} | |||||
| glGetBooleanv(GL_DOUBLEBUFFER, @b); | glGetBooleanv(GL_DOUBLEBUFFER, @b); | ||||
| if b then | if b then | ||||
| glReadBuffer(GL_BACK) | glReadBuffer(GL_BACK) | ||||
| else | else | ||||
| glReadBuffer(GL_FRONT); | glReadBuffer(GL_FRONT); | ||||
| {$ELSE} | |||||
| glReadBuffer(GL_FRONT); | |||||
| {$ENDIF} | |||||
| end; | end; | ||||
| Unbind(false); | Unbind(false); | ||||
| end; | end; | ||||
| @@ -612,7 +629,11 @@ procedure TglcFrameBufferObject.Bind(const aSetViewport: Boolean = true); | |||||
| begin | begin | ||||
| glBindFramebuffer(GL_FRAMEBUFFER, fID); | glBindFramebuffer(GL_FRAMEBUFFER, fID); | ||||
| if aSetViewport then begin | if aSetViewport then begin | ||||
| {$IFNDEF OPENGL_ES} | |||||
| glPushAttrib(GL_VIEWPORT_BIT); | glPushAttrib(GL_VIEWPORT_BIT); | ||||
| {$ELSE} | |||||
| glGetIntegerv(GL_VIEWPORT, @fOldViewport[0]); | |||||
| {$ENDIF} | |||||
| glViewPort(0, 0, fWidth, fHeight); | glViewPort(0, 0, fWidth, fHeight); | ||||
| end; | end; | ||||
| end; | end; | ||||
| @@ -622,7 +643,11 @@ end; | |||||
| procedure TglcFrameBufferObject.Unbind(const aResetViewport: Boolean = true); | procedure TglcFrameBufferObject.Unbind(const aResetViewport: Boolean = true); | ||||
| begin | begin | ||||
| if aResetViewport then | if aResetViewport then | ||||
| {$IFNDEF OPENGL_ES} | |||||
| glPopAttrib; | glPopAttrib; | ||||
| {$ELSE} | |||||
| glViewport(fOldViewport[0], fOldViewport[1], fOldViewport[2], fOldViewport[3]); | |||||
| {$ENDIF} | |||||
| glBindFramebuffer(GL_FRAMEBUFFER, 0); | glBindFramebuffer(GL_FRAMEBUFFER, 0); | ||||
| end; | end; | ||||
| @@ -9,7 +9,7 @@ unit uglcLight; | |||||
| interface | interface | ||||
| uses | uses | ||||
| Classes, SysUtils, dglOpenGL, ugluVector, uglcTypes; | |||||
| Classes, SysUtils, {$IFNDEF OPENGL_ES}dglOpenGl{$ELSE}dglOpenGLES{$ENDIF}, ugluVector, uglcTypes; | |||||
| type | type | ||||
| TglcMaterialRec = packed record | TglcMaterialRec = packed record | ||||
| @@ -57,7 +57,7 @@ unit uglcShader; | |||||
| interface | interface | ||||
| uses | uses | ||||
| Classes, SysUtils, fgl, dglOpenGL, uglcTypes, ugluMatrix, uglcContext; | |||||
| Classes, SysUtils, fgl, {$IFNDEF OPENGL_ES}dglOpenGl{$ELSE}dglOpenGLES{$ENDIF}, uglcTypes, ugluMatrix; | |||||
| type | type | ||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| @@ -67,19 +67,19 @@ type | |||||
| TglcShaderObject = class(TObject) | TglcShaderObject = class(TObject) | ||||
| private | private | ||||
| fAtachedTo: TglcShaderProgram; | fAtachedTo: TglcShaderProgram; | ||||
| fShaderObj: GLHandle; | |||||
| fShaderObj: GLuint; | |||||
| fShaderType: TglcShaderType; | fShaderType: TglcShaderType; | ||||
| fCode: String; | fCode: String; | ||||
| fOnLog: TglcShaderLogEvent; | fOnLog: TglcShaderLogEvent; | ||||
| fAttachedTo: TglcShaderProgram; | fAttachedTo: TglcShaderProgram; | ||||
| function GetInfoLog(aObj: GLHandle): String; | |||||
| function GetInfoLog(aObj: GLuint): String; | |||||
| function GetCompiled: Boolean; | function GetCompiled: Boolean; | ||||
| procedure Log(const aMsg: String); | procedure Log(const aMsg: String); | ||||
| procedure CreateShaderObj; | procedure CreateShaderObj; | ||||
| procedure AttachTo(const aProgram: TglcShaderProgram); | procedure AttachTo(const aProgram: TglcShaderProgram); | ||||
| public | public | ||||
| property ShaderObj : GLHandle read fShaderObj; | |||||
| property ShaderObj: GLuint read fShaderObj; | |||||
| property ShaderType: TglcShaderType read fShaderType; | property ShaderType: TglcShaderType read fShaderType; | ||||
| property Compiled: Boolean read GetCompiled; | property Compiled: Boolean read GetCompiled; | ||||
| property AtachedTo: TglcShaderProgram read fAtachedTo; | property AtachedTo: TglcShaderProgram read fAtachedTo; | ||||
| @@ -96,12 +96,12 @@ type | |||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| TglcShaderProgram = class(TglcShaderObjectList) | TglcShaderProgram = class(TglcShaderObjectList) | ||||
| private | private | ||||
| fProgramObj: GLHandle; | |||||
| fProgramObj: GLuint; | |||||
| fOnLog: TglcShaderLogEvent; | fOnLog: TglcShaderLogEvent; | ||||
| fFilename: String; | fFilename: String; | ||||
| function GetUniformLocation(const aName: String; out aPos: glInt): Boolean; | function GetUniformLocation(const aName: String; out aPos: glInt): Boolean; | ||||
| function GetInfoLog(Obj: GLHandle): String; | |||||
| function GetInfoLog(Obj: GLuint): String; | |||||
| function GetCompiled: Boolean; | function GetCompiled: Boolean; | ||||
| function GetLinked: Boolean; | function GetLinked: Boolean; | ||||
| @@ -109,7 +109,7 @@ type | |||||
| procedure Log(const msg: String); | procedure Log(const msg: String); | ||||
| procedure AttachShaderObj(const aShaderObj: TglcShaderObject); | procedure AttachShaderObj(const aShaderObj: TglcShaderObject); | ||||
| public | public | ||||
| property ProgramObj: glHandle read fProgramObj; | |||||
| property ProgramObj: GLuint read fProgramObj; | |||||
| property Filename: String read fFilename; | property Filename: String read fFilename; | ||||
| property Compiled: Boolean read GetCompiled; | property Compiled: Boolean read GetCompiled; | ||||
| property Linked: Boolean read GetLinked; | property Linked: Boolean read GetLinked; | ||||
| @@ -172,7 +172,7 @@ const | |||||
| //ließt das Log eines OpenGL-Objekts aus | //ließt das Log eines OpenGL-Objekts aus | ||||
| //@Obj: Handle des Objekts, dessen Log ausgelesen werden soll; | //@Obj: Handle des Objekts, dessen Log ausgelesen werden soll; | ||||
| //@result: Log des Objekts; | //@result: Log des Objekts; | ||||
| function TglcShaderObject.GetInfoLog(aObj: GLHandle): String; | |||||
| function TglcShaderObject.GetInfoLog(aObj: GLuint): String; | |||||
| var | var | ||||
| Msg: PChar; | Msg: PChar; | ||||
| bLen: GLint; | bLen: GLint; | ||||
| @@ -293,7 +293,7 @@ end; | |||||
| //ließt das Log eines OpenGL-Objekts aus | //ließt das Log eines OpenGL-Objekts aus | ||||
| //@Obj: Handle des Objekts, dessen Log ausgelesen werden soll; | //@Obj: Handle des Objekts, dessen Log ausgelesen werden soll; | ||||
| //@result: Log des Objekts; | //@result: Log des Objekts; | ||||
| function TglcShaderProgram.GetInfoLog(Obj: GLHandle): String; | |||||
| function TglcShaderProgram.GetInfoLog(Obj: GLuint): String; | |||||
| var | var | ||||
| Msg: PChar; | Msg: PChar; | ||||
| bLen: GLint; | bLen: GLint; | ||||
| @@ -336,12 +336,6 @@ end; | |||||
| procedure TglcShaderProgram.CreateProgramObj; | procedure TglcShaderProgram.CreateProgramObj; | ||||
| begin | begin | ||||
| if (fProgramObj = 0) then begin | if (fProgramObj = 0) then begin | ||||
| if GL_LibHandle = nil then | |||||
| raise EglcShader.Create('TglShaderProgram.Create - OpenGL not initialized'); | |||||
| if not TglcContext.IsAnyContextActive then | |||||
| raise EglcShader.Create('TglShaderProgram.Create - no valid render context'); | |||||
| fProgramObj := glCreateProgram(); | fProgramObj := glCreateProgram(); | ||||
| Log('shader program created: #'+IntToHex(fProgramObj, 4)); | Log('shader program created: #'+IntToHex(fProgramObj, 4)); | ||||
| end; | end; | ||||
| @@ -815,12 +809,14 @@ procedure TglcShaderProgram.LoadFromStream(const aStream: TStream); | |||||
| result := TglcShaderType.stVertex | result := TglcShaderType.stVertex | ||||
| else if (aStr = 'GL_FRAGMENT_SHADER') then | else if (aStr = 'GL_FRAGMENT_SHADER') then | ||||
| result := TglcShaderType.stFragment | result := TglcShaderType.stFragment | ||||
| {$IFNDEF OPENGL_ES} | |||||
| else if (aStr = 'GL_GEOMETRY_SHADER') then | else if (aStr = 'GL_GEOMETRY_SHADER') then | ||||
| result := TglcShaderType.stGeometry | result := TglcShaderType.stGeometry | ||||
| else if (aStr = 'GL_TESS_CONTROL_SHADER') then | else if (aStr = 'GL_TESS_CONTROL_SHADER') then | ||||
| result := TglcShaderType.stTessControl | result := TglcShaderType.stTessControl | ||||
| else if (aStr = 'GL_TESS_EVALUATION_SHADER') then | else if (aStr = 'GL_TESS_EVALUATION_SHADER') then | ||||
| result := TglcShaderType.stTessEvaluation | result := TglcShaderType.stTessEvaluation | ||||
| {$ENDIF} | |||||
| else | else | ||||
| raise Exception.Create('invalid shader type: ' + aStr); | raise Exception.Create('invalid shader type: ' + aStr); | ||||
| end; | end; | ||||
| @@ -924,9 +920,11 @@ var | |||||
| case aShaderType of | case aShaderType of | ||||
| TglcShaderType.stVertex: result := 'GL_VERTEX_SHADER'; | TglcShaderType.stVertex: result := 'GL_VERTEX_SHADER'; | ||||
| TglcShaderType.stFragment: result := 'GL_FRAGMENT_SHADER'; | TglcShaderType.stFragment: result := 'GL_FRAGMENT_SHADER'; | ||||
| {$IFNDEF OPENGL_ES} | |||||
| TglcShaderType.stGeometry: result := 'GL_GEOMETRY_SHADER'; | TglcShaderType.stGeometry: result := 'GL_GEOMETRY_SHADER'; | ||||
| TglcShaderType.stTessControl: result := 'GL_TESS_CONTROL_SHADER'; | TglcShaderType.stTessControl: result := 'GL_TESS_CONTROL_SHADER'; | ||||
| TglcShaderType.stTessEvaluation: result := 'GL_TESS_EVALUATION_SHADER'; | TglcShaderType.stTessEvaluation: result := 'GL_TESS_EVALUATION_SHADER'; | ||||
| {$ENDIF} | |||||
| else | else | ||||
| result := 'UNKNOWN'; | result := 'UNKNOWN'; | ||||
| end; | end; | ||||
| @@ -972,4 +970,4 @@ begin | |||||
| end; | end; | ||||
| end. | end. | ||||
| @@ -12,7 +12,7 @@ unit uglcTypes; | |||||
| interface | interface | ||||
| uses | uses | ||||
| dglOpenGL, sysutils; | |||||
| {$IFNDEF OPENGL_ES}dglOpenGL{$ELSE}dglOpenGLES{$ENDIF}, sysutils; | |||||
| type | type | ||||
| TglcFace = ( | TglcFace = ( | ||||
| @@ -20,10 +20,12 @@ type | |||||
| faBack = GL_BACK, | faBack = GL_BACK, | ||||
| faBoth = GL_FRONT_AND_BACK); | faBoth = GL_FRONT_AND_BACK); | ||||
| {$IFNDEF OPENGL_ES} | |||||
| TglcPolygonMode = ( | TglcPolygonMode = ( | ||||
| pmPoint = GL_POINT, | pmPoint = GL_POINT, | ||||
| pmLine = GL_LINE, | pmLine = GL_LINE, | ||||
| pmFill = GL_FILL); | pmFill = GL_FILL); | ||||
| {$ENDIF} | |||||
| TglcDepthFunc = ( | TglcDepthFunc = ( | ||||
| dfNever = GL_NEVER, | dfNever = GL_NEVER, | ||||
| @@ -37,7 +39,9 @@ type | |||||
| TglcClearBuffer = ( | TglcClearBuffer = ( | ||||
| cbDepthBuffer = GL_DEPTH_BUFFER_BIT, | cbDepthBuffer = GL_DEPTH_BUFFER_BIT, | ||||
| {$IFNDEF OPENGL_ES} | |||||
| cbAccumBuffer = GL_ACCUM_BUFFER_BIT, | cbAccumBuffer = GL_ACCUM_BUFFER_BIT, | ||||
| {$ENDIF} | |||||
| cbStencilBuffer = GL_STENCIL_BUFFER_BIT, | cbStencilBuffer = GL_STENCIL_BUFFER_BIT, | ||||
| cbColorBuffer = GL_COLOR_BUFFER_BIT); | cbColorBuffer = GL_COLOR_BUFFER_BIT); | ||||
| @@ -54,9 +58,13 @@ type | |||||
| mfLinear = GL_LINEAR); | mfLinear = GL_LINEAR); | ||||
| TglcTextureWrap = ( | TglcTextureWrap = ( | ||||
| {$IFNDEF OPENGL_ES} | |||||
| twClamp = GL_CLAMP, | twClamp = GL_CLAMP, | ||||
| {$ENDIF} | |||||
| twRepeat = GL_REPEAT, | twRepeat = GL_REPEAT, | ||||
| {$IFNDEF OPENGL_ES} | |||||
| twClampToBorder = GL_CLAMP_TO_BORDER, | twClampToBorder = GL_CLAMP_TO_BORDER, | ||||
| {$ENDIF} | |||||
| twClampToEdge = GL_CLAMP_TO_EDGE, | twClampToEdge = GL_CLAMP_TO_EDGE, | ||||
| twMirroredRepeat = GL_MIRRORED_REPEAT); | twMirroredRepeat = GL_MIRRORED_REPEAT); | ||||
| @@ -85,7 +93,9 @@ type | |||||
| TglcFormat = ( | TglcFormat = ( | ||||
| fmUnknown = 0, | fmUnknown = 0, | ||||
| {$IFNDEF OPENGL_ES} | |||||
| fmColorIndex = GL_COLOR_INDEX, | fmColorIndex = GL_COLOR_INDEX, | ||||
| {$ENDIF} | |||||
| fmDepthComponent = GL_DEPTH_COMPONENT, | fmDepthComponent = GL_DEPTH_COMPONENT, | ||||
| fmRed = GL_RED, | fmRed = GL_RED, | ||||
| fmGreen = GL_GREEN, | fmGreen = GL_GREEN, | ||||
| @@ -95,8 +105,10 @@ type | |||||
| fmRGBA = GL_RGBA, | fmRGBA = GL_RGBA, | ||||
| fmLuminance = GL_LUMINANCE, | fmLuminance = GL_LUMINANCE, | ||||
| fmLuminanceAlpha = GL_LUMINANCE_ALPHA, | fmLuminanceAlpha = GL_LUMINANCE_ALPHA, | ||||
| {$IFNDEF OPENGL_ES} | |||||
| fmBGR = GL_BGR, | fmBGR = GL_BGR, | ||||
| fmBGRA = GL_BGRA, | fmBGRA = GL_BGRA, | ||||
| {$ENDIF} | |||||
| fmDepthStencil = GL_DEPTH_STENCIL); | fmDepthStencil = GL_DEPTH_STENCIL); | ||||
| TglcInternalFormat = ( | TglcInternalFormat = ( | ||||
| @@ -107,6 +119,7 @@ type | |||||
| ifRGBA = GL_RGBA, | ifRGBA = GL_RGBA, | ||||
| ifLuminance = GL_LUMINANCE, | ifLuminance = GL_LUMINANCE, | ||||
| ifLuminanceAlpha = GL_LUMINANCE_ALPHA, | ifLuminanceAlpha = GL_LUMINANCE_ALPHA, | ||||
| {$IFNDEF OPENGL_ES} | |||||
| ifR3G3B2 = GL_R3_G3_B2, | ifR3G3B2 = GL_R3_G3_B2, | ||||
| ifAlpha4 = GL_ALPHA4, | ifAlpha4 = GL_ALPHA4, | ||||
| ifAlpha8 = GL_ALPHA8, | ifAlpha8 = GL_ALPHA8, | ||||
| @@ -129,19 +142,25 @@ type | |||||
| ifIntensity16 = GL_INTENSITY16, | ifIntensity16 = GL_INTENSITY16, | ||||
| ifRGB4 = GL_RGB4, | ifRGB4 = GL_RGB4, | ||||
| ifRGB5 = GL_RGB5, | ifRGB5 = GL_RGB5, | ||||
| {$ENDIF} | |||||
| ifRGB8 = GL_RGB8, | ifRGB8 = GL_RGB8, | ||||
| {$IFNDEF OPENGL_ES} | |||||
| ifRGB10 = GL_RGB10, | ifRGB10 = GL_RGB10, | ||||
| ifRGB12 = GL_RGB12, | ifRGB12 = GL_RGB12, | ||||
| ifRGB16 = GL_RGB16, | ifRGB16 = GL_RGB16, | ||||
| ifRGBA2 = GL_RGBA2, | ifRGBA2 = GL_RGBA2, | ||||
| {$ENDIF} | |||||
| ifRGBA4 = GL_RGBA4, | ifRGBA4 = GL_RGBA4, | ||||
| ifRGB5A1 = GL_RGB5_A1, | ifRGB5A1 = GL_RGB5_A1, | ||||
| ifRGBA8 = GL_RGBA8, | ifRGBA8 = GL_RGBA8, | ||||
| ifRGB10A2 = GL_RGB10_A2, | ifRGB10A2 = GL_RGB10_A2, | ||||
| {$IFNDEF OPENGL_ES} | |||||
| ifRGBA12 = GL_RGBA12, | ifRGBA12 = GL_RGBA12, | ||||
| ifRGBA16 = GL_RGBA16, | ifRGBA16 = GL_RGBA16, | ||||
| {$ENDIF} | |||||
| ifDepthComponent16 = GL_DEPTH_COMPONENT16, | ifDepthComponent16 = GL_DEPTH_COMPONENT16, | ||||
| ifDepthComponent24 = GL_DEPTH_COMPONENT24, | ifDepthComponent24 = GL_DEPTH_COMPONENT24, | ||||
| {$IFNDEF OPENGL_ES} | |||||
| ifDepthComponent32 = GL_DEPTH_COMPONENT32, | ifDepthComponent32 = GL_DEPTH_COMPONENT32, | ||||
| ifCompressedAlpha = GL_COMPRESSED_ALPHA, | ifCompressedAlpha = GL_COMPRESSED_ALPHA, | ||||
| ifCompressedLuminance = GL_COMPRESSED_LUMINANCE, | ifCompressedLuminance = GL_COMPRESSED_LUMINANCE, | ||||
| @@ -149,6 +168,7 @@ type | |||||
| ifCompressedIntensity = GL_COMPRESSED_INTENSITY, | ifCompressedIntensity = GL_COMPRESSED_INTENSITY, | ||||
| ifCompressedRGB = GL_COMPRESSED_RGB, | ifCompressedRGB = GL_COMPRESSED_RGB, | ||||
| ifCompressedRGBA = GL_COMPRESSED_RGBA, | ifCompressedRGBA = GL_COMPRESSED_RGBA, | ||||
| {$ENDIF} | |||||
| ifRGBA32f = GL_RGBA32F, | ifRGBA32f = GL_RGBA32F, | ||||
| ifRGB32f = GL_RGB32F, | ifRGB32f = GL_RGB32F, | ||||
| ifRGBA16F = GL_RGBA16F, | ifRGBA16F = GL_RGBA16F, | ||||
| @@ -156,17 +176,26 @@ type | |||||
| ifDepth24Stencil8 = GL_DEPTH24_STENCIL8, | ifDepth24Stencil8 = GL_DEPTH24_STENCIL8, | ||||
| ifSRGB = GL_SRGB, | ifSRGB = GL_SRGB, | ||||
| ifSRGB8 = GL_SRGB8, | ifSRGB8 = GL_SRGB8, | ||||
| {$IFNDEF OPENGL_ES} | |||||
| ifSRGBA = GL_SRGB_ALPHA, | ifSRGBA = GL_SRGB_ALPHA, | ||||
| {$ENDIF} | |||||
| ifSRGBA8 = GL_SRGB8_ALPHA8, | ifSRGBA8 = GL_SRGB8_ALPHA8, | ||||
| {$IFNDEF OPENGL_ES} | |||||
| ifSLuminanceAlpha = GL_SLUMINANCE_ALPHA, | ifSLuminanceAlpha = GL_SLUMINANCE_ALPHA, | ||||
| ifSLuminance8Alpha8 = GL_SLUMINANCE8_ALPHA8, | ifSLuminance8Alpha8 = GL_SLUMINANCE8_ALPHA8, | ||||
| ifSLuminance = GL_SLUMINANCE, | ifSLuminance = GL_SLUMINANCE, | ||||
| ifSLuminance8 = GL_SLUMINANCE8, | ifSLuminance8 = GL_SLUMINANCE8, | ||||
| {$ENDIF} | |||||
| ifDepth32fStencil8 = GL_DEPTH32F_STENCIL8, | ifDepth32fStencil8 = GL_DEPTH32F_STENCIL8, | ||||
| {$IFNDEF OPENGL_ES} | |||||
| ifStencil1 = GL_STENCIL_INDEX1, | ifStencil1 = GL_STENCIL_INDEX1, | ||||
| ifStencil4 = GL_STENCIL_INDEX4, | ifStencil4 = GL_STENCIL_INDEX4, | ||||
| ifStencil8 = GL_STENCIL_INDEX8, | |||||
| ifStencil16 = GL_STENCIL_INDEX16); | |||||
| {$ENDIF} | |||||
| ifStencil8 = GL_STENCIL_INDEX8 | |||||
| {$IFNDEF OPENGL_ES} | |||||
| , ifStencil16 = GL_STENCIL_INDEX16 | |||||
| {$ENDIF} | |||||
| ); | |||||
| TglcAttachment = ( | TglcAttachment = ( | ||||
| atDepthStencil = GL_DEPTH_STENCIL_ATTACHMENT, | atDepthStencil = GL_DEPTH_STENCIL_ATTACHMENT, | ||||
| @@ -191,10 +220,13 @@ type | |||||
| TglcShaderType = ( | TglcShaderType = ( | ||||
| stFragment = GL_FRAGMENT_SHADER, | stFragment = GL_FRAGMENT_SHADER, | ||||
| stVertex = GL_VERTEX_SHADER, | |||||
| stGeometry = GL_GEOMETRY_SHADER, | |||||
| stTessEvaluation = GL_TESS_EVALUATION_SHADER, | |||||
| stTessControl = GL_TESS_CONTROL_SHADER); | |||||
| stVertex = GL_VERTEX_SHADER | |||||
| {$IFNDEF OPENGL_ES} | |||||
| , stGeometry = GL_GEOMETRY_SHADER | |||||
| , stTessEvaluation = GL_TESS_EVALUATION_SHADER | |||||
| , stTessControl = GL_TESS_CONTROL_SHADER | |||||
| {$ENDIF} | |||||
| ); | |||||
| TglcBufferTarget = ( | TglcBufferTarget = ( | ||||
| btArrayBuffer = GL_ARRAY_BUFFER, | btArrayBuffer = GL_ARRAY_BUFFER, | ||||
| @@ -226,11 +258,13 @@ type | |||||
| end; | end; | ||||
| procedure glcRenderFace(const aValue: TglcFace); inline; | procedure glcRenderFace(const aValue: TglcFace); inline; | ||||
| procedure glcPolygonMode(const aFace: TglcFace; const aValue: TglcPolygonMode); inline; | |||||
| procedure glcDepthFunc(const aValue: TglcDepthFunc); inline; | procedure glcDepthFunc(const aValue: TglcDepthFunc); inline; | ||||
| procedure glcBlendFunc(const aSource, aDest: TglcBlendFactor); inline; overload; | procedure glcBlendFunc(const aSource, aDest: TglcBlendFactor); inline; overload; | ||||
| procedure glcBlendFunc(const aMode: TglcBlendMode); inline; overload; | procedure glcBlendFunc(const aMode: TglcBlendMode); inline; overload; | ||||
| procedure glcCheckAndRaiseError; | procedure glcCheckAndRaiseError; | ||||
| {$IFNDEF OPENGL_ES} | |||||
| procedure glcPolygonMode(const aFace: TglcFace; const aValue: TglcPolygonMode); inline; | |||||
| {$ENDIF} | |||||
| implementation | implementation | ||||
| @@ -264,12 +298,6 @@ begin | |||||
| end; | end; | ||||
| end; | end; | ||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure glcPolygonMode(const aFace: TglcFace; const aValue: TglcPolygonMode); | |||||
| begin | |||||
| glPolygonMode(GLenum(aFace), GLenum(aValue)); | |||||
| end; | |||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| procedure glcDepthFunc(const aValue: TglcDepthFunc); | procedure glcDepthFunc(const aValue: TglcDepthFunc); | ||||
| begin | begin | ||||
| @@ -298,20 +326,36 @@ begin | |||||
| raise EOpenGL.Create(e); | raise EOpenGL.Create(e); | ||||
| end; | end; | ||||
| {$IFNDEF OPENGL_ES} | |||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |||||
| procedure glcPolygonMode(const aFace: TglcFace; const aValue: TglcPolygonMode); | |||||
| begin | |||||
| glPolygonMode(GLenum(aFace), GLenum(aValue)); | |||||
| end; | |||||
| {$ENDIF} | |||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| //EOpenGL/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //EOpenGL/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| constructor EOpenGL.Create(const aErrorCode: GLenum); | constructor EOpenGL.Create(const aErrorCode: GLenum); | ||||
| begin | begin | ||||
| fErrorCode := aErrorCode; | fErrorCode := aErrorCode; | ||||
| {$IFNDEF OPENGL_ES} | |||||
| inherited Create(gluErrorString(fErrorCode)); | inherited Create(gluErrorString(fErrorCode)); | ||||
| {$ELSE} | |||||
| inherited Create('OpenGL Error: ' + IntToHex(fErrorCode, 8)); | |||||
| {$ENDIF} | |||||
| end; | end; | ||||
| //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
| constructor EOpenGL.Create(const aMsg: String; const aErrorCode: GLenum); | constructor EOpenGL.Create(const aMsg: String; const aErrorCode: GLenum); | ||||
| begin | begin | ||||
| fErrorCode := aErrorCode; | fErrorCode := aErrorCode; | ||||
| {$IFNDEF OPENGL_ES} | |||||
| inherited Create(aMsg + ': ' + gluErrorString(fErrorCode)) | inherited Create(aMsg + ': ' + gluErrorString(fErrorCode)) | ||||
| {$ELSE} | |||||
| inherited Create(aMsg + ': ' + IntToHex(fErrorCode, 8)); | |||||
| {$ENDIF} | |||||
| end; | end; | ||||
| end. | end. | ||||
| @@ -9,7 +9,7 @@ unit ugluVector; | |||||
| interface | interface | ||||
| uses | uses | ||||
| Classes, SysUtils, dglOpenGL; | |||||
| Classes, SysUtils, {$IFNDEF OPENGL_ES}dglOpenGL{$ELSE}dglOpenGLES{$ENDIF}; | |||||
| type | type | ||||
| //Vektortypen | //Vektortypen | ||||
| @@ -799,10 +799,10 @@ end; | |||||
| //@result: absolute Raumkoordianten des Vectors v; | //@result: absolute Raumkoordianten des Vectors v; | ||||
| function gluGetAbsCoord(const v: TgluVector3f): TgluVector3f; | function gluGetAbsCoord(const v: TgluVector3f): TgluVector3f; | ||||
| var | var | ||||
| v4: TVector4f; | |||||
| v4: TgluVector4f; | |||||
| sum: Single; | sum: Single; | ||||
| i, j: Integer; | i, j: Integer; | ||||
| m: array[0..3, 0..3] of TGLFloat; | |||||
| m: array[0..3, 0..3] of GLfloat; | |||||
| begin | begin | ||||
| for i := 0 to 2 do | for i := 0 to 2 do | ||||
| v4[i] := v[i]; | v4[i] := v[i]; | ||||