opengl es shader 二

一.Shader程序创建过程

 

1.创建程序

GLES20.glCreateProgram();

2.编译shader

       //根据type创建顶点着色器或者片元着色器,返回一个容器的句柄
        int shader = GLES20.glCreateShader(type);
        //将资源加入到着色器句柄所关联的内存中,并编译
        GLES20.glShaderSource(shader, shaderCode);
        GLES20.glCompileShader(shader);
        //验证Shader是否编译通过 intBuffer 返回1时编译成功,返回0编译失败
//        IntBuffer intBuffer = null;
//        GLES20.glGetShaderiv(shader,GLES20.GL_COMPILE_STATUS,intBuffer);

3将编译的shader添加到创建的程序中

GLES20.glAttachShader

4链接程序

GLES20.glLinkProgram
public class MyRenderer extends BaseRenderer implements GLSurfaceView.Renderer {
    private int mProgram;
    private FloatBuffer floatBuffer;
    private int mPositionHandle;


    //vertex shader
    private final String vertexShaderCode =
            "attribute vec4 vPosition;" +
                    "void main() {" +
                    "  gl_Position = vPosition;" +
                    "}";
    //slice shader
    private final String fragmentShaderCode =
            "precision mediump float;" +
                    "uniform vec4 vColor;" +
                    "void main() {" +
                    "  gl_FragColor = vColor;" +
                    "}";

    float color[] = { 1.0f, 0f, 0f, 1.0f };

    static float triangleCoords[] = {
            0.5f,  0.5f, 0.0f, // top
            -0.5f, -0.5f, 0.0f, // bottom left
            0.5f, -0.5f, 0.0f  // bottom right
    };
    static final int COORDS_PER_VERTEX = 3;

    private int mColorHandle;

    //顶点个数
    private final int vertexCount = triangleCoords.length / COORDS_PER_VERTEX;
    //顶点之间的偏移量
    private final int vertexStride = COORDS_PER_VERTEX * 4; // 每个顶点四个字节
    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        //Set the background frame color

        GLES20.glClearColor(0.5f,0.5f,0.5f,1.0f);
//        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
        // creat a glse program
        mProgram = GLES20.glCreateProgram();
        ByteBuffer buffer = ByteBuffer.allocateDirect(triangleCoords.length*4);
        buffer.order(ByteOrder.nativeOrder());
        floatBuffer = buffer.asFloatBuffer();
        floatBuffer.put(triangleCoords);
        floatBuffer.position(0);
        int vertexShader =loadShader(GLES20.GL_VERTEX_SHADER,vertexShaderCode);
        int fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER,fragmentShaderCode);;
        // add vertexshader to glse-program
        GLES20.glAttachShader(mProgram,vertexShader);
        //add fragmentShader to glse-program
        GLES20.glAttachShader(mProgram,fragmentShader);
        //link glse-program as vertexShader link fragmentShader
        GLES20.glLinkProgram(mProgram);
        String statu = GLES20.glGetProgramInfoLog(mProgram);
        Log.d("MyRenderer:+statu",statu);
    }

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        //set window size or screen changes callback
        GLES20.glViewport(0,0,width,height);

    }

    @Override
    public void onDrawFrame(GL10 gl) {
        //redraw background color
//        GLES20.glClearColor(0.0f,0f,0.5f,1.0f);
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);

        //add program toGLSE2.0
        GLES20.glUseProgram(mProgram);

        mPositionHandle = GLES20.glGetAttribLocation(mProgram,"vPosition");
        GLES20.glEnableVertexAttribArray(mPositionHandle);
        GLES20.glVertexAttribPointer(mPositionHandle,COORDS_PER_VERTEX, GLES20.GL_FLOAT,false,vertexStride,
                floatBuffer);
        mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor");
        //设置绘制三角形的颜色
        GLES20.glUniform4fv(mColorHandle, 1, color, 0);
        //绘制三角形
        GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, vertexCount);
        //禁止顶点数组的句柄
//        GLES20.glDisableVertexAttribArray(mPositionHandle);
    }
    public int loadShader(int type, String shaderCode){
        //根据type创建顶点着色器或者片元着色器,返回一个容器的句柄
        int shader = GLES20.glCreateShader(type);
        //将资源加入到着色器句柄所关联的内存中,并编译
        GLES20.glShaderSource(shader, shaderCode);
        GLES20.glCompileShader(shader);
        //验证Shader是否编译通过 intBuffer 返回1时编译成功,返回0编译失败
//        IntBuffer intBuffer = null;
//        GLES20.glGetShaderiv(shader,GLES20.GL_COMPILE_STATUS,intBuffer);
        return shader;
    }
}

二.纹理操作

1.创建纹理

   glGenTextures ( GLsizei n, GLuint *textures )

       n  指定要生成的纹理ID的数量。,textures为指定存储生成的纹理ID的数组。

2.绑定纹理

    glBindTexture(GL_TEXTURE_2D,texid)

        texid  从储存的纹理ID的数组中得到

3.设置纹理的参数

(1)magnification放大

glTexParameteri(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_MAG_FILTER,GLES20.GL_LINEAR);

(2)minification缩小

glTexParameteri(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_MIN_FILTER,GLES20.GL_LINEAR);

(3)s轴映射

  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);

  (4)t轴映射

  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值