Class ExtShaderProgram
- All Implemented Interfaces:
com.badlogic.gdx.utils.Disposable
- Direct Known Subclasses:
TessellationShaderProgram
public class ExtShaderProgram
extends java.lang.Object
implements com.badlogic.gdx.utils.Disposable
A shader program encapsulates a vertex and fragment shader pair linked to form a shader program.
After construction a ShaderProgram can be used to draw Mesh
. To make the GPU use a specific ShaderProgram the programs
begin()
method must be used which effectively binds the program.
When a ShaderProgram is bound one can set uniforms, vertex attributes and attributes as needed via the respective methods.
A ShaderProgram can be unbound with a call to end()
A ShaderProgram must be disposed via a call to dispose()
when it is no longer needed
ShaderPrograms are managed. In case the OpenGL context is lost all shaders get invalidated and have to be reloaded. This happens on Android when a user switches to another application or receives an incoming call. Managed ShaderPrograms are automatically reloaded when the OpenGL context is recreated so you don't have to do this manually.
-
Field Summary
Fields Modifier and Type Field Description static java.lang.String
COLOR_ATTRIBUTE
default name for color attributesstatic boolean
pedantic
flag indicating whether attributes & uniforms must be present at all timesstatic java.lang.String
POSITION_ATTRIBUTE
default name for position attributesstatic java.lang.String
prependFragmentCode
code that is always added to every fragment shader code, typically used to inject a #version line.static java.lang.String
prependVertexCode
code that is always added to the vertex shader code, typically used to inject a #version line.static java.lang.String
TEXCOORD_ATTRIBUTE
default name for texture coordinates attributes, append texture unit number -
Constructor Summary
Constructors Constructor Description ExtShaderProgram()
ExtShaderProgram(com.badlogic.gdx.files.FileHandle vertexShader, com.badlogic.gdx.files.FileHandle fragmentShader)
ExtShaderProgram(java.lang.String vertexShader, java.lang.String fragmentShader)
Constructs a new ShaderProgram and immediately compiles it.ExtShaderProgram(java.lang.String vertexFile, java.lang.String fragmentFile, java.lang.String vertexShaderCode, java.lang.String fragmentShaderCode)
Constructs a new ShaderProgram and immediately compiles it. -
Method Summary
Modifier and Type Method Description void
begin()
Makes OpenGL ES 2.0 use this vertex and fragment shader pair.static void
clearAllShaderPrograms(com.badlogic.gdx.Application app)
protected int
createProgram()
void
disableVertexAttribute(int location)
void
disableVertexAttribute(java.lang.String name)
Disables the vertex attribute with the given namevoid
dispose()
Disposes all resources associated with this shader.void
enableVertexAttribute(int location)
void
enableVertexAttribute(java.lang.String name)
Enables the vertex attribute with the given namevoid
end()
Disables this shader.int
fetchUniformLocation(java.lang.String name, boolean pedantic)
int
getAttributeLocation(java.lang.String name)
java.lang.String[]
getAttributes()
int
getAttributeSize(java.lang.String name)
int
getAttributeType(java.lang.String name)
java.lang.String
getFragmentShaderSource()
java.lang.String
getLog()
static java.lang.String
getManagedStatus()
static int
getNumManagedShaderPrograms()
int
getUniformLocation(java.lang.String name)
java.lang.String[]
getUniforms()
int
getUniformSize(java.lang.String name)
int
getUniformType(java.lang.String name)
java.lang.String
getVertexShaderSource()
boolean
hasAttribute(java.lang.String name)
boolean
hasUniform(java.lang.String name)
static void
invalidateAllShaderPrograms(com.badlogic.gdx.Application app)
Invalidates all shaders so the next time they are used new handles are generatedboolean
isCompiled()
void
setAttributef(java.lang.String name, float value1, float value2, float value3, float value4)
Sets the given attributevoid
setUniform1fv(int location, float[] values, int offset, int length)
void
setUniform1fv(java.lang.String name, float[] values, int offset, int length)
void
setUniform2fv(int location, float[] values, int offset, int length)
void
setUniform2fv(java.lang.String name, float[] values, int offset, int length)
void
setUniform3fv(int location, float[] values, int offset, int length)
void
setUniform3fv(java.lang.String name, float[] values, int offset, int length)
void
setUniform4fv(int location, float[] values, int offset, int length)
void
setUniform4fv(java.lang.String name, float[] values, int offset, int length)
void
setUniformf(int location, float value)
void
setUniformf(int location, float value1, float value2)
void
setUniformf(int location, float value1, float value2, float value3)
void
setUniformf(int location, float value1, float value2, float value3, float value4)
void
setUniformf(int location, com.badlogic.gdx.graphics.Color values)
void
setUniformf(int location, com.badlogic.gdx.math.Vector2 values)
void
setUniformf(int location, com.badlogic.gdx.math.Vector3 values)
void
setUniformf(java.lang.String name, float value)
Sets the uniform with the given name.void
setUniformf(java.lang.String name, float value1, float value2)
Sets the uniform with the given name.void
setUniformf(java.lang.String name, float value1, float value2, float value3)
Sets the uniform with the given name.void
setUniformf(java.lang.String name, float value1, float value2, float value3, float value4)
Sets the uniform with the given name.void
setUniformf(java.lang.String name, com.badlogic.gdx.graphics.Color values)
Sets the uniform with the given name.void
setUniformf(java.lang.String name, com.badlogic.gdx.math.Vector2 values)
Sets the uniform with the given name.void
setUniformf(java.lang.String name, com.badlogic.gdx.math.Vector3 values)
Sets the uniform with the given name.void
setUniformi(int location, int value)
void
setUniformi(int location, int value1, int value2)
void
setUniformi(int location, int value1, int value2, int value3)
void
setUniformi(int location, int value1, int value2, int value3, int value4)
void
setUniformi(java.lang.String name, int value)
Sets the uniform with the given name.void
setUniformi(java.lang.String name, int value1, int value2)
Sets the uniform with the given name.void
setUniformi(java.lang.String name, int value1, int value2, int value3)
Sets the uniform with the given name.void
setUniformi(java.lang.String name, int value1, int value2, int value3, int value4)
Sets the uniform with the given name.void
setUniformMatrix(int location, com.badlogic.gdx.math.Matrix3 matrix)
void
setUniformMatrix(int location, com.badlogic.gdx.math.Matrix3 matrix, boolean transpose)
void
setUniformMatrix(int location, com.badlogic.gdx.math.Matrix4 matrix)
void
setUniformMatrix(int location, com.badlogic.gdx.math.Matrix4 matrix, boolean transpose)
void
setUniformMatrix(java.lang.String name, com.badlogic.gdx.math.Matrix3 matrix)
Sets the uniform matrix with the given name.void
setUniformMatrix(java.lang.String name, com.badlogic.gdx.math.Matrix3 matrix, boolean transpose)
Sets the uniform matrix with the given name.void
setUniformMatrix(java.lang.String name, com.badlogic.gdx.math.Matrix4 matrix)
Sets the uniform matrix with the given name.void
setUniformMatrix(java.lang.String name, com.badlogic.gdx.math.Matrix4 matrix, boolean transpose)
Sets the uniform matrix with the given name.void
setUniformMatrix3fv(java.lang.String name, java.nio.FloatBuffer buffer, int count, boolean transpose)
Sets an array of uniform matrices with the given name.void
setUniformMatrix4fv(int location, float[] values, int offset, int length)
void
setUniformMatrix4fv(java.lang.String name, float[] values, int offset, int length)
void
setUniformMatrix4fv(java.lang.String name, java.nio.FloatBuffer buffer, int count, boolean transpose)
Sets an array of uniform matrices with the given name.void
setVertexAttribute(int location, int size, int type, boolean normalize, int stride, int offset)
void
setVertexAttribute(int location, int size, int type, boolean normalize, int stride, java.nio.Buffer buffer)
void
setVertexAttribute(java.lang.String name, int size, int type, boolean normalize, int stride, int offset)
Sets the vertex attribute with the given name.void
setVertexAttribute(java.lang.String name, int size, int type, boolean normalize, int stride, java.nio.Buffer buffer)
Sets the vertex attribute with the given name.Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Field Details
-
POSITION_ATTRIBUTE
public static final java.lang.String POSITION_ATTRIBUTEdefault name for position attributes- See Also:
- Constant Field Values
-
COLOR_ATTRIBUTE
public static final java.lang.String COLOR_ATTRIBUTEdefault name for color attributes- See Also:
- Constant Field Values
-
TEXCOORD_ATTRIBUTE
public static final java.lang.String TEXCOORD_ATTRIBUTEdefault name for texture coordinates attributes, append texture unit number- See Also:
- Constant Field Values
-
pedantic
public static boolean pedanticflag indicating whether attributes & uniforms must be present at all times -
prependVertexCode
public static java.lang.String prependVertexCodecode that is always added to the vertex shader code, typically used to inject a #version line. Note that this is added as-is, you should include a newline (`\n`) if needed. -
prependFragmentCode
public static java.lang.String prependFragmentCodecode that is always added to every fragment shader code, typically used to inject a #version line. Note that this is added as-is, you should include a newline (`\n`) if needed.
-
-
Constructor Details
-
ExtShaderProgram
public ExtShaderProgram() -
ExtShaderProgram
public ExtShaderProgram(java.lang.String vertexFile, java.lang.String fragmentFile, java.lang.String vertexShaderCode, java.lang.String fragmentShaderCode)Constructs a new ShaderProgram and immediately compiles it.- Parameters:
vertexFile
- The vertex shader file.fragmentFile
- The fragment shader file.vertexShaderCode
- The vertex shader code.fragmentShaderCode
- The fragment shader code.
-
ExtShaderProgram
public ExtShaderProgram(java.lang.String vertexShader, java.lang.String fragmentShader)Constructs a new ShaderProgram and immediately compiles it.- Parameters:
vertexShader
- The vertex shader code.fragmentShader
- The fragment shader code.
-
ExtShaderProgram
public ExtShaderProgram(com.badlogic.gdx.files.FileHandle vertexShader, com.badlogic.gdx.files.FileHandle fragmentShader)
-
-
Method Details
-
createProgram
protected int createProgram() -
getLog
public java.lang.String getLog()- Returns:
- the log info for the shader compilation and program linking stage. The shader needs to be bound for this method to have an effect.
-
isCompiled
public boolean isCompiled()- Returns:
- whether this ShaderProgram compiled successfully.
-
fetchUniformLocation
public int fetchUniformLocation(java.lang.String name, boolean pedantic) -
setUniformi
public void setUniformi(java.lang.String name, int value)Sets the uniform with the given name. TheExtShaderProgram
must be bound for this to work.- Parameters:
name
- the name of the uniformvalue
- the value
-
setUniformi
public void setUniformi(int location, int value) -
setUniformi
public void setUniformi(java.lang.String name, int value1, int value2)Sets the uniform with the given name. TheExtShaderProgram
must be bound for this to work.- Parameters:
name
- the name of the uniformvalue1
- the first valuevalue2
- the second value
-
setUniformi
public void setUniformi(int location, int value1, int value2) -
setUniformi
public void setUniformi(java.lang.String name, int value1, int value2, int value3)Sets the uniform with the given name. TheExtShaderProgram
must be bound for this to work.- Parameters:
name
- the name of the uniformvalue1
- the first valuevalue2
- the second valuevalue3
- the third value
-
setUniformi
public void setUniformi(int location, int value1, int value2, int value3) -
setUniformi
public void setUniformi(java.lang.String name, int value1, int value2, int value3, int value4)Sets the uniform with the given name. TheExtShaderProgram
must be bound for this to work.- Parameters:
name
- the name of the uniformvalue1
- the first valuevalue2
- the second valuevalue3
- the third valuevalue4
- the fourth value
-
setUniformi
public void setUniformi(int location, int value1, int value2, int value3, int value4) -
setUniformf
public void setUniformf(java.lang.String name, float value)Sets the uniform with the given name. TheExtShaderProgram
must be bound for this to work.- Parameters:
name
- the name of the uniformvalue
- the value
-
setUniformf
public void setUniformf(int location, float value) -
setUniformf
public void setUniformf(java.lang.String name, float value1, float value2)Sets the uniform with the given name. TheExtShaderProgram
must be bound for this to work.- Parameters:
name
- the name of the uniformvalue1
- the first valuevalue2
- the second value
-
setUniformf
public void setUniformf(int location, float value1, float value2) -
setUniformf
public void setUniformf(java.lang.String name, float value1, float value2, float value3)Sets the uniform with the given name. TheExtShaderProgram
must be bound for this to work.- Parameters:
name
- the name of the uniformvalue1
- the first valuevalue2
- the second valuevalue3
- the third value
-
setUniformf
public void setUniformf(int location, float value1, float value2, float value3) -
setUniformf
public void setUniformf(java.lang.String name, float value1, float value2, float value3, float value4)Sets the uniform with the given name. TheExtShaderProgram
must be bound for this to work.- Parameters:
name
- the name of the uniformvalue1
- the first valuevalue2
- the second valuevalue3
- the third valuevalue4
- the fourth value
-
setUniformf
public void setUniformf(int location, float value1, float value2, float value3, float value4) -
setUniform1fv
public void setUniform1fv(java.lang.String name, float[] values, int offset, int length) -
setUniform1fv
public void setUniform1fv(int location, float[] values, int offset, int length) -
setUniform2fv
public void setUniform2fv(java.lang.String name, float[] values, int offset, int length) -
setUniform2fv
public void setUniform2fv(int location, float[] values, int offset, int length) -
setUniform3fv
public void setUniform3fv(java.lang.String name, float[] values, int offset, int length) -
setUniform3fv
public void setUniform3fv(int location, float[] values, int offset, int length) -
setUniform4fv
public void setUniform4fv(java.lang.String name, float[] values, int offset, int length) -
setUniform4fv
public void setUniform4fv(int location, float[] values, int offset, int length) -
setUniformMatrix
public void setUniformMatrix(java.lang.String name, com.badlogic.gdx.math.Matrix4 matrix)Sets the uniform matrix with the given name. TheExtShaderProgram
must be bound for this to work.- Parameters:
name
- the name of the uniformmatrix
- the matrix
-
setUniformMatrix
public void setUniformMatrix(java.lang.String name, com.badlogic.gdx.math.Matrix4 matrix, boolean transpose)Sets the uniform matrix with the given name. TheExtShaderProgram
must be bound for this to work.- Parameters:
name
- the name of the uniformmatrix
- the matrixtranspose
- whether the matrix should be transposed
-
setUniformMatrix
public void setUniformMatrix(int location, com.badlogic.gdx.math.Matrix4 matrix) -
setUniformMatrix
public void setUniformMatrix(int location, com.badlogic.gdx.math.Matrix4 matrix, boolean transpose) -
setUniformMatrix
public void setUniformMatrix(java.lang.String name, com.badlogic.gdx.math.Matrix3 matrix)Sets the uniform matrix with the given name. TheExtShaderProgram
must be bound for this to work.- Parameters:
name
- the name of the uniformmatrix
- the matrix
-
setUniformMatrix
public void setUniformMatrix(java.lang.String name, com.badlogic.gdx.math.Matrix3 matrix, boolean transpose)Sets the uniform matrix with the given name. TheExtShaderProgram
must be bound for this to work.- Parameters:
name
- the name of the uniformmatrix
- the matrixtranspose
- whether the uniform matrix should be transposed
-
setUniformMatrix
public void setUniformMatrix(int location, com.badlogic.gdx.math.Matrix3 matrix) -
setUniformMatrix
public void setUniformMatrix(int location, com.badlogic.gdx.math.Matrix3 matrix, boolean transpose) -
setUniformMatrix3fv
public void setUniformMatrix3fv(java.lang.String name, java.nio.FloatBuffer buffer, int count, boolean transpose)Sets an array of uniform matrices with the given name. TheExtShaderProgram
must be bound for this to work.- Parameters:
name
- the name of the uniformbuffer
- buffer containing the matrix datatranspose
- whether the uniform matrix should be transposed
-
setUniformMatrix4fv
public void setUniformMatrix4fv(java.lang.String name, java.nio.FloatBuffer buffer, int count, boolean transpose)Sets an array of uniform matrices with the given name. TheExtShaderProgram
must be bound for this to work.- Parameters:
name
- the name of the uniformbuffer
- buffer containing the matrix datatranspose
- whether the uniform matrix should be transposed
-
setUniformMatrix4fv
public void setUniformMatrix4fv(int location, float[] values, int offset, int length) -
setUniformMatrix4fv
public void setUniformMatrix4fv(java.lang.String name, float[] values, int offset, int length) -
setUniformf
public void setUniformf(java.lang.String name, com.badlogic.gdx.math.Vector2 values)Sets the uniform with the given name. TheExtShaderProgram
must be bound for this to work.- Parameters:
name
- the name of the uniformvalues
- x and y as the first and second values respectively
-
setUniformf
public void setUniformf(int location, com.badlogic.gdx.math.Vector2 values) -
setUniformf
public void setUniformf(java.lang.String name, com.badlogic.gdx.math.Vector3 values)Sets the uniform with the given name. TheExtShaderProgram
must be bound for this to work.- Parameters:
name
- the name of the uniformvalues
- x, y and z as the first, second and third values respectively
-
setUniformf
public void setUniformf(int location, com.badlogic.gdx.math.Vector3 values) -
setUniformf
public void setUniformf(java.lang.String name, com.badlogic.gdx.graphics.Color values)Sets the uniform with the given name. TheExtShaderProgram
must be bound for this to work.- Parameters:
name
- the name of the uniformvalues
- r, g, b and a as the first through fourth values respectively
-
setUniformf
public void setUniformf(int location, com.badlogic.gdx.graphics.Color values) -
setVertexAttribute
public void setVertexAttribute(java.lang.String name, int size, int type, boolean normalize, int stride, java.nio.Buffer buffer)Sets the vertex attribute with the given name. TheExtShaderProgram
must be bound for this to work.- Parameters:
name
- the attribute namesize
- the number of components, must be >= 1 and <= 4type
- the type, must be one of GL20.GL_BYTE, GL20.GL_UNSIGNED_BYTE, GL20.GL_SHORT, GL20.GL_UNSIGNED_SHORT,GL20.GL_FIXED, or GL20.GL_FLOAT. GL_FIXED will not work on the desktopnormalize
- whether fixed point data should be normalized. Will not work on the desktopstride
- the stride in bytes between successive attributesbuffer
- the buffer containing the vertex attributes.
-
setVertexAttribute
public void setVertexAttribute(int location, int size, int type, boolean normalize, int stride, java.nio.Buffer buffer) -
setVertexAttribute
public void setVertexAttribute(java.lang.String name, int size, int type, boolean normalize, int stride, int offset)Sets the vertex attribute with the given name. TheExtShaderProgram
must be bound for this to work.- Parameters:
name
- the attribute namesize
- the number of components, must be >= 1 and <= 4type
- the type, must be one of GL20.GL_BYTE, GL20.GL_UNSIGNED_BYTE, GL20.GL_SHORT, GL20.GL_UNSIGNED_SHORT,GL20.GL_FIXED, or GL20.GL_FLOAT. GL_FIXED will not work on the desktopnormalize
- whether fixed point data should be normalized. Will not work on the desktopstride
- the stride in bytes between successive attributesoffset
- byte offset into the vertex buffer object bound to GL20.GL_ARRAY_BUFFER.
-
setVertexAttribute
public void setVertexAttribute(int location, int size, int type, boolean normalize, int stride, int offset) -
begin
public void begin()Makes OpenGL ES 2.0 use this vertex and fragment shader pair. When you are done with this shader you have to callend()
. -
end
public void end()Disables this shader. Must be called when one is done with the shader. Don't mix it with dispose, that will release the shader resources. -
dispose
public void dispose()Disposes all resources associated with this shader. Must be called when the shader is no longer used.- Specified by:
dispose
in interfacecom.badlogic.gdx.utils.Disposable
-
disableVertexAttribute
public void disableVertexAttribute(java.lang.String name)Disables the vertex attribute with the given name- Parameters:
name
- the vertex attribute name
-
disableVertexAttribute
public void disableVertexAttribute(int location) -
enableVertexAttribute
public void enableVertexAttribute(java.lang.String name)Enables the vertex attribute with the given name- Parameters:
name
- the vertex attribute name
-
enableVertexAttribute
public void enableVertexAttribute(int location) -
invalidateAllShaderPrograms
public static void invalidateAllShaderPrograms(com.badlogic.gdx.Application app)Invalidates all shaders so the next time they are used new handles are generated- Parameters:
app
-
-
clearAllShaderPrograms
public static void clearAllShaderPrograms(com.badlogic.gdx.Application app) -
getManagedStatus
public static java.lang.String getManagedStatus() -
getNumManagedShaderPrograms
public static int getNumManagedShaderPrograms()- Returns:
- the number of managed shader programs currently loaded
-
setAttributef
public void setAttributef(java.lang.String name, float value1, float value2, float value3, float value4)Sets the given attribute- Parameters:
name
- the name of the attributevalue1
- the first valuevalue2
- the second valuevalue3
- the third valuevalue4
- the fourth value
-
hasAttribute
public boolean hasAttribute(java.lang.String name)- Parameters:
name
- the name of the attribute- Returns:
- whether the attribute is available in the shader
-
getAttributeType
public int getAttributeType(java.lang.String name)- Parameters:
name
- the name of the attribute- Returns:
- the type of the attribute, one of
GL20.GL_FLOAT
,GL20.GL_FLOAT_VEC2
etc.
-
getAttributeLocation
public int getAttributeLocation(java.lang.String name)- Parameters:
name
- the name of the attribute- Returns:
- the location of the attribute or -1.
-
getAttributeSize
public int getAttributeSize(java.lang.String name)- Parameters:
name
- the name of the attribute- Returns:
- the size of the attribute or 0.
-
hasUniform
public boolean hasUniform(java.lang.String name)- Parameters:
name
- the name of the uniform- Returns:
- whether the uniform is available in the shader
-
getUniformType
public int getUniformType(java.lang.String name)- Parameters:
name
- the name of the uniform- Returns:
- the type of the uniform, one of
GL20.GL_FLOAT
,GL20.GL_FLOAT_VEC2
etc.
-
getUniformLocation
public int getUniformLocation(java.lang.String name)- Parameters:
name
- the name of the uniform- Returns:
- the location of the uniform or -1.
-
getUniformSize
public int getUniformSize(java.lang.String name)- Parameters:
name
- the name of the uniform- Returns:
- the size of the uniform or 0.
-
getAttributes
public java.lang.String[] getAttributes()- Returns:
- the attributes
-
getUniforms
public java.lang.String[] getUniforms()- Returns:
- the uniforms
-
getVertexShaderSource
public java.lang.String getVertexShaderSource()- Returns:
- the source of the vertex shader
-
getFragmentShaderSource
public java.lang.String getFragmentShaderSource()- Returns:
- the source of the fragment shader
-