OpenGLEL画一个四边形

//rect_vertex.glsl
attribute vec4 vPosition;
attribute vec4 aColor;
varying vec4 vColor;
void main(){
    gl_Position = vPosition;
    vColor = aColor;
}
//rect_fragment.glsl
precision mediump float;
varying vec4 vColor;
void main(){
    gl_FragColor = vColor;
}
//工具类
public class Utils {
    public static int createShader(int shaderType,String shaderSourse){
        //通过类型创建shader
        int shader = GLES20.glCreateShader(shaderType);
        //指定shader的源文件(glsl语言)
        GLES20.glShaderSource(shader,shaderSourse);
        //编译shader
        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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值