
attribute vec4 vPosition;
attribute vec2 vCoord;
varying vec2 aCoord;
void main(){
gl_Position = vPosition;
aCoord = vCoord;
}
precision mediump float;
varying vec2 aCoord;
uniform sampler2D vPicture;
void main(){
gl_FragColor = texture2D(vPicture,aCoord);
}
public class PicRender implements RenderInterface {
private Context context;
private FloatBuffer vertexBuffer;
private FloatBuffer coorBuffer;
private int mProgram;
private int vPositionHandle;
private int vCoordHandle;
private int picHandle;
private int[] picHandleArray;
private int width;
private int height;
public PicRender(Context con){
context = con;
vertexBuffer = ByteBuffer.allocateDirect(verTexArray.length*4).order(ByteOrder.nativeOrder()).asFloatBuffer();
vertexBuffer.put(verTexArray);
vertexBuffer.position(0);
coorBuffer = ByteBuffer.allocateDirect(picCoorArray.length*4).order(ByteOrder.nativeOrder()).asFloatBuffer();
coorBuffer.put(picCoorArray);
coorBuffer.position(0);
}
private float[] verTexArray = new float[]{
-1.0f,1.0f,0.0f,
-1.0f,-1.0f,0.0f,
1.0f,1.0f,0.0f,
1.0f,-1.0f,0.0f
};
private float[] picCoorArray = new float[]{
0.0f,0.0f,
0.0f,1.0f,
1.0f,0.0f,
1.0f,1.0f
};
@Override
public void onCreate(Context context) {
mProgram = GLES20.glCreateProgram();
int vertexShader = Utils.createShader(GLES20.GL_VERTEX_SHADER,Utils.getRawShader(context,R.raw.pic_vertex));
int fragmentShader = Utils.createShader(GLES20.GL_FRAGMENT_SHADER,Utils.getRawShader(context,R.raw.pic_fragment));
GLES20.glAttachShader(mProgram,vertexShader);
GLES20.glAttachShader(mProgram,fragmentShader);
GLES20.glLinkProgram(mProgram);
vPositionHandle = GLES20.glGetAttribLocation(mProgram,"vPosition");
vCoordHandle = GLES20.glGetAttribLocation(mProgram,"vCoord");
picHandle = GLES20.glGetUniformLocation(mProgram,"vPicture");
Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),R.drawable.a2);
picHandleArray = new int[1];
GLES20.glGenTextures(1,picHandleArray,0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,picHandleArray[0]);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_MAG_FILTER,GLES20.GL_LINEAR);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_MIN_FILTER,GLES20.GL_LINEAR);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_WRAP_S,GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_WRAP_T,GLES20.GL_CLAMP_TO_EDGE);
ByteBuffer buffer = ByteBuffer.allocate(bitmap.getWidth()*bitmap.getHeight()*4);
bitmap.copyPixelsToBuffer(buffer);
buffer.position(0);
GLES20.glTexImage2D(
GLES20.GL_TEXTURE_2D,
0,
GLES20.GL_RGBA,
bitmap.getWidth(),
bitmap.getHeight(),
0,
GLES20.GL_RGBA,
GLES20.GL_UNSIGNED_BYTE,
buffer
);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,0);
bitmap.recycle();
}
@Override
public void onSizeChange(int width, int height) {
this.width = width;
this.height = height;
}
@Override
public void onDrawFrame() {
GLES20.glUseProgram(mProgram);
GLES20.glEnableVertexAttribArray(vPositionHandle);
GLES20.glVertexAttribPointer(vPositionHandle,3,GLES20.GL_FLOAT,false,3*4,vertexBuffer);
GLES20.glEnableVertexAttribArray(vCoordHandle);
GLES20.glVertexAttribPointer(vCoordHandle,2,GLES20.GL_FLOAT,false,2*4,coorBuffer);
GLES20.glEnable(picHandle);
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,picHandleArray[0]);
GLES20.glUniform1i(picHandle,0);
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP,0,4);
GLES20.glDisable(picHandle);
GLES20.glDisableVertexAttribArray(vCoordHandle);
GLES20.glDisableVertexAttribArray(vPositionHandle);
}
}
public class MyGLView extends GLSurfaceView implements GLSurfaceView.Renderer {
private Context context;
private PicRender picRender;
public MyGLView(Context context) {
this(context,null);
}
public MyGLView(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
setEGLContextClientVersion(2);
setRenderer(this);
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
picRender = new PicRender(context);
}
@Override
public void onSurfaceCreated(GL10 gl10, EGLConfig eglConfig) {
picRender.onCreate(context);
}
@Override
public void onSurfaceChanged(GL10 gl10, int i, int i1) {
GLES20.glViewport(0,0,i,i1);
picRender.onSizeChange(i,i1);
}
@Override
public void onDrawFrame(GL10 gl10) {
GLES20.glClearColor(0.0f,0.0f,0.0f,1.0f);
GLES20.glClear(GLES20.GL_DEPTH_BITS|GLES20.GL_COLOR_BUFFER_BIT);
picRender.onDrawFrame();
}
}