29package com.jogamp.opengl.util.glsl;
31import java.io.BufferedInputStream;
32import java.io.BufferedReader;
33import java.io.FileNotFoundException;
34import java.io.IOException;
35import java.io.InputStreamReader;
36import java.io.PrintStream;
37import java.io.StringReader;
38import java.net.URISyntaxException;
39import java.net.URLConnection;
40import java.nio.Buffer;
41import java.nio.ByteBuffer;
42import java.nio.IntBuffer;
43import java.util.Arrays;
44import java.util.Iterator;
47import com.jogamp.opengl.GL;
48import com.jogamp.opengl.GL2ES2;
49import com.jogamp.opengl.GL3;
50import com.jogamp.opengl.GL3ES3;
51import com.jogamp.opengl.GL4;
52import com.jogamp.opengl.GLES2;
53import com.jogamp.opengl.GLContext;
54import com.jogamp.opengl.GLException;
56import jogamp.opengl.Debug;
58import com.jogamp.common.net.Uri;
59import com.jogamp.common.nio.Buffers;
60import com.jogamp.common.util.IOUtil;
61import com.jogamp.common.util.VersionNumber;
76 public static final boolean DEBUG_CODE = Debug.isPropertyDefined(
"jogl.debug.GLSLCode",
true);
144 public ShaderCode(
final int type,
final int count,
final CharSequence[][] source) {
145 if(source.length != count) {
146 throw new IllegalArgumentException(
"shader number ("+count+
") and sourceFiles array ("+source.length+
") of different lenght.");
157 throw new GLException(
"Unknown shader type: "+type);
159 shaderSource = source;
160 shaderBinaryFormat = -1;
163 shader = Buffers.newDirectIntBuffer(count);
167 System.out.println(
"Created: "+
toString());
178 public ShaderCode(
final int type,
final int count,
final int binFormat,
final Buffer binary) {
188 throw new GLException(
"Unknown shader type: "+type);
191 shaderBinaryFormat = binFormat;
192 shaderBinary = binary;
194 shader = Buffers.newDirectIntBuffer(count);
219 final String[] sourceFiles,
final boolean mutableStringBuilder) {
224 CharSequence[][] shaderSources =
null;
225 if(
null!=sourceFiles) {
227 shaderSources =
new CharSequence[sourceFiles.length][1];
228 for(
int i=0; i<sourceFiles.length; i++) {
230 shaderSources[i][0] = readShaderSource(context, sourceFiles[i], mutableStringBuilder);
231 }
catch (
final IOException ioe) {
232 throw new RuntimeException(
"readShaderSource("+sourceFiles[i]+
") error: ", ioe);
234 if(
null == shaderSources[i][0]) {
235 shaderSources =
null;
239 if(
null==shaderSources) {
242 return new ShaderCode(type, count, shaderSources);
266 final Uri[] sourceLocations,
final boolean mutableStringBuilder) {
271 CharSequence[][] shaderSources =
null;
272 if(
null!=sourceLocations) {
274 shaderSources =
new CharSequence[sourceLocations.length][1];
275 for(
int i=0; i<sourceLocations.length; i++) {
277 shaderSources[i][0] = readShaderSource(sourceLocations[i], mutableStringBuilder);
278 }
catch (
final IOException ioe) {
279 throw new RuntimeException(
"readShaderSource("+sourceLocations[i]+
") error: ", ioe);
281 if(
null == shaderSources[i][0]) {
282 shaderSources =
null;
286 if(
null==shaderSources) {
289 return new ShaderCode(type, count, shaderSources);
306 public static ShaderCode create(
final int type,
final int count,
final Class<?> context,
int binFormat,
final String binaryFile) {
307 ByteBuffer shaderBinary =
null;
308 if(
null!=binaryFile && 0<=binFormat) {
311 }
catch (
final IOException ioe) {
312 throw new RuntimeException(
"readShaderBinary("+binaryFile+
") error: ", ioe);
314 if(
null == shaderBinary) {
318 if(
null==shaderBinary) {
321 return new ShaderCode(type, count, binFormat, shaderBinary);
337 public static ShaderCode create(
final int type,
final int count,
int binFormat,
final Uri binLocation) {
338 ByteBuffer shaderBinary =
null;
339 if(
null!=binLocation && 0<=binFormat) {
342 }
catch (
final IOException ioe) {
343 throw new RuntimeException(
"readShaderBinary("+binLocation+
") error: ", ioe);
345 if(
null == shaderBinary) {
349 if(
null==shaderBinary) {
352 return new ShaderCode(type, count, binFormat, shaderBinary);
398 throw new GLException(
"illegal shader type: "+type);
417 throw new GLException(
"unsupported binary format: "+binFormat);
509 final String srcRoot,
final String[] srcBasenames,
final String srcSuffixOpt,
510 final String binRoot,
final String binBasename,
final String binSuffixOpt,
511 final boolean mutableStringBuilder) {
513 final String srcPath[];
514 String srcPathString =
null;
515 String binFileName =
null;
518 srcPath =
new String[srcBasenames.length];
519 final String srcSuffix =
null != srcSuffixOpt ? srcSuffixOpt :
getFileSuffix(
false, type);
520 if(
null != srcRoot && srcRoot.length() > 0 ) {
521 for(
int i=0; i<srcPath.length; i++) {
522 srcPath[i] = srcRoot +
'/' + srcBasenames[i] +
"." + srcSuffix;
525 for(
int i=0; i<srcPath.length; i++) {
526 srcPath[i] = srcBasenames[i] +
"." + srcSuffix;
529 res =
create(gl, type, count, context, srcPath, mutableStringBuilder);
533 srcPathString = Arrays.
toString(srcPath);
537 if(
null!=binBasename ) {
539 final String binSuffix =
null != binSuffixOpt ? binSuffixOpt :
getFileSuffix(
true, type);
540 for(
final Iterator<Integer> iter=binFmts.iterator(); iter.hasNext(); ) {
541 final int bFmt = iter.next().intValue();
543 if(
null==bFmtPath)
continue;
544 binFileName = binRoot +
'/' + bFmtPath +
'/' + binBasename +
"." + binSuffix;
545 res =
create(type, count, context, bFmt, binFileName);
551 throw new GLException(
"No shader code found (source nor binary) for src: "+srcPathString+
552 ", bin: "+binFileName);
636 final String srcRoot,
final String[] srcBasenames,
637 final String binRoot,
final String binBasename,
638 final boolean mutableStringBuilder) {
639 return create(gl, type, count, context, srcRoot, srcBasenames,
null,
640 binRoot, binBasename,
null, mutableStringBuilder);
703 final String srcRoot,
final String binRoot,
704 final String basename,
final String srcSuffixOpt,
final String binSuffixOpt,
705 final boolean mutableStringBuilder) {
706 return create(gl, type, 1, context, srcRoot,
new String[] { basename }, srcSuffixOpt,
707 binRoot, basename, binSuffixOpt, mutableStringBuilder );
769 final String srcRoot,
final String binRoot,
final String basename,
770 final boolean mutableStringBuilder) {
771 return ShaderCode.
create(gl, type, context, srcRoot, binRoot, basename,
null,
null, mutableStringBuilder);
785 return "VERTEX_SHADER";
787 return "FRAGMENT_SHADER";
789 return "GEOMETRY_SHADER";
791 return "TESS_CONTROL_SHADER";
793 return "TESS_EVALUATION_SHADER";
795 return "COMPUTE_SHADER";
797 return "UNKNOWN_SHADER";
815 if(
null!=shaderSource) {
817 System.err.println(
"ShaderCode.compile:");
821 shaderSource, verboseOut);
822 }
else if(
null!=shaderBinary) {
824 shaderBinaryFormat, shaderBinary, verboseOut);
826 throw new GLException(
"no code (source or binary)");
838 if(
null!=shaderBinary) {
839 shaderBinary.clear();
843 shaderBinaryFormat=-1;
849 public boolean equals(
final Object obj) {
850 if(
this==obj) {
return true; }
862 final StringBuilder buf =
new StringBuilder(
"ShaderCode[id="+
id()+
", type="+
shaderTypeStr()+
", valid="+valid+
", "+shader.remaining()+
"/"+shader.capacity()+
" shader: ");
863 for(
int i=0; i<shader.remaining(); i++) {
864 buf.append(
" "+shader.get(i));
866 if(
null!=shaderSource) {
867 buf.append(
", source]");
868 }
else if(
null!=shaderBinary) {
869 buf.append(
", binary "+shaderBinary+
"]");
871 return buf.toString();
875 if(
null==shaderSource) {
876 out.println(
"<no shader source>");
879 final int sourceCount = shaderSource.length;
880 final int shaderCount = shader.capacity();
882 out.print(
"ShaderCode[id="+
id()+
", type="+
shaderTypeStr()+
", valid="+valid+
", "+shader.remaining()+
"/"+shaderCount+
" shader: ");
883 if( 0 == shaderCount ) {
884 out.println(
"none]");
886 for(
int i=0; i<shaderCount; i++) {
888 out.println(
"Shader #"+i+
"/"+shaderCount+
" name "+shader.get(i));
889 out.println(
"--------------------------------------------------------------");
891 out.println(
"<no shader source>");
893 final CharSequence[] src = shaderSource[i];
896 for(
int j=0; j<src.length; j++) {
897 out.printf(
"%4d: // Segment %d/%d: \n", lineno, j, src.length);
898 final BufferedReader reader =
new BufferedReader(
new StringReader(src[j].
toString()));
901 while ((line = reader.readLine()) !=
null) {
903 out.printf(
"%4d: %s\n", lineno, line);
905 }
catch (
final IOException e) { }
908 out.println(
"--------------------------------------------------------------");
927 public int insertShaderSource(
final int shaderIdx,
final String tag,
final int fromIndex,
final CharSequence data) {
928 if(
null==shaderSource) {
929 throw new IllegalStateException(
"no shader source");
931 final int shaderCount = shader.capacity();
932 if(0>shaderIdx || shaderIdx>=shaderCount) {
933 throw new IndexOutOfBoundsException(
"shaderIdx not within shader bounds [0.."+(shaderCount-1)+
"]: "+shaderIdx);
935 final int sourceCount = shaderSource.length;
936 if(shaderIdx>=sourceCount) {
937 throw new IndexOutOfBoundsException(
"shaderIdx not within source bounds [0.."+(sourceCount-1)+
"]: "+shaderIdx);
939 final CharSequence[] src = shaderSource[shaderIdx];
941 for(
int j=0; j<src.length; j++) {
942 if( !(src[j] instanceof StringBuilder) ) {
943 throw new IllegalStateException(
"shader source not a mutable StringBuilder, but CharSequence of type: "+src[j].getClass().getName());
945 final StringBuilder sb = (StringBuilder)src[j];
946 curEndIndex += sb.length();
947 if(fromIndex < curEndIndex) {
948 int insertIdx = sb.indexOf(tag, fromIndex);
950 insertIdx += tag.length();
951 int eol = sb.indexOf(
"\n", insertIdx);
953 eol = sb.indexOf(
"\r", insertIdx);
958 sb.insert(insertIdx,
"\n");
961 sb.insert(insertIdx, data);
962 return insertIdx+data.length();
985 if(
null==shaderSource) {
986 throw new IllegalStateException(
"no shader source");
988 if(oldName == newName || oldName.equals(newName)) {
991 final int oldNameLen = oldName.length();
992 final int newNameLen = newName.length();
994 final int sourceCount = shaderSource.length;
995 for(
int shaderIdx = 0; shaderIdx<sourceCount; shaderIdx++) {
996 final CharSequence[] src = shaderSource[shaderIdx];
997 for(
int j=0; j<src.length; j++) {
998 if( !(src[j] instanceof StringBuilder) ) {
999 throw new IllegalStateException(
"shader source not a mutable StringBuilder, but CharSequence of type: "+src[j].getClass().getName());
1001 final StringBuilder sb = (StringBuilder)src[j];
1003 while(curPos<sb.length()-oldNameLen+1) {
1004 final int startIdx = sb.indexOf(oldName, curPos);
1006 final int endIdx = startIdx + oldNameLen;
1007 sb.replace(startIdx, endIdx, newName);
1008 curPos = startIdx + newNameLen;
1011 curPos = sb.length();
1033 if(
null==shaderSource) {
1034 throw new IllegalStateException(
"no shader source");
1036 final int shaderCount = shader.capacity();
1037 if(0>shaderIdx || shaderIdx>=shaderCount) {
1038 throw new IndexOutOfBoundsException(
"shaderIdx not within shader bounds [0.."+(shaderCount-1)+
"]: "+shaderIdx);
1040 final int sourceCount = shaderSource.length;
1041 if(shaderIdx>=sourceCount) {
1042 throw new IndexOutOfBoundsException(
"shaderIdx not within source bounds [0.."+(sourceCount-1)+
"]: "+shaderIdx);
1044 final CharSequence[] src = shaderSource[shaderIdx];
1045 int curEndIndex = 0;
1046 for(
int j=0; j<src.length; j++) {
1047 if( !(src[j] instanceof StringBuilder) ) {
1048 throw new IllegalStateException(
"shader source not a mutable StringBuilder, but CharSequence of type: "+src[j].getClass().getName());
1050 final StringBuilder sb = (StringBuilder)src[j];
1051 curEndIndex += sb.length();
1052 if( 0 > position && j == src.length - 1 ) {
1053 position = curEndIndex;
1055 if(0 <= position && position <= curEndIndex ) {
1056 sb.insert(position, data);
1057 return position+data.length();
1084 public int insertShaderSource(
final int shaderIdx,
final int position,
final Class<?> context,
final String path)
throws IOException {
1085 final CharSequence data = readShaderSource(context, path,
true);
1086 if(
null != data ) {
1093 private static int readShaderSource(
final Class<?> context,
final URLConnection conn,
final StringBuilder result,
int lineno)
throws IOException {
1096 result.append(
"// "+conn.getURL().toExternalForm()+
"\n");
1098 result.append(
"// included @ line "+lineno+
": "+conn.getURL().toExternalForm()+
"\n");
1101 final BufferedReader reader =
new BufferedReader(
new InputStreamReader(conn.getInputStream()));
1104 while ((line = reader.readLine()) !=
null) {
1106 if (line.startsWith(
"#include ")) {
1107 final String includeFile;
1109 String s = line.substring(9).trim();
1111 if( s.startsWith(
"\"") && s.endsWith(
"\"")) {
1112 s = s.substring(1, s.length()-1);
1116 URLConnection nextConn =
null;
1119 final Uri relUri = Uri.valueOf( conn.getURL() ).getRelativeOf(
new Uri.Encoded( includeFile, Uri.PATH_LEGAL ));
1120 nextConn = IOUtil.openURL(relUri.toURL(),
"ShaderCode.relativeOf ");
1121 if (nextConn ==
null) {
1123 nextConn = IOUtil.getResource(includeFile, context.getClassLoader(), context);
1125 if (nextConn ==
null) {
1127 throw new FileNotFoundException(
"Can't find include file " + includeFile);
1129 lineno = readShaderSource(context, nextConn, result, lineno);
1131 result.append(line +
"\n");
1134 }
catch (
final URISyntaxException e) {
1135 throw new IOException(e);
1137 IOUtil.close(reader,
false);
1150 public static void readShaderSource(
final Class<?> context,
final URLConnection conn,
final StringBuilder result)
throws IOException {
1151 readShaderSource(context, conn, result, 0);
1174 public static CharSequence
readShaderSource(
final Class<?> context,
final String path,
final boolean mutableStringBuilder)
throws IOException {
1175 final URLConnection conn = IOUtil.getResource(path, context.getClassLoader(), context);
1179 final StringBuilder result =
new StringBuilder();
1180 readShaderSource(context, conn, result);
1181 return mutableStringBuilder ? result : result.toString();
1196 public static CharSequence
readShaderSource(
final Uri sourceLocation,
final boolean mutableStringBuilder)
throws IOException {
1197 final URLConnection conn = IOUtil.openURL(sourceLocation.toURL(),
"ShaderCode ");
1201 final StringBuilder result =
new StringBuilder();
1202 readShaderSource(
null, conn, result);
1203 return mutableStringBuilder ? result : result.toString();
1220 public static ByteBuffer
readShaderBinary(
final Class<?> context,
final String path)
throws IOException {
1221 final URLConnection conn = IOUtil.getResource(path, context.getClassLoader(), context);
1225 final BufferedInputStream bis =
new BufferedInputStream( conn.getInputStream() );
1227 return IOUtil.copyStream2ByteBuffer( bis );
1229 IOUtil.close(bis,
false);
1240 final URLConnection conn = IOUtil.openURL(binLocation.toURL(),
"ShaderCode ");
1244 final BufferedInputStream bis =
new BufferedInputStream( conn.getInputStream() );
1246 return IOUtil.copyStream2ByteBuffer( bis );
1248 IOUtil.close(bis,
false);
1254 public static final String
es2_default_precision_vp =
"\nprecision highp float;\nprecision highp int;\n/*precision lowp sampler2D;*/\n/*precision lowp samplerCube;*/\n";
1256 public static final String
es2_default_precision_fp =
"\nprecision mediump float;\nprecision mediump int;\n/*precision lowp sampler2D;*/\n/*precision lowp samplerCube;*/\n";
1270 public static final String
gl3_default_precision_fp =
"\nprecision highp float;\nprecision mediump int;\n/*precision mediump sampler2D;*/\n";
1275 public static final String
ENABLE =
"enable";
1279 public static final String
WARN =
"warn";
1292 return "#extension " + extensionName +
" : " + behavior +
"\n";
1320 final String defaultPrecision;
1322 switch ( shaderType ) {
1330 defaultPrecision =
null;
1334 switch ( shaderType ) {
1340 defaultPrecision =
null;
1345 switch ( shaderType ) {
1356 defaultPrecision =
null;
1360 defaultPrecision =
null;
1362 if(
null != defaultPrecision ) {
1379 final VersionNumber glslVersion = gl.
getContext().getGLSLVersionNumber();
1403 if( preludeVersion ) {
1408 if( addDefaultPrecision ) {
1429 if( preludeVersion ) {
1434 if( gl.
isGLES() &&
null != esDefaultPrecision ) {
1446 private CharSequence[][] shaderSource;
1447 private Buffer shaderBinary;
1448 private int shaderBinaryFormat = -1;
1449 private final IntBuffer shader;
1450 private int shaderType = -1;
1451 private int id = -1;
1453 private boolean valid=
false;
1455 private static synchronized int getNextID() {
1458 private static int nextID = 1;
Abstraction for an OpenGL rendering context.
final String getGLSLVersionString()
Returns the matching GLSL version number, queried by this context GL via GL2ES2#GL_SHADING_LANGUAGE_V...
static final VersionNumber Version1_30
Version 1.30, i.e.
static final VersionNumber Version1_50
Version 1.50, i.e.
A generic exception for OpenGL errors used throughout the binding as a substitute for RuntimeExceptio...
Convenient shader code class to use and instantiate vertex or fragment programs.
static final String SUFFIX_COMPUTE_SOURCE
Unique resource suffix for GL3ES3#GL_COMPUTE_SHADER in source code: {@value}
static ByteBuffer readShaderBinary(final Uri binLocation)
Reads shader binary located from Uri#absolute Uri binLocation.
void dumpSource(final PrintStream out)
static String getFileSuffix(final boolean binary, final int type)
Returns a unique suffix for shader resources as follows:
static final String SUFFIX_COMPUTE_BINARY
Unique resource suffix for GL3ES3#GL_COMPUTE_SHADER in binary: {@value}
static final String SUB_PATH_NVIDIA
Unique relative path for binary shader resources for NVIDIA: {@value}
static ByteBuffer readShaderBinary(final Class<?> context, final String path)
Reads shader binary located in path, either relative to the context class or absolute as-is.
int insertShaderSource(final int shaderIdx, int position, final CharSequence data)
Adds data at position in shader source for shader shaderIdx.
static ShaderCode create(final GL2ES2 gl, final int type, final int count, final Class<?> context, final String srcRoot, final String[] srcBasenames, final String srcSuffixOpt, final String binRoot, final String binBasename, final String binSuffixOpt, final boolean mutableStringBuilder)
Convenient creation method for instantiating a complete ShaderCode object either from source code usi...
static final String gl3_default_precision_vp_gp
Default precision of GLSL ≥ 1.30 as required until < 1.50 for vertex-shader or geometry-shader: {@val...
static final String es3_default_precision_fp
Default precision of ES3 for fragment-shader: {@value es3_default_precision_fp}, same as for vertex-s...
static ShaderCode create(final GL2ES2 gl, final int type, final Class<?> context, final String srcRoot, final String binRoot, final String basename, final String srcSuffixOpt, final String binSuffixOpt, final boolean mutableStringBuilder)
Simplified variation of create(GL2ES2, int, int, Class, String, String[], String, String,...
boolean compile(final GL2ES2 gl)
final int defaultShaderCustomization(final GL2ES2 gl, final boolean preludeVersion, final boolean addDefaultPrecision)
Default customization of this shader source code.
void destroy(final GL2ES2 gl)
final int defaultShaderCustomization(final GL2ES2 gl, final boolean preludeVersion, final String esDefaultPrecision)
Default customization of this shader source code.
final int addGLSLVersion(final GL2ES2 gl)
Add GLSL version at the head of this shader source code.
static final boolean DEBUG_CODE
static ShaderCode create(final GL2ES2 gl, final int type, final int count, final Class<?> context, final String[] sourceFiles, final boolean mutableStringBuilder)
Creates a complete ShaderCode object while reading all shader source of sourceFiles,...
static final String gl3_default_precision_fp
Default precision of GLSL ≥ 1.30 as required until < 1.50 for fragment-shader: {@value gl3_default_pr...
int insertShaderSource(final int shaderIdx, final int position, final Class<?> context, final String path)
Adds shader source located in path, either relative to the context class or absolute as-is at positio...
static final String SUFFIX_VERTEX_SOURCE
Unique resource suffix for GL2ES2#GL_VERTEX_SHADER in source code: {@value}
static final String SUFFIX_FRAGMENT_SOURCE
Unique resource suffix for GL2ES2#GL_FRAGMENT_SHADER in source code: {@value}
static ShaderCode create(final int type, final int count, int binFormat, final Uri binLocation)
Creates a complete ShaderCode object while reading the shader binary from Uri binLocations via readSh...
static final boolean requiresGL3DefaultPrecision(final GL2ES2 gl)
Returns true, if GL3 GLSL version requires default precision, i.e.
static String shaderTypeStr(final int type)
ShaderCode(final int type, final int count, final CharSequence[][] source)
static ShaderCode create(final GL2ES2 gl, final int type, final int count, final Uri[] sourceLocations, final boolean mutableStringBuilder)
Creates a complete ShaderCode object while reading all shader sources from Uri sourceLocations via re...
static ShaderCode create(final GL2ES2 gl, final int type, final int count, final Class<?> context, final String srcRoot, final String[] srcBasenames, final String binRoot, final String binBasename, final boolean mutableStringBuilder)
Simplified variation of create(GL2ES2, int, int, Class, String, String[], String, String,...
static String getBinarySubPath(final int binFormat)
Returns a unique relative path for binary shader resources as follows:
static final boolean requiresDefaultPrecision(final GL2ES2 gl)
Returns true, if GLSL version requires default precision, i.e.
boolean compile(final GL2ES2 gl, final PrintStream verboseOut)
static ShaderCode create(final int type, final int count, final Class<?> context, int binFormat, final String binaryFile)
Creates a complete ShaderCode object while reading the shader binary of binaryFile,...
static final String SUFFIX_GEOMETRY_BINARY
Unique resource suffix for GL3#GL_GEOMETRY_SHADER in binary: {@value}
int id()
returns the uniq shader id as an integer
static final String SUFFIX_VERTEX_BINARY
Unique resource suffix for GL2ES2#GL_VERTEX_SHADER in binary: {@value}
static void readShaderSource(final Class<?> context, final URLConnection conn, final StringBuilder result)
Reads shader source located in conn.
static final String WARN
Behavior for GLSL extension directive, see createExtensionDirective(String, String),...
static final String SUFFIX_TESS_CONTROL_SOURCE
Unique resource suffix for GL4#GL_TESS_CONTROL_SHADER in source code: {@value}
static final String SUFFIX_TESS_CONTROL_BINARY
Unique resource suffix for GL4#GL_TESS_CONTROL_SHADER in binary: {@value}
int replaceInShaderSource(final String oldName, final String newName)
Replaces oldName with newName in all shader sources.
boolean equals(final Object obj)
static final String ENABLE
Behavior for GLSL extension directive, see createExtensionDirective(String, String),...
static String createExtensionDirective(final String extensionName, final String behavior)
Creates a GLSL extension directive.
static ShaderCode create(final GL2ES2 gl, final int type, final Class<?> context, final String srcRoot, final String binRoot, final String basename, final boolean mutableStringBuilder)
Simplified variation of create(GL2ES2, int, Class, String, String, String, String,...
static final String REQUIRE
Behavior for GLSL extension directive, see createExtensionDirective(String, String),...
static final String SUFFIX_TESS_EVALUATION_SOURCE
Unique resource suffix for GL4#GL_TESS_EVALUATION_SHADER in source code: {@value}
static final String es2_default_precision_fp
Default precision of ES2 for fragment-shader: {@value es2_default_precision_fp}.
static CharSequence readShaderSource(final Uri sourceLocation, final boolean mutableStringBuilder)
Reads shader source located from Uri#absolute Uri sourceLocation.
static final String DISABLE
Behavior for GLSL extension directive, see createExtensionDirective(String, String),...
static final String es3_default_precision_vp
Default precision of ES3 for vertex-shader: {@value es3_default_precision_vp}.
ShaderCode(final int type, final int count, final int binFormat, final Buffer binary)
CharSequence[][] shaderSource()
static final String es2_default_precision_vp
Default precision of ES2 for vertex-shader: {@value es2_default_precision_vp}.
static final String SUFFIX_GEOMETRY_SOURCE
Unique resource suffix for GL3#GL_GEOMETRY_SHADER in source code: {@value}
final int addDefaultShaderPrecision(final GL2ES2 gl, int pos)
Adds default precision to source code at given position if required, i.e.
static final String SUFFIX_TESS_EVALUATION_BINARY
Unique resource suffix for GL4#GL_TESS_EVALUATION_SHADER in binary: {@value}
static CharSequence readShaderSource(final Class<?> context, final String path, final boolean mutableStringBuilder)
Reads shader source located in path, either relative to the context class or absolute as-is.
int insertShaderSource(final int shaderIdx, final String tag, final int fromIndex, final CharSequence data)
Adds data after the line containing tag.
static final String SUFFIX_FRAGMENT_BINARY
Unique resource suffix for GL2ES2#GL_FRAGMENT_SHADER in binary: {@value}
static boolean createAndLoadShader(final GL _gl, final IntBuffer shader, final int shaderType, final int binFormat, final java.nio.Buffer bin, final PrintStream verboseOut)
static void deleteShader(final GL _gl, final IntBuffer shaders)
static boolean isShaderCompilerAvailable(final GL _gl)
Returns true if a hader compiler is available, otherwise false.
static Set< Integer > getShaderBinaryFormats(final GL _gl)
If supported, queries the natively supported shader binary formats using GL2ES2#GL_NUM_SHADER_BINARY_...
static boolean createAndCompileShader(final GL _gl, final IntBuffer shader, final int shaderType, final CharSequence[][] sources, final PrintStream verboseOut)
static final int GL_VERTEX_SHADER
GL_ES_VERSION_2_0, GL_VERSION_2_0, GL_EXT_vertex_shader, GL_ARB_vertex_shader Alias for: GL_VERTEX_SH...
static final int GL_FRAGMENT_SHADER
GL_ES_VERSION_2_0, GL_VERSION_2_0, GL_ATI_fragment_shader, GL_ARB_fragment_shader Alias for: GL_FRAGM...
static final int GL_TESS_EVALUATION_SHADER
GL_ARB_tessellation_shader, GL_ES_VERSION_3_2, GL_VERSION_4_0, GL_EXT_tessellation_shader,...
static final int GL_COMPUTE_SHADER
GL_ARB_compute_shader, GL_ES_VERSION_3_1, GL_VERSION_4_3 Define "GL_COMPUTE_SHADER" with expression '...
static final int GL_TESS_CONTROL_SHADER
GL_ARB_tessellation_shader, GL_ES_VERSION_3_2, GL_VERSION_4_0, GL_EXT_tessellation_shader,...
static final int GL_GEOMETRY_SHADER
GL_ES_VERSION_3_2, GL_VERSION_3_2, GL_OES_geometry_shader, GL_EXT_geometry_shader4,...
boolean isGLES()
Indicates whether this GL object conforms to one of the OpenGL ES profiles, see isGLES1(),...
boolean isGL3()
Indicates whether this GL object conforms to the OpenGL ≥ 3.1 core profile.
GLContext getContext()
Returns the GLContext associated which this GL object.
boolean isGLES3()
Indicates whether this GL object conforms to the OpenGL ES ≥ 3.0 profile.
boolean isGLES2()
Indicates whether this GL object conforms to the OpenGL ES ≥ 2.0 profile.
static final int GL_NVIDIA_PLATFORM_BINARY_NV