赞
踩
有两种着色器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)
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个顶点四边形
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。