public interface TextureSequence
Ensure to respect the texture coordinates provided by
TextureSequence.TextureFrame.getTexture().getImageTexCoords().
TexCubeES2)
static final String[] es2_prelude = { "#version 100\n", "precision mediump float;\n" };
static final String gl2_prelude = "#version 110\n";
static final String shaderBasename = "texsequence_xxx"; // the base shader code w/o headers
static final String myTextureLookupName = "myTexture2D"; // the desired texture lookup function
private void initShader(GL2ES2 gl, TextureSequence texSeq) {
// Create & Compile the shader objects
ShaderCode rsVp = ShaderCode.create(gl, GL2ES2.GL_VERTEX_SHADER, TexCubeES2.class,
"shader", "shader/bin", shaderBasename, true);
ShaderCode rsFp = ShaderCode.create(gl, GL2ES2.GL_FRAGMENT_SHADER, TexCubeES2.class,
"shader", "shader/bin", shaderBasename, true);
// Prelude shader code w/ GLSL profile specifics [ 1. pre-proc, 2. other ]
int rsFpPos;
if(gl.isGLES2()) {
// insert ES2 version string in beginning
rsVp.insertShaderSource(0, 0, es2_prelude[0]);
rsFpPos = rsFp.insertShaderSource(0, 0, es2_prelude[0]);
} else {
// insert GL2 version string in beginning
rsVp.insertShaderSource(0, 0, gl2_prelude);
rsFpPos = rsFp.insertShaderSource(0, 0, gl2_prelude);
}
// insert required extensions as determined by TextureSequence implementation.
rsFpPos = rsFp.insertShaderSource(0, rsFpPos, texSeq.getRequiredExtensionsShaderStub());
if(gl.isGLES2()) {
// insert ES2 default precision declaration
rsFpPos = rsFp.insertShaderSource(0, rsFpPos, es2_prelude[1]);
}
// negotiate the texture lookup function name
final String texLookupFuncName = texSeq.getTextureLookupFunctionName(myTextureLookupName);
// in case a fixed lookup function is being chosen, replace the name in our code
rsFp.replaceInShaderSource(myTextureLookupName, texLookupFuncName);
// Cache the TextureSequence shader details in StringBuilder:
final StringBuilder sFpIns = new StringBuilder();
// .. declaration of the texture sampler using the implementation specific type
sFpIns.append("uniform ").append(texSeq.getTextureSampler2DType()).append(" mgl_ActiveTexture;\n");
// .. the actual texture lookup function, maybe null in case a built-in function is being used
sFpIns.append(texSeq.getTextureLookupFragmentShaderImpl());
// Now insert the TextureShader details in our shader after the given tag:
rsFp.insertShaderSource(0, "TEXTURE-SEQUENCE-CODE-BEGIN", 0, sFpIns);
// Create & Link the shader program
ShaderProgram sp = new ShaderProgram();
sp.add(rsVp);
sp.add(rsFp);
if(!sp.link(gl, System.err)) {
throw new GLException("Couldn't link program: "+sp);
}
...
The above procedure might look complicated, however, it allows most flexibility and
workarounds to also deal with GLSL bugs.| Modifier and Type | Interface and Description |
|---|---|
static interface |
TextureSequence.TexSeqEventListener<T extends TextureSequence>
Event listener to notify users of updates regarding the
TextureSequence. |
static class |
TextureSequence.TextureFrame
Texture holder interface, maybe specialized by implementation
to associated related data.
|
| Modifier and Type | Field and Description |
|---|---|
static String |
sampler2D |
static String |
samplerExternalOES |
| Modifier and Type | Method and Description |
|---|---|
TextureSequence.TextureFrame |
getLastTexture()
Returns the last updated texture.
|
TextureSequence.TextureFrame |
getNextTexture(GL gl)
Returns the next texture to be rendered.
|
String |
getRequiredExtensionsShaderStub()
In case a shader extension is required, based on the implementation
and the runtime GL profile, this method returns the preprocessor macros, e.g.:
|
int |
getTextureFragmentShaderHashCode()
Returns the hash code of the strings:
getTextureLookupFragmentShaderImpl()
getTextureSampler2DType()
|
String |
getTextureLookupFragmentShaderImpl()
Returns the complete texture2D lookup function code of type
|
String |
getTextureLookupFunctionName(String desiredFuncName) |
int[] |
getTextureMinMagFilter() |
String |
getTextureSampler2DType()
Returns either
sampler2D or samplerExternalOES
depending on getLastTexture().getTexture().getTarget(). |
int |
getTextureTarget()
Returns the texture target used by implementation.
|
int |
getTextureUnit()
Return the texture unit used to render the current frame.
|
int[] |
getTextureWrapST() |
boolean |
isTextureAvailable()
Returns true if texture source is ready and a texture is available
via
getNextTexture(GL) and getLastTexture(). |
static final String samplerExternalOES
static final String sampler2D
int getTextureTarget()
int getTextureUnit()
int[] getTextureMinMagFilter()
int[] getTextureWrapST()
boolean isTextureAvailable()
getNextTexture(GL) and getLastTexture().TextureSequence.TextureFrame getLastTexture() throws IllegalStateException
In case the instance is just initialized, it shall return a TextureFrame
object with valid attributes. The texture content may be undefined
until the first call of getNextTexture(GL).
IllegalStateException - if instance is not initializedTextureSequence.TextureFrame getNextTexture(GL gl) throws IllegalStateException
Implementation shall return the next frame if available, may block if a next frame may arrive soon. Otherwise implementation shall return the last frame.
Shall return null in case no next or last frame is available.
IllegalStateException - if instance is not initializedString getRequiredExtensionsShaderStub() throws IllegalStateException
#extension GL_OES_EGL_image_external : enable
IllegalStateException - if instance is not initializedString getTextureSampler2DType() throws IllegalStateException
sampler2D or samplerExternalOES
depending on getLastTexture().getTexture().getTarget().IllegalStateException - if instance is not initializedString getTextureLookupFunctionName(String desiredFuncName) throws IllegalStateException
desiredFuncName - desired lookup function name. If null or ignored by the implementation,
a build-in name is returned.IllegalStateException - if instance is not initialized#getTextureLookupFragmentShaderImpl()}String getTextureLookupFragmentShaderImpl() throws IllegalStateException
vec4 funcName(in getTextureSampler2DType() image, in vec2 texCoord) {
vec4 texColor = do_something_with(image, texCoord);
return texColor;
}
funcName can be negotiated and queried via getTextureLookupFunctionName(String).
getTextureLookupFunctionName(String) will ignore the desired function name
and returns the build-in lookup function name.
IllegalStateException - if instance is not initializedgetTextureLookupFunctionName(String),
getTextureSampler2DType()int getTextureFragmentShaderHashCode()
Returns zero if texture is not available.
TextureSequence instance.
Implementation shall cache the resulting hash code,
which must be reset to zero if texture is not available.
Copyright 2010 JogAmp Community.