|
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | ||||||||
public interface TextureSequence
Protocol for texture sequences, like animations, movies, etc.
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 StringBuffer:
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.
| Nested Class Summary | |
|---|---|
static interface |
TextureSequence.TexSeqEventListener<T extends TextureSequence>
|
static class |
TextureSequence.TextureFrame
Texture holder interface, maybe specialized by implementation to associated related data. |
| Field Summary | |
|---|---|
static String |
GL_OES_EGL_image_external_Required_Prelude
|
static String |
sampler2D
|
static String |
samplerExternalOES
|
| Method Summary | |
|---|---|
TextureSequence.TextureFrame |
getLastTexture()
Returns the last updated texture. |
TextureSequence.TextureFrame |
getNextTexture(GL gl,
boolean blocking)
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.: |
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 |
getTextureUnit()
Return the texture unit to be used with this frame. |
int[] |
getTextureWrapST()
|
| Field Detail |
|---|
static final String GL_OES_EGL_image_external_Required_Prelude
static final String samplerExternalOES
static final String sampler2D
| Method Detail |
|---|
int getTextureUnit()
int[] getTextureMinMagFilter()
int[] getTextureWrapST()
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, boolean).
IllegalStateException - if instance is not initialized
TextureSequence.TextureFrame getNextTexture(GL gl,
boolean blocking)
throws IllegalStateException
Implementation shall block until next frame is available if blocking is true,
otherwise it shall return the last frame in case a new frame is not available.
Shall return null in case no frame is available.
IllegalStateException - if instance is not initialized
String getRequiredExtensionsShaderStub()
throws IllegalStateException
#extension GL_OES_EGL_image_external : enable
IllegalStateException - if instance is not initialized
String getTextureSampler2DType()
throws IllegalStateException
sampler2D or samplerExternalOES
depending on getLastTexture().getTexture().getTarget().
IllegalStateException - if instance is not initialized
String 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()
|
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | ||||||||