一 创建一个显卡可执行程序
有两种着色器Shader:顶点着色器、片元着色器。用的是GLSL语言,运行在显卡上的语言。
创建着色器,编译着色器。CreateShader、CompileShader。
创建程序,附加着色器,连接程序,使用程序。
CreateProgram、AttachShader、LinkProgram、UseProgram。
图是电子书里面的。
(区别?)
二 上下文环境搭建
Window、Linux、Android的上下文环境搭建,都是使用EGL。
获得一个display,配置,创建context,创建surface。
gEglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
ret = eglChooseConfig(gEglDisplay, attribs, configs, num_configs,&numConfigs);
//参3是共享OpenGL资源,为了效率会多线程渲染
mEglContext = eglCreateContext(mEglDisplay, mEglConfig, EGL_NO_CONTEXT, contextAttributes);
//起新线程执行渲染工作,为该线程绑定Surface、Context。
eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, mEglContext)
三 OpenGL纹理渲染
1 规定窗口大小,
2 使用显卡绘制程序,useprogram,
3 设置物体坐标,(向右增长、向上增长、范围是[-1,1]),将当前的顶点属性与顶点缓冲对象(VBO)关联起来。
4 设置OpenGL二维纹理坐标,(向右增长、向上增长、范围是[0,1])
5 将纹理对象传递给片元着色器。
6 设置纹理属性,绘制。
//后面标的数字是步骤
glViewport(0, 0, 窗口宽, 窗口高); //1
glUseProgram(mProgram); //2
//获取位置、纹理、矩阵计算的句柄
mPositionHandle = glGetAttribLocation(mProgram, "vPos");
mTextureHandle = glGetAttribLocation(mProgram, "vTexturePos");
mTextureMatrixHandle = glGetUniformLocation(mProgram, "textureMatrix");
glVertexAttribPointer(mPositionHandle, 2, GL_FLOAT, GL_FALSE, 0, 物体坐标); //3
glEnableVertexAttribArray(mPositionHandle);
glVertexAttribPointer(mTexPosHandle, 2, GL_FLOAT, GL_FALSE, 0, 纹理坐标); //4
glEnableVertexAttribArray(mTexPosHandle);
GLfloat texMatrix[16];
surfaceTexture->getTransformMatrix(texMatrix);
glUniformMatrix4fv(mTexMatrixHandle, 1, GL_FALSE, texMatrix);//5
glBindTexture(GL_TEXTURE_EXTERNAL_OES, mTextureId);
//设置纹理属性: 放大、缩小、防止超过纹理坐标(0,1)
glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_LINEAR); //6
glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4); //4个顶点四边形