Hello I am learning now OpenGL ES and the use of shaders. I have
written a test class that should only paint the application icon into
the screen. So far no luck. Can anyone see what I am doing wrong or
maybe point me to the right direction?
public class GLTester
{
final int FLOAT_SIZE_BYTES = 4;
int glProgramHandle = 0;
int glVertexShaderHandle = 0;
int glFragmentShaderHandle = 0;
int glPositionHandle = 0;
int glTextCoordHandle = 0;
int glTextureHandle = 0;
int frameTextureHandle = 0;
FloatBuffer vertexBuffer = null;
final float squareVertices[] = { -1.0f, -1.0f, 0.0f, 1.0f, -1.0f,
0.0f, -1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f };
FloatBuffer textureBuffer = null;
final float textureVertices[] = { -1.0f, -1.0f, 1.0f, -1.0f, -1.0f,
1.0f, 1.0f, 1.0f };
final String vertexShaderCode = "attribute vec4 a_position;
attribute vec2 a_texcoord; varying vec2 v_texcoord; void main()
{v_texcoord = a_texcoord; gl_Position = a_position;}";
final String fragmentShaderCode = "precision mediump float; varying
vec2 v_texcoord; uniform sampler2D u_texture; void main()
{gl_FragColor = texture2D(u_texture, v_texcoord.st);}";
Bitmap bitmap = null;
void test(final Context context)
{
BitmapFactory.Options options = new BitmapFactory.Options();
options.inScaled = false;
bitmap = BitmapFactory.decodeResource(context.getResources(),
R.drawable.icon, options);
setupGLES();
createProgram();
setupTexture();
draw();
}
void setupGLES()
{
GLES20.glEnable(GLES20.GL_TEXTURE_2D);
GLES20.glEnable(GLES20.GL_CULL_FACE);
GLES20.glCullFace(GLES20.GL_BACK);
GLES20.glDisable(GLES20.GL_DEPTH_TEST);
GLES20.glViewport(0, 0, 400, 800);
GLES20.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
}
void createProgram()
{
glProgramHandle = GLES20.glCreateProgram();
glVertexShaderHandle = setupShader(GLES20.GL_VERTEX_SHADER,
vertexShaderCode);
glFragmentShaderHandle = setupShader(GLES20.GL_FRAGMENT_SHADER,
fragmentShaderCode);
GLES20.glLinkProgram(glProgramHandle);
glPositionHandle = GLES20.glGetAttribLocation(glProgramHandle,
"a_position");
glTextCoordHandle = GLES20.glGetAttribLocation(glProgramHandle,
"a_texcoord");
glTextureHandle = GLES20.glGetUniformLocation(glProgramHandle,
"u_texture");
vertexBuffer = ByteBuffer.allocateDirect(squareVertices.length *
FLOAT_SIZE_BYTES).order(ByteOrder.nativeOrder()).asFloatBuffer();
vertexBuffer.put(squareVertices).position(0);
textureBuffer =
ByteBuffer.allocateDirect(textureVertices.length *
FLOAT_SIZE_BYTES).order(ByteOrder.nativeOrder()).asFloatBuffer();
textureBuffer.put(textureVertices).position(0);
}
int setupShader(final int type, final String code)
{
int shaderHandle = GLES20.glCreateShader(type);
GLES20.glShaderSource(shaderHandle, shaderCode);
GLES20.glCompileShader(shaderHandle);
GLES20.glAttachShader(glProgramHandle, shaderHandle);
return shaderHandle;
}
void setupTexture()
{
int texture[] = new int[1];
GLES20.glGenTextures(1, texture, 0);
frameTextureHandle = texture[0];
texture = null;
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GL10.GL_TEXTURE_2D, frameTextureHandle);
GLES20.glUniform1i(glTextureHandle, 0);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,
GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,
GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST);
}
void draw()
{
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
glUseProgram(glProgramHandle);
vertexBuffer.position(0);
GLES20.glVertexAttribPointer(glPositionHandle, 3,
GLES20.GL_FLOAT,
false, 0, vertexBuffer);
GLES20.glEnableVertexAttribArray(glPositionHandle);
textureBuffer.position(0);
GLES20.glEnableVertexAttribArray(glTextCoordHandle);
GLES20.glVertexAttribPointer(glTextCoordHandle, 2,
GLES20.GL_FLOAT,
false, 0, textureBuffer);
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, frameTextureHandle);
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
GLES20.glUniform1i(glTextureHandle, 0);
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0,
squareVertices.length / 3);
GLES20.glDisableVertexAttribArray(glPositionHandle);
GLES20.glDisableVertexAttribArray(glTextCoordHandle);
GLES20.glDisableVertexAttribArray(glTextureHandle);
}
}
--
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en