OpenGL渲染视频步骤--面试用

本文介绍了如何创建和使用显卡可执行程序,涉及GLSL语言的顶点和片元着色器,以及OpenGL中的上下文环境搭建。通过EGL在不同平台实现上下文,接着详细阐述了纹理渲染的步骤,包括设置窗口大小、使用着色器、定义物体和纹理坐标、传递纹理对象并调整纹理属性,最后进行绘制操作。
摘要由CSDN通过智能技术生成

一 创建一个显卡可执行程序

有两种着色器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个顶点四边形

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值