Class ShaderCode
- java.lang.Object
-
- com.jogamp.opengl.util.glsl.ShaderCode
-
public class ShaderCode extends Object
Convenient shader code class to use and instantiate vertex or fragment programs.A documented example of how to use this code is available
here
andhere
.Support for
GL3ES3.GL_TESS_CONTROL_SHADER
andGL3ES3.GL_TESS_EVALUATION_SHADER
was added since 2.2.1.
-
-
Field Summary
Fields Modifier and Type Field Description static boolean
DEBUG_CODE
static String
DISABLE
Behavior for GLSL extension directive, seecreateExtensionDirective(String, String)
, value "disable".static String
ENABLE
Behavior for GLSL extension directive, seecreateExtensionDirective(String, String)
, value "enable".static String
es2_default_precision_fp
Default precision ofES2
forfragment-shader
: "\nprecision mediump float;\nprecision mediump int;\n/*precision lowp sampler2D;*/\n/*precision lowp samplerCube;*/\n"static String
es2_default_precision_vp
Default precision ofES2
forvertex-shader
: "\nprecision highp float;\nprecision highp int;\n/*precision lowp sampler2D;*/\n/*precision lowp samplerCube;*/\n"static String
es3_default_precision_fp
Default precision ofES3
forfragment-shader
: "\nprecision highp float;\nprecision highp int;\n/*precision lowp sampler2D;*/\n/*precision lowp samplerCube;*/\n", same as forvertex-shader
, i.ees3_default_precision_vp
, due to ES 3.x requirements of using same precision for uniforms!static String
es3_default_precision_vp
Default precision ofES3
forvertex-shader
: "\nprecision highp float;\nprecision highp int;\n/*precision lowp sampler2D;*/\n/*precision lowp samplerCube;*/\n"static String
gl3_default_precision_fp
Default precision of GLSL ≥ 1.30 as required until < 1.50 forfragment-shader
: "\nprecision highp float;\nprecision mediump int;\n/*precision mediump sampler2D;*/\n".static String
gl3_default_precision_vp_gp
Default precision of GLSL ≥ 1.30 as required until < 1.50 forvertex-shader
orgeometry-shader
: "\nprecision highp float;\nprecision highp int;\n".static String
REQUIRE
Behavior for GLSL extension directive, seecreateExtensionDirective(String, String)
, value "require".static String
SUB_PATH_NVIDIA
Unique relative path for binary shader resources forNVIDIA
:"nvidia"
static String
SUFFIX_COMPUTE_BINARY
Unique resource suffix forGL3ES3.GL_COMPUTE_SHADER
in binary:"bcp"
static String
SUFFIX_COMPUTE_SOURCE
Unique resource suffix forGL3ES3.GL_COMPUTE_SHADER
in source code:"cp"
static String
SUFFIX_FRAGMENT_BINARY
Unique resource suffix forGL2ES2.GL_FRAGMENT_SHADER
in binary:"bfp"
static String
SUFFIX_FRAGMENT_SOURCE
Unique resource suffix forGL2ES2.GL_FRAGMENT_SHADER
in source code:"fp"
static String
SUFFIX_GEOMETRY_BINARY
Unique resource suffix forGL3ES3.GL_GEOMETRY_SHADER
in binary:"bgp"
static String
SUFFIX_GEOMETRY_SOURCE
Unique resource suffix forGL3ES3.GL_GEOMETRY_SHADER
in source code:"gp"
static String
SUFFIX_TESS_CONTROL_BINARY
Unique resource suffix forGL3ES3.GL_TESS_CONTROL_SHADER
in binary:"btcp"
static String
SUFFIX_TESS_CONTROL_SOURCE
Unique resource suffix forGL3ES3.GL_TESS_CONTROL_SHADER
in source code:"tcp"
static String
SUFFIX_TESS_EVALUATION_BINARY
Unique resource suffix forGL3ES3.GL_TESS_EVALUATION_SHADER
in binary:"btep"
static String
SUFFIX_TESS_EVALUATION_SOURCE
Unique resource suffix forGL3ES3.GL_TESS_EVALUATION_SHADER
in source code:"tep"
static String
SUFFIX_VERTEX_BINARY
Unique resource suffix forGL2ES2.GL_VERTEX_SHADER
in binary:"bvp"
static String
SUFFIX_VERTEX_SOURCE
Unique resource suffix forGL2ES2.GL_VERTEX_SHADER
in source code:"vp"
static String
WARN
Behavior for GLSL extension directive, seecreateExtensionDirective(String, String)
, value "warn".
-
Constructor Summary
Constructors Constructor Description ShaderCode(int type, int count, int binFormat, Buffer binary)
ShaderCode(int type, int count, CharSequence[][] source)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description int
addDefaultShaderPrecision(GL2ES2 gl, int pos)
Adds default precision to source code at given position if required, i.e.int
addGLSLVersion(GL2ES2 gl)
Add GLSL version at the head of this shader source code.boolean
compile(GL2ES2 gl)
boolean
compile(GL2ES2 gl, PrintStream verboseOut)
static ShaderCode
create(int type, int count, int binFormat, Uri binLocation)
Creates a completeShaderCode
object while reading the shader binary fromUri
binLocations
viareadShaderBinary(Uri)
.static ShaderCode
create(int type, int count, Class<?> context, int binFormat, String binaryFile)
Creates a completeShaderCode
object while reading the shader binary ofbinaryFile
, which location is resolved using thecontext
class, seereadShaderBinary(Class, String)
.static ShaderCode
create(GL2ES2 gl, int type, int count, Uri[] sourceLocations, boolean mutableStringBuilder)
Creates a completeShaderCode
object while reading all shader sources fromUri
sourceLocations
viareadShaderSource(Uri, boolean)
.static ShaderCode
create(GL2ES2 gl, int type, int count, Class<?> context, String[] sourceFiles, boolean mutableStringBuilder)
Creates a completeShaderCode
object while reading all shader source ofsourceFiles
, which location is resolved using thecontext
class, see#readShaderSource(Class, String)
.static ShaderCode
create(GL2ES2 gl, int type, int count, Class<?> context, String srcRoot, String[] srcBasenames, String binRoot, String binBasename, boolean mutableStringBuilder)
Simplified variation ofcreate(GL2ES2, int, int, Class, String, String[], String, String, String, String, boolean)
.static ShaderCode
create(GL2ES2 gl, int type, int count, Class<?> context, String srcRoot, String[] srcBasenames, String srcSuffixOpt, String binRoot, String binBasename, String binSuffixOpt, boolean mutableStringBuilder)
Convenient creation method for instantiating a completeShaderCode
object either from source code using#create(GL2ES2, int, int, Class, String[])
, or from a binary code usingcreate(int, int, Class, int, String)
, whatever is available first.static ShaderCode
create(GL2ES2 gl, int type, Class<?> context, String srcRoot, String binRoot, String basename, boolean mutableStringBuilder)
Simplified variation ofcreate(GL2ES2, int, Class, String, String, String, String, String, boolean)
.static ShaderCode
create(GL2ES2 gl, int type, Class<?> context, String srcRoot, String binRoot, String basename, String srcSuffixOpt, String binSuffixOpt, boolean mutableStringBuilder)
Simplified variation ofcreate(GL2ES2, int, int, Class, String, String[], String, String, String, String, boolean)
.static String
createExtensionDirective(String extensionName, String behavior)
Creates a GLSL extension directive.int
defaultShaderCustomization(GL2ES2 gl, boolean preludeVersion, boolean addDefaultPrecision)
Default customization of this shader source code.int
defaultShaderCustomization(GL2ES2 gl, boolean preludeVersion, String esDefaultPrecision)
Default customization of this shader source code.void
destroy(GL2ES2 gl)
void
dumpShaderSource(PrintStream out)
boolean
equals(Object obj)
static String
getBinarySubPath(int binFormat)
Returns a unique relative path for binary shader resources as follows:NVIDIA
:SUB_PATH_NVIDIA
static String
getFileSuffix(boolean binary, int type)
Returns a unique suffix for shader resources as follows: Sourcevertex
:SUFFIX_VERTEX_SOURCE
fragment
:SUFFIX_FRAGMENT_SOURCE
geometry
:SUFFIX_GEOMETRY_SOURCE
tess-ctrl
:SUFFIX_TESS_CONTROL_SOURCE
tess-eval
:SUFFIX_TESS_EVALUATION_SOURCE
GL3ES3.GL_COMPUTE_SHADER
:SUFFIX_COMPUTE_SOURCE
Binaryvertex
:SUFFIX_VERTEX_BINARY
fragment
:SUFFIX_FRAGMENT_BINARY
geometry
:SUFFIX_GEOMETRY_BINARY
tess-ctrl
:SUFFIX_TESS_CONTROL_BINARY
tess-eval
:SUFFIX_TESS_EVALUATION_BINARY
GL3ES3.GL_COMPUTE_SHADER
:SUFFIX_COMPUTE_BINARY
int
hashCode()
int
id()
returns the uniq shader id as an integerint
insertShaderSource(int shaderIdx, int position, CharSequence data)
Addsdata
atposition
in shader source for shadershaderIdx
.int
insertShaderSource(int shaderIdx, int position, Class<?> context, String path)
Adds shader source located inpath
, either relative to thecontext
class or absolute as-is atposition
in shader source for shadershaderIdx
.int
insertShaderSource(int shaderIdx, String tag, int fromIndex, CharSequence data)
Addsdata
after the line containingtag
.boolean
isValid()
static ByteBuffer
readShaderBinary(Uri binLocation)
static ByteBuffer
readShaderBinary(Class<?> context, String path)
Reads shader binary located inpath
, either relative to thecontext
class or absolute as-is.static CharSequence
readShaderSource(Uri sourceLocation, boolean mutableStringBuilder)
static CharSequence
readShaderSource(Class<?> context, String path, boolean mutableStringBuilder)
Reads shader source located inpath
, either relative to thecontext
class or absolute as-is.static void
readShaderSource(Class<?> context, URLConnection conn, StringBuilder result)
Reads shader source located inconn
.int
replaceInShaderSource(String oldName, String newName)
ReplacesoldName
withnewName
in all shader sources.static boolean
requiresDefaultPrecision(GL2ES2 gl)
Returns true, if GLSL version requires default precision, i.e.static boolean
requiresGL3DefaultPrecision(GL2ES2 gl)
Returns true, if GL3 GLSL version requires default precision, i.e.IntBuffer
shader()
Buffer
shaderBinary()
int
shaderBinaryFormat()
CharSequence[][]
shaderSource()
int
shaderType()
String
shaderTypeStr()
static String
shaderTypeStr(int type)
String
toString()
-
-
-
Field Detail
-
DEBUG_CODE
public static final boolean DEBUG_CODE
-
SUFFIX_VERTEX_SOURCE
public static final String SUFFIX_VERTEX_SOURCE
Unique resource suffix forGL2ES2.GL_VERTEX_SHADER
in source code:"vp"
- See Also:
- Constant Field Values
-
SUFFIX_VERTEX_BINARY
public static final String SUFFIX_VERTEX_BINARY
Unique resource suffix forGL2ES2.GL_VERTEX_SHADER
in binary:"bvp"
- See Also:
- Constant Field Values
-
SUFFIX_GEOMETRY_SOURCE
public static final String SUFFIX_GEOMETRY_SOURCE
Unique resource suffix forGL3ES3.GL_GEOMETRY_SHADER
in source code:"gp"
- See Also:
- Constant Field Values
-
SUFFIX_GEOMETRY_BINARY
public static final String SUFFIX_GEOMETRY_BINARY
Unique resource suffix forGL3ES3.GL_GEOMETRY_SHADER
in binary:"bgp"
- See Also:
- Constant Field Values
-
SUFFIX_COMPUTE_SOURCE
public static final String SUFFIX_COMPUTE_SOURCE
Unique resource suffix forGL3ES3.GL_COMPUTE_SHADER
in source code:"cp"
- Since:
- 2.3.2
- See Also:
- Constant Field Values
-
SUFFIX_COMPUTE_BINARY
public static final String SUFFIX_COMPUTE_BINARY
Unique resource suffix forGL3ES3.GL_COMPUTE_SHADER
in binary:"bcp"
- Since:
- 2.3.2
- See Also:
- Constant Field Values
-
SUFFIX_TESS_CONTROL_SOURCE
public static final String SUFFIX_TESS_CONTROL_SOURCE
Unique resource suffix forGL3ES3.GL_TESS_CONTROL_SHADER
in source code:"tcp"
- Since:
- 2.2.1
- See Also:
- Constant Field Values
-
SUFFIX_TESS_CONTROL_BINARY
public static final String SUFFIX_TESS_CONTROL_BINARY
Unique resource suffix forGL3ES3.GL_TESS_CONTROL_SHADER
in binary:"btcp"
- Since:
- 2.2.1
- See Also:
- Constant Field Values
-
SUFFIX_TESS_EVALUATION_SOURCE
public static final String SUFFIX_TESS_EVALUATION_SOURCE
Unique resource suffix forGL3ES3.GL_TESS_EVALUATION_SHADER
in source code:"tep"
- Since:
- 2.2.1
- See Also:
- Constant Field Values
-
SUFFIX_TESS_EVALUATION_BINARY
public static final String SUFFIX_TESS_EVALUATION_BINARY
Unique resource suffix forGL3ES3.GL_TESS_EVALUATION_SHADER
in binary:"btep"
- Since:
- 2.2.1
- See Also:
- Constant Field Values
-
SUFFIX_FRAGMENT_SOURCE
public static final String SUFFIX_FRAGMENT_SOURCE
Unique resource suffix forGL2ES2.GL_FRAGMENT_SHADER
in source code:"fp"
- See Also:
- Constant Field Values
-
SUFFIX_FRAGMENT_BINARY
public static final String SUFFIX_FRAGMENT_BINARY
Unique resource suffix forGL2ES2.GL_FRAGMENT_SHADER
in binary:"bfp"
- See Also:
- Constant Field Values
-
SUB_PATH_NVIDIA
public static final String SUB_PATH_NVIDIA
Unique relative path for binary shader resources forNVIDIA
:"nvidia"
- See Also:
- Constant Field Values
-
es2_default_precision_vp
public static final String es2_default_precision_vp
Default precision ofES2
forvertex-shader
: "\nprecision highp float;\nprecision highp int;\n/*precision lowp sampler2D;*/\n/*precision lowp samplerCube;*/\n"- See Also:
- Constant Field Values
-
es2_default_precision_fp
public static final String es2_default_precision_fp
Default precision ofES2
forfragment-shader
: "\nprecision mediump float;\nprecision mediump int;\n/*precision lowp sampler2D;*/\n/*precision lowp samplerCube;*/\n"- See Also:
- Constant Field Values
-
es3_default_precision_vp
public static final String es3_default_precision_vp
Default precision ofES3
forvertex-shader
: "\nprecision highp float;\nprecision highp int;\n/*precision lowp sampler2D;*/\n/*precision lowp samplerCube;*/\n"- See Also:
- Constant Field Values
-
es3_default_precision_fp
public static final String es3_default_precision_fp
Default precision ofES3
forfragment-shader
: "\nprecision highp float;\nprecision highp int;\n/*precision lowp sampler2D;*/\n/*precision lowp samplerCube;*/\n", same as forvertex-shader
, i.ees3_default_precision_vp
, due to ES 3.x requirements of using same precision for uniforms!- See Also:
- Constant Field Values
-
gl3_default_precision_vp_gp
public static final String gl3_default_precision_vp_gp
Default precision of GLSL ≥ 1.30 as required until < 1.50 forvertex-shader
orgeometry-shader
: "\nprecision highp float;\nprecision highp int;\n". See GLSL Spec 1.30-1.50 Section 4.5.3.- See Also:
- Constant Field Values
-
gl3_default_precision_fp
public static final String gl3_default_precision_fp
Default precision of GLSL ≥ 1.30 as required until < 1.50 forfragment-shader
: "\nprecision highp float;\nprecision mediump int;\n/*precision mediump sampler2D;*/\n". See GLSL Spec 1.30-1.50 Section 4.5.3.- See Also:
- Constant Field Values
-
REQUIRE
public static final String REQUIRE
Behavior for GLSL extension directive, seecreateExtensionDirective(String, String)
, value "require".- See Also:
- Constant Field Values
-
ENABLE
public static final String ENABLE
Behavior for GLSL extension directive, seecreateExtensionDirective(String, String)
, value "enable".- See Also:
- Constant Field Values
-
DISABLE
public static final String DISABLE
Behavior for GLSL extension directive, seecreateExtensionDirective(String, String)
, value "disable".- See Also:
- Constant Field Values
-
WARN
public static final String WARN
Behavior for GLSL extension directive, seecreateExtensionDirective(String, String)
, value "warn".- See Also:
- Constant Field Values
-
-
Constructor Detail
-
ShaderCode
public ShaderCode(int type, int count, CharSequence[][] source)
- Parameters:
type
- eitherGL2ES2.GL_VERTEX_SHADER
,GL2ES2.GL_FRAGMENT_SHADER
,GL3ES3.GL_GEOMETRY_SHADER
,GL3ES3.GL_TESS_CONTROL_SHADER
,GL3ES3.GL_TESS_EVALUATION_SHADER
orGL3ES3.GL_COMPUTE_SHADER
.count
- number of shaderssource
- CharSequence array containing the shader sources, organized assource[count][strings-per-shader]
. May be either an immutableString
- or mutableStringBuilder
array.- Throws:
IllegalArgumentException
- ifcount
andsource.length
do not match
-
ShaderCode
public ShaderCode(int type, int count, int binFormat, Buffer binary)
- Parameters:
type
- eitherGL2ES2.GL_VERTEX_SHADER
,GL2ES2.GL_FRAGMENT_SHADER
,GL3ES3.GL_GEOMETRY_SHADER
,GL3ES3.GL_TESS_CONTROL_SHADER
,GL3ES3.GL_TESS_EVALUATION_SHADER
orGL3ES3.GL_COMPUTE_SHADER
.count
- number of shadersbinary
- binary buffer containing the shader binaries,
-
-
Method Detail
-
create
public static ShaderCode create(GL2ES2 gl, int type, int count, Class<?> context, String[] sourceFiles, boolean mutableStringBuilder)
Creates a completeShaderCode
object while reading all shader source ofsourceFiles
, which location is resolved using thecontext
class, see#readShaderSource(Class, String)
.- Parameters:
gl
- current GL object to determine whether a shader compiler is available. If null, no validation is performed.type
- eitherGL2ES2.GL_VERTEX_SHADER
,GL2ES2.GL_FRAGMENT_SHADER
,GL3ES3.GL_GEOMETRY_SHADER
,GL3ES3.GL_TESS_CONTROL_SHADER
,GL3ES3.GL_TESS_EVALUATION_SHADER
orGL3ES3.GL_COMPUTE_SHADER
.count
- number of shaderscontext
- class used to help resolving the source locationsourceFiles
- array of source locations, organized assourceFiles[count]
->shaderSources[count][1]
mutableStringBuilder
- iftrue
method returns a mutableStringBuilder
instance which can be edited later on at the costs of a String conversion when passing toGL2ES2.glShaderSource(int, int, String[], IntBuffer)
. Iffalse
method returns an immutableString
instance, which can be passed toGL2ES2.glShaderSource(int, int, String[], IntBuffer)
at no additional costs.- Throws:
IllegalArgumentException
- ifcount
andsourceFiles.length
do not match- See Also:
#readShaderSource(Class, String)
-
create
public static ShaderCode create(GL2ES2 gl, int type, int count, Uri[] sourceLocations, boolean mutableStringBuilder)
Creates a completeShaderCode
object while reading all shader sources fromUri
sourceLocations
viareadShaderSource(Uri, boolean)
.- Parameters:
gl
- current GL object to determine whether a shader compiler is available. If null, no validation is performed.type
- eitherGL2ES2.GL_VERTEX_SHADER
,GL2ES2.GL_FRAGMENT_SHADER
,GL3ES3.GL_GEOMETRY_SHADER
,GL3ES3.GL_TESS_CONTROL_SHADER
,GL3ES3.GL_TESS_EVALUATION_SHADER
orGL3ES3.GL_COMPUTE_SHADER
.count
- number of shaderssourceLocations
- array ofUri
source locations, organized assourceFiles[count]
->shaderSources[count][1]
mutableStringBuilder
- iftrue
method returns a mutableStringBuilder
instance which can be edited later on at the costs of a String conversion when passing toGL2ES2.glShaderSource(int, int, String[], IntBuffer)
. Iffalse
method returns an immutableString
instance, which can be passed toGL2ES2.glShaderSource(int, int, String[], IntBuffer)
at no additional costs.- Throws:
IllegalArgumentException
- ifcount
andsourceFiles.length
do not match- Since:
- 2.3.2
- See Also:
readShaderSource(Uri, boolean)
-
create
public static ShaderCode create(int type, int count, Class<?> context, int binFormat, String binaryFile)
Creates a completeShaderCode
object while reading the shader binary ofbinaryFile
, which location is resolved using thecontext
class, seereadShaderBinary(Class, String)
.- Parameters:
type
- eitherGL2ES2.GL_VERTEX_SHADER
,GL2ES2.GL_FRAGMENT_SHADER
,GL3ES3.GL_GEOMETRY_SHADER
,GL3ES3.GL_TESS_CONTROL_SHADER
,GL3ES3.GL_TESS_EVALUATION_SHADER
orGL3ES3.GL_COMPUTE_SHADER
.count
- number of shaderscontext
- class used to help resolving the source locationbinFormat
- a valid native binary format as they can be queried byShaderUtil.getShaderBinaryFormats(GL)
.sourceFiles
- array of source locations, organized assourceFiles[count]
- See Also:
readShaderBinary(Class, String)
,ShaderUtil.getShaderBinaryFormats(GL)
-
create
public static ShaderCode create(int type, int count, int binFormat, Uri binLocation)
Creates a completeShaderCode
object while reading the shader binary fromUri
binLocations
viareadShaderBinary(Uri)
.- Parameters:
type
- eitherGL2ES2.GL_VERTEX_SHADER
,GL2ES2.GL_FRAGMENT_SHADER
,GL3ES3.GL_GEOMETRY_SHADER
,GL3ES3.GL_TESS_CONTROL_SHADER
,GL3ES3.GL_TESS_EVALUATION_SHADER
orGL3ES3.GL_COMPUTE_SHADER
.count
- number of shadersbinFormat
- a valid native binary format as they can be queried byShaderUtil.getShaderBinaryFormats(GL)
.binLocations
-Uri
binary location- Since:
- 2.3.2
- See Also:
readShaderBinary(Uri)
,ShaderUtil.getShaderBinaryFormats(GL)
-
getFileSuffix
public static String getFileSuffix(boolean binary, int type)
Returns a unique suffix for shader resources as follows:- Source
- Binary
- Parameters:
binary
- true for a binary resource, false for a source resourcetype
- eitherGL2ES2.GL_VERTEX_SHADER
,GL2ES2.GL_FRAGMENT_SHADER
,GL3ES3.GL_GEOMETRY_SHADER
,GL3ES3.GL_TESS_CONTROL_SHADER
,GL3ES3.GL_TESS_EVALUATION_SHADER
orGL3ES3.GL_COMPUTE_SHADER
.- Throws:
GLException
- iftype
is not supported- See Also:
create(GL2ES2, int, Class, String, String, String, boolean)
-
getBinarySubPath
public static String getBinarySubPath(int binFormat)
Returns a unique relative path for binary shader resources as follows:- Throws:
GLException
- ifbinFormat
is not supported- See Also:
create(GL2ES2, int, Class, String, String, String, boolean)
-
create
public static ShaderCode create(GL2ES2 gl, int type, int count, Class<?> context, String srcRoot, String[] srcBasenames, String srcSuffixOpt, String binRoot, String binBasename, String binSuffixOpt, boolean mutableStringBuilder)
Convenient creation method for instantiating a completeShaderCode
object either from source code using#create(GL2ES2, int, int, Class, String[])
, or from a binary code usingcreate(int, int, Class, int, String)
, whatever is available first.The source and binary location names are expected w/o suffixes which are resolved and appended using the given
srcSuffixOpt
andbinSuffixOpt
if notnull
, otherwisegetFileSuffix(boolean, int)
determines the suffixes.Additionally, the binary resource is expected within a subfolder of
Example:binRoot
which reflects the vendor specific binary format, seegetBinarySubPath(int)
. AllShaderUtil.getShaderBinaryFormats(GL)
are being iterated using the binary subfolder, the first existing resource is being used.Your std JVM layout (plain or within a JAR): org/test/glsl/MyShaderTest.class org/test/glsl/shader/vertex.vp org/test/glsl/shader/fragment.fp org/test/glsl/shader/bin/nvidia/vertex.bvp org/test/glsl/shader/bin/nvidia/fragment.bfp Your Android APK layout: classes.dex assets/org/test/glsl/shader/vertex.vp assets/org/test/glsl/shader/fragment.fp assets/org/test/glsl/shader/bin/nvidia/vertex.bvp assets/org/test/glsl/shader/bin/nvidia/fragment.bfp ... Your invocation in org/test/glsl/MyShaderTest.java: ShaderCode vp0 = ShaderCode.create(gl, GL2ES2.GL_VERTEX_SHADER, 1, this.getClass(), "shader", new String[] { "vertex" }, null, "shader/bin", "vertex", null, true); ShaderCode fp0 = ShaderCode.create(gl, GL2ES2.GL_FRAGMENT_SHADER, 1, this.getClass(), "shader", new String[] { "vertex" }, null, "shader/bin", "fragment", null, true); ShaderProgram sp0 = new ShaderProgram(); sp0.add(gl, vp0, System.err); sp0.add(gl, fp0, System.err); st.attachShaderProgram(gl, sp0, true);
A simplified entry point iscreate(GL2ES2, int, Class, String, String, String, boolean)
.The location is finally being resolved using the
context
class, seereadShaderBinary(Class, String)
.- Parameters:
gl
- current GL object to determine whether a shader compiler is available (ifsource
is used), or to determine the shader binary format (ifbinary
is used).type
- eitherGL2ES2.GL_VERTEX_SHADER
,GL2ES2.GL_FRAGMENT_SHADER
,GL3ES3.GL_GEOMETRY_SHADER
,GL3ES3.GL_TESS_CONTROL_SHADER
,GL3ES3.GL_TESS_EVALUATION_SHADER
orGL3ES3.GL_COMPUTE_SHADER
.count
- number of shaderscontext
- class used to help resolving the source and binary locationsrcRoot
- relative root path forsrcBasenames
optionalsrcBasenames
- basenames w/o path or suffix relative tosrcRoot
for the shader's source codesrcSuffixOpt
- optional custom suffix for shader's source file, ifnull
getFileSuffix(boolean, int)
is being used.binRoot
- relative root path forbinBasenames
binBasename
- basename w/o path or suffix relative tobinRoot
for the shader's binary codebinSuffixOpt
- optional custom suffix for shader's binary file, ifnull
getFileSuffix(boolean, int)
is being used.mutableStringBuilder
- iftrue
method returns a mutableStringBuilder
instance which can be edited later on at the costs of a String conversion when passing toGL2ES2.glShaderSource(int, int, String[], IntBuffer)
. Iffalse
method returns an immutableString
instance, which can be passed toGL2ES2.glShaderSource(int, int, String[], IntBuffer)
at no additional costs.- Throws:
IllegalArgumentException
- ifcount
andsrcBasenames.length
do not match- Since:
- 2.3.2
- See Also:
#create(GL2ES2, int, int, Class, String[])
,create(int, int, Class, int, String)
,#readShaderSource(Class, String)
,getFileSuffix(boolean, int)
,ShaderUtil.getShaderBinaryFormats(GL)
,getBinarySubPath(int)
-
create
public static ShaderCode create(GL2ES2 gl, int type, int count, Class<?> context, String srcRoot, String[] srcBasenames, String binRoot, String binBasename, boolean mutableStringBuilder)
Simplified variation ofcreate(GL2ES2, int, int, Class, String, String[], String, String, String, String, boolean)
.Convenient creation method for instantiating a complete
ShaderCode
object either from source code using#create(GL2ES2, int, int, Class, String[])
, or from a binary code usingcreate(int, int, Class, int, String)
, whatever is available first.The source and binary location names are expected w/o suffixes which are resolved and appended using
getFileSuffix(boolean, int)
.Additionally, the binary resource is expected within a subfolder of
Example:binRoot
which reflects the vendor specific binary format, seegetBinarySubPath(int)
. AllShaderUtil.getShaderBinaryFormats(GL)
are being iterated using the binary subfolder, the first existing resource is being used.Your std JVM layout (plain or within a JAR): org/test/glsl/MyShaderTest.class org/test/glsl/shader/vertex.vp org/test/glsl/shader/fragment.fp org/test/glsl/shader/bin/nvidia/vertex.bvp org/test/glsl/shader/bin/nvidia/fragment.bfp Your Android APK layout: classes.dex assets/org/test/glsl/shader/vertex.vp assets/org/test/glsl/shader/fragment.fp assets/org/test/glsl/shader/bin/nvidia/vertex.bvp assets/org/test/glsl/shader/bin/nvidia/fragment.bfp ... Your invocation in org/test/glsl/MyShaderTest.java: ShaderCode vp0 = ShaderCode.create(gl, GL2ES2.GL_VERTEX_SHADER, 1, this.getClass(), "shader", new String[] { "vertex" }, "shader/bin", "vertex", true); ShaderCode fp0 = ShaderCode.create(gl, GL2ES2.GL_FRAGMENT_SHADER, 1, this.getClass(), "shader", new String[] { "vertex" }, "shader/bin", "fragment", true); ShaderProgram sp0 = new ShaderProgram(); sp0.add(gl, vp0, System.err); sp0.add(gl, fp0, System.err); st.attachShaderProgram(gl, sp0, true);
A simplified entry point iscreate(GL2ES2, int, Class, String, String, String, boolean)
.The location is finally being resolved using the
context
class, seereadShaderBinary(Class, String)
.- Parameters:
gl
- current GL object to determine whether a shader compiler is available (ifsource
is used), or to determine the shader binary format (ifbinary
is used).type
- eitherGL2ES2.GL_VERTEX_SHADER
,GL2ES2.GL_FRAGMENT_SHADER
,GL3ES3.GL_GEOMETRY_SHADER
,GL3ES3.GL_TESS_CONTROL_SHADER
,GL3ES3.GL_TESS_EVALUATION_SHADER
orGL3ES3.GL_COMPUTE_SHADER
.count
- number of shaderscontext
- class used to help resolving the source and binary locationsrcRoot
- relative root path forsrcBasenames
optionalsrcBasenames
- basenames w/o path or suffix relative tosrcRoot
for the shader's source codebinRoot
- relative root path forbinBasenames
binBasename
- basename w/o path or suffix relative tobinRoot
for the shader's binary codemutableStringBuilder
- iftrue
method returns a mutableStringBuilder
instance which can be edited later on at the costs of a String conversion when passing toGL2ES2.glShaderSource(int, int, String[], IntBuffer)
. Iffalse
method returns an immutableString
instance, which can be passed toGL2ES2.glShaderSource(int, int, String[], IntBuffer)
at no additional costs.- Throws:
IllegalArgumentException
- ifcount
andsrcBasenames.length
do not match- See Also:
create(GL2ES2, int, int, Class, String, String[], String, String, String, String, boolean)
,#readShaderSource(Class, String)
,getFileSuffix(boolean, int)
,ShaderUtil.getShaderBinaryFormats(GL)
,getBinarySubPath(int)
-
create
public static ShaderCode create(GL2ES2 gl, int type, Class<?> context, String srcRoot, String binRoot, String basename, String srcSuffixOpt, String binSuffixOpt, boolean mutableStringBuilder)
Simplified variation ofcreate(GL2ES2, int, int, Class, String, String[], String, String, String, String, boolean)
.Example:
Your std JVM layout (plain or within a JAR): org/test/glsl/MyShaderTest.class org/test/glsl/shader/vertex.vp org/test/glsl/shader/fragment.fp org/test/glsl/shader/bin/nvidia/vertex.bvp org/test/glsl/shader/bin/nvidia/fragment.bfp Your Android APK layout: classes.dex assets/org/test/glsl/shader/vertex.vp assets/org/test/glsl/shader/fragment.fp assets/org/test/glsl/shader/bin/nvidia/vertex.bvp assets/org/test/glsl/shader/bin/nvidia/fragment.bfp ... Your invocation in org/test/glsl/MyShaderTest.java: ShaderCode vp0 = ShaderCode.create(gl, GL2ES2.GL_VERTEX_SHADER, this.getClass(), "shader", "shader/bin", "vertex", null, null, true); ShaderCode fp0 = ShaderCode.create(gl, GL2ES2.GL_FRAGMENT_SHADER, this.getClass(), "shader", "shader/bin", "fragment", null, null, true); ShaderProgram sp0 = new ShaderProgram(); sp0.add(gl, vp0, System.err); sp0.add(gl, fp0, System.err); st.attachShaderProgram(gl, sp0, true);
- Parameters:
gl
- current GL object to determine whether a shader compiler is available (ifsource
is used), or to determine the shader binary format (ifbinary
is used).type
- eitherGL2ES2.GL_VERTEX_SHADER
,GL2ES2.GL_FRAGMENT_SHADER
,GL3ES3.GL_GEOMETRY_SHADER
,GL3ES3.GL_TESS_CONTROL_SHADER
,GL3ES3.GL_TESS_EVALUATION_SHADER
orGL3ES3.GL_COMPUTE_SHADER
.context
- class used to help resolving the source and binary locationsrcRoot
- relative root path forbasename
optionalbinRoot
- relative root path forbasename
basename
- basename w/o path or suffix relative tosrcRoot
andbinRoot
for the shader's source and binary code.srcSuffixOpt
- optional custom suffix for shader's source file, ifnull
getFileSuffix(boolean, int)
is being used.binSuffixOpt
- optional custom suffix for shader's binary file, ifnull
getFileSuffix(boolean, int)
is being used.mutableStringBuilder
- iftrue
method returns a mutableStringBuilder
instance which can be edited later on at the costs of a String conversion when passing toGL2ES2.glShaderSource(int, int, String[], IntBuffer)
. Iffalse
method returns an immutableString
instance, which can be passed toGL2ES2.glShaderSource(int, int, String[], IntBuffer)
at no additional costs.- Throws:
IllegalArgumentException
- ifcount
is not 1- Since:
- 2.3.2
- See Also:
create(GL2ES2, int, int, Class, String, String[], String, String, String, String, boolean)
-
create
public static ShaderCode create(GL2ES2 gl, int type, Class<?> context, String srcRoot, String binRoot, String basename, boolean mutableStringBuilder)
Simplified variation ofcreate(GL2ES2, int, Class, String, String, String, String, String, boolean)
.Example:
Your std JVM layout (plain or within a JAR): org/test/glsl/MyShaderTest.class org/test/glsl/shader/vertex.vp org/test/glsl/shader/fragment.fp org/test/glsl/shader/bin/nvidia/vertex.bvp org/test/glsl/shader/bin/nvidia/fragment.bfp Your Android APK layout: classes.dex assets/org/test/glsl/shader/vertex.vp assets/org/test/glsl/shader/fragment.fp assets/org/test/glsl/shader/bin/nvidia/vertex.bvp assets/org/test/glsl/shader/bin/nvidia/fragment.bfp ... Your invocation in org/test/glsl/MyShaderTest.java: ShaderCode vp0 = ShaderCode.create(gl, GL2ES2.GL_VERTEX_SHADER, this.getClass(), "shader", "shader/bin", "vertex", true); ShaderCode fp0 = ShaderCode.create(gl, GL2ES2.GL_FRAGMENT_SHADER, this.getClass(), "shader", "shader/bin", "fragment", true); ShaderProgram sp0 = new ShaderProgram(); sp0.add(gl, vp0, System.err); sp0.add(gl, fp0, System.err); st.attachShaderProgram(gl, sp0, true);
- Parameters:
gl
- current GL object to determine whether a shader compiler is available (ifsource
is used), or to determine the shader binary format (ifbinary
is used).type
- eitherGL2ES2.GL_VERTEX_SHADER
,GL2ES2.GL_FRAGMENT_SHADER
,GL3ES3.GL_GEOMETRY_SHADER
,GL3ES3.GL_TESS_CONTROL_SHADER
,GL3ES3.GL_TESS_EVALUATION_SHADER
orGL3ES3.GL_COMPUTE_SHADER
.context
- class used to help resolving the source and binary locationsrcRoot
- relative root path forbasename
optionalbinRoot
- relative root path forbasename
mutableStringBuilder
- iftrue
method returns a mutableStringBuilder
instance which can be edited later on at the costs of a String conversion when passing toGL2ES2.glShaderSource(int, int, String[], IntBuffer)
. Iffalse
method returns an immutableString
instance, which can be passed toGL2ES2.glShaderSource(int, int, String[], IntBuffer)
at no additional costs.basenames
- basename w/o path or suffix relative tosrcRoot
andbinRoot
for the shader's source and binary code.mutableStringBuilder
- iftrue
method returns a mutableStringBuilder
instance which can be edited later on at the costs of a String conversion when passing toGL2ES2.glShaderSource(int, int, String[], IntBuffer)
. Iffalse
method returns an immutableString
instance, which can be passed toGL2ES2.glShaderSource(int, int, String[], IntBuffer)
at no additional costs.- Throws:
IllegalArgumentException
- ifcount
is not 1
-
id
public int id()
returns the uniq shader id as an integer
-
shaderType
public int shaderType()
-
shaderTypeStr
public String shaderTypeStr()
-
shaderTypeStr
public static String shaderTypeStr(int type)
-
shaderBinaryFormat
public int shaderBinaryFormat()
-
shaderBinary
public Buffer shaderBinary()
-
shaderSource
public CharSequence[][] shaderSource()
-
isValid
public boolean isValid()
-
shader
public IntBuffer shader()
-
compile
public boolean compile(GL2ES2 gl)
-
compile
public boolean compile(GL2ES2 gl, PrintStream verboseOut)
-
destroy
public void destroy(GL2ES2 gl)
-
dumpShaderSource
public void dumpShaderSource(PrintStream out)
-
insertShaderSource
public int insertShaderSource(int shaderIdx, String tag, int fromIndex, CharSequence data)
Addsdata
after the line containingtag
.Note: The shader source to be edit must be created using a mutable StringBuilder.
- Parameters:
shaderIdx
- the shader index to be used.tag
- search stringfromIndex
- start searchtag
begininig with this indexdata
- the text to be inserted. Shall end with an EOL '\n' character.- Returns:
- index after the inserted
data
- Throws:
IllegalStateException
- if the shader source's CharSequence is immutable, i.e. not of typeStringBuilder
-
replaceInShaderSource
public int replaceInShaderSource(String oldName, String newName)
ReplacesoldName
withnewName
in all shader sources.In case
oldName
andnewName
are equal, no action is performed.Note: The shader source to be edit must be created using a mutable StringBuilder.
- Parameters:
oldName
- the to be replace stringnewName
- the replacement string- Returns:
- the number of replacements
- Throws:
IllegalStateException
- if the shader source's CharSequence is immutable, i.e. not of typeStringBuilder
-
insertShaderSource
public int insertShaderSource(int shaderIdx, int position, CharSequence data)
Addsdata
atposition
in shader source for shadershaderIdx
.Note: The shader source to be edit must be created using a mutable StringBuilder.
- Parameters:
shaderIdx
- the shader index to be used.position
- in shader source segments of shadershaderIdx
, -1 will append datadata
- the text to be inserted. Shall end with an EOL '\n' character- Returns:
- index after the inserted
data
- Throws:
IllegalStateException
- if the shader source's CharSequence is immutable, i.e. not of typeStringBuilder
-
insertShaderSource
public int insertShaderSource(int shaderIdx, int position, Class<?> context, String path) throws IOException
Adds shader source located inpath
, either relative to thecontext
class or absolute as-is atposition
in shader source for shadershaderIdx
.Final location lookup is performed via
ClassLoader.getResource(String)
andClassLoader.getSystemResource(String)
, seeIOUtil#getResource(Class, String)
.Note: The shader source to be edit must be created using a mutable StringBuilder.
- Parameters:
shaderIdx
- the shader index to be used.position
- in shader source segments of shadershaderIdx
, -1 will append datacontext
- class used to help resolve the source locationpath
- location of shader source- Returns:
- index after the inserted code.
- Throws:
IOException
IllegalStateException
- if the shader source's CharSequence is immutable, i.e. not of typeStringBuilder
- See Also:
IOUtil#getResource(Class, String)
-
readShaderSource
public static void readShaderSource(Class<?> context, URLConnection conn, StringBuilder result) throws IOException
Reads shader source located inconn
.- Parameters:
context
- class used to help resolve the source location, may benull
conn
- theURLConnection
of the shader sourceresult
-StringBuilder
sink for the resulting shader source code- Throws:
IOException
-
readShaderSource
public static CharSequence readShaderSource(Class<?> context, String path, boolean mutableStringBuilder) throws IOException
Reads shader source located inpath
, either relative to thecontext
class or absolute as-is.Final location lookup is performed via
ClassLoader.getResource(String)
andClassLoader.getSystemResource(String)
, seeIOUtil#getResource(Class, String)
.- Parameters:
context
- class used to help resolve the source locationpath
- location of shader sourcemutableStringBuilder
- iftrue
method returns a mutableStringBuilder
instance which can be edited later on at the costs of a String conversion when passing toGL2ES2.glShaderSource(int, int, String[], IntBuffer)
. Iffalse
method returns an immutableString
instance, which can be passed toGL2ES2.glShaderSource(int, int, String[], IntBuffer)
at no additional costs.- Throws:
IOException
- See Also:
IOUtil#getResource(Class, String)
-
readShaderSource
public static CharSequence readShaderSource(Uri sourceLocation, boolean mutableStringBuilder) throws IOException
- Parameters:
sourceLocation
-Uri
location of shader sourcemutableStringBuilder
- iftrue
method returns a mutableStringBuilder
instance which can be edited later on at the costs of a String conversion when passing toGL2ES2.glShaderSource(int, int, String[], IntBuffer)
. Iffalse
method returns an immutableString
instance, which can be passed toGL2ES2.glShaderSource(int, int, String[], IntBuffer)
at no additional costs.- Throws:
IOException
- Since:
- 2.3.2
-
readShaderBinary
public static ByteBuffer readShaderBinary(Class<?> context, String path) throws IOException
Reads shader binary located inpath
, either relative to thecontext
class or absolute as-is.Final location lookup is perfomed via
ClassLoader.getResource(String)
andClassLoader.getSystemResource(String)
, seeIOUtil#getResource(Class, String)
.- Parameters:
context
- class used to help resolve the source locationpath
- location of shader binary- Throws:
IOException
- See Also:
IOUtil#getResource(Class, String)
-
readShaderBinary
public static ByteBuffer readShaderBinary(Uri binLocation) throws IOException
- Parameters:
binLocation
-Uri
location of shader binary- Throws:
IOException
- Since:
- 2.3.2
-
createExtensionDirective
public static String createExtensionDirective(String extensionName, String behavior)
-
addGLSLVersion
public final int addGLSLVersion(GL2ES2 gl)
Add GLSL version at the head of this shader source code.Note: The shader source to be edit must be created using a mutable StringBuilder.
- Parameters:
gl
- a GL context, which must have been made current once- Returns:
- the index after the inserted data, maybe 0 if nothing has be inserted.
-
addDefaultShaderPrecision
public final int addDefaultShaderPrecision(GL2ES2 gl, int pos)
Adds default precision to source code at given position if required, i.e.es2_default_precision_vp
,es2_default_precision_fp
,gl3_default_precision_vp_gp
,gl3_default_precision_fp
or none, depending on theGLSL version
being used.Note: The shader source to be edit must be created using a mutable StringBuilder.
- Parameters:
gl
- a GL context, which must have been made current oncepos
- position within this mutable shader source.- Returns:
- the index after the inserted data, maybe 0 if nothing has be inserted.
-
requiresDefaultPrecision
public static final boolean requiresDefaultPrecision(GL2ES2 gl)
Returns true, if GLSL version requires default precision, i.e. ES2 or GLSL [1.30 .. 1.50[.
-
requiresGL3DefaultPrecision
public static final boolean requiresGL3DefaultPrecision(GL2ES2 gl)
Returns true, if GL3 GLSL version requires default precision, i.e. GLSL [1.30 .. 1.50[.
-
defaultShaderCustomization
public final int defaultShaderCustomization(GL2ES2 gl, boolean preludeVersion, boolean addDefaultPrecision)
Default customization of this shader source code.Note: The shader source to be edit must be created using a mutable StringBuilder.
- Parameters:
gl
- a GL context, which must have been made current oncepreludeVersion
- if trueGLContext.getGLSLVersionString()
is preluded, otherwise not.addDefaultPrecision
- iftrue
default precision source code line(s) are added, i.e.es2_default_precision_vp
,es2_default_precision_fp
,gl3_default_precision_vp_gp
,gl3_default_precision_fp
or none, depending on theGLSL version
being used.- Returns:
- the index after the inserted data, maybe 0 if nothing has be inserted.
- See Also:
addGLSLVersion(GL2ES2)
,addDefaultShaderPrecision(GL2ES2, int)
-
defaultShaderCustomization
public final int defaultShaderCustomization(GL2ES2 gl, boolean preludeVersion, String esDefaultPrecision)
Default customization of this shader source code.Note: The shader source to be edit must be created using a mutable StringBuilder.
- Parameters:
gl
- a GL context, which must have been made current oncepreludeVersion
- if trueGLContext.getGLSLVersionString()
is preluded, otherwise not.esDefaultPrecision
- optional default precision source code line(s) preluded if not null and ifGLBase.isGLES()
. You may usees2_default_precision_fp
for fragment shader andes2_default_precision_vp
for vertex shader.- Returns:
- the index after the inserted data, maybe 0 if nothing has be inserted.
- See Also:
addGLSLVersion(GL2ES2)
,addDefaultShaderPrecision(GL2ES2, int)
-
-