attribute vec4 vPosition;
attribute vec4 aColor;
varying vec4 vColor;
void main(){
gl_Position = vPosition;
vColor = aColor;
}
precision mediump float;
varying vec4 vColor;
void main(){
gl_FragColor = vColor;
}
public class Utils {
public static int createShader(int shaderType,String shaderSourse){
int shader = GLES20.glCreateShader(shaderType);
GLES20.glShaderSource(shader,shaderSourse);
GLES20.glCompileShader(shader);
return shader;
}
public static String getRawShader(Context context, int resourseId){
InputStream inputStream = context.getResources().openRawResource(resourseId);
InputStreamReader bufferedInputStream = new InputStreamReader(inputStream);
BufferedReader reader = new BufferedReader(bufferedInputStream);
StringBuilder stringBuilder = new StringBuilder();
String string = null;
try {
while((string = reader.readLine())!= null){
stringBuilder.append(string);
stringBuilder.append("\n");
}
if(reader !=null){
reader.close();
}
if(bufferedInputStream != null){
bufferedInputStream.close();
}
if(inputStream!=null){
inputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
return stringBuilder.toString();
}
}
public interface RenderInterface {
public void onCreate(Context context);
public void onSizeChange(int width,int height);
public void onDrawFrame();
}
public class RectRender implements RenderInterface {
private Context context;
private FloatBuffer vertexBuffer;
private FloatBuffer fragmentBuffer;
private int vPositionHandle;
private int vColorHandle;
private int program;
private int width;
private int height;
private float[] vertexArray = new float[]{
-0.5f,0.5f,0.0f,
-0.5f,-0.5f,0.0f,
0.5f,0.5f,0.0f,
0.5f-0.5f,0.0f
};
private float[] colorArray = new float[]{
0.0f,1.0f,0.0f,1.0f,
1.0f,0.0f,0.0f,1.0f,
0.0f,0.0f,0.0f,1.0f,
0.0f,0.0f,1.0f,1.0f,
};
public RectRender(Context context) {
this.context = context;
vertexBuffer = ByteBuffer.allocateDirect(vertexArray.length*4).order(ByteOrder.nativeOrder()).asFloatBuffer();
vertexBuffer.put(vertexArray);
vertexBuffer.position(0);
fragmentBuffer = ByteBuffer.allocateDirect(colorArray.length*4).order(ByteOrder.nativeOrder()).asFloatBuffer();
fragmentBuffer.put(colorArray);
fragmentBuffer.position(0);
}
@Override
public void onCreate(Context context) {
program = GLES20.glCreateProgram();
int vertexShader = Utils.createShader(GLES20.GL_VERTEX_SHADER,Utils.getRawShader(context,R.raw.rect_vertex));
int fragmentShader = Utils.createShader(GLES20.GL_FRAGMENT_SHADER,Utils.getRawShader(context,R.raw.rect_fragment));
GLES20.glAttachShader(program,vertexShader);
GLES20.glAttachShader(program,fragmentShader);
GLES20.glLinkProgram(program);
vPositionHandle = GLES20.glGetAttribLocation(program,"vPosition");
vColorHandle = GLES20.glGetAttribLocation(program,"aColor");
}
@Override
public void onSizeChange(int width, int height) {
this.width = width;
this.height = height;
}
@Override
public void onDrawFrame() {
GLES20.glUseProgram(program);
GLES20.glEnableVertexAttribArray(vPositionHandle);
GLES20.glVertexAttribPointer(vPositionHandle,3,GLES20.GL_FLOAT,false,3*4,vertexBuffer);
GLES20.glEnableVertexAttribArray(vColorHandle);
GLES20.glVertexAttribPointer(vColorHandle,4,GLES20.GL_FLOAT,false,4*4,fragmentBuffer);
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP,0,4);
GLES20.glDisableVertexAttribArray(vPositionHandle);
GLES20.glDisableVertexAttribArray(vColorHandle);
}
}