2022年音视频面试题 C/C++/Linux/FFmpeg/webRTC/rtmp/hls/rtsp/ffplay/srs

news2025/9/18 1:13:21

1)OpenGL 是按照什么架构设计的?

OpenGL 的渲染架构是  Client/Server 模式:Client(客户端)指的是我们在 CPU 上运行的一些代码,比如我们会编写 OC/C++/Java 代码调用 OpenGL 的一些 API;而 Server(服务端)则对应的是图形渲染管线,会调用 GPU 芯片。我们开发的过程就是不断用 Client 通过 OpenGL 提供的通道去向 Server 端传输渲染指令,来间接的操作 GPU 芯片。

2)什么是渲染上下文(Context)?

OpenGL 自身是一个巨大的状态机(State Machine):一系列的变量描述 OpenGL 此刻应当如何运行。OpenGL 的状态通常被称为 OpenGL 上下文(Context)。我们通过改变上下文中的状态来改变接下来绘画的属性和操作的缓冲对象,然后 OpenGL 利用当前的上下文(Context)的状态去渲染。因此状态的改变要非常小心,因为是状态是全局,会影响接下来的所有渲染操作。

3)什么是离屏渲染?

GPU 渲染机制:CPU 计算好显示内容提交到 GPU,GPU 渲染完成后将渲染结果放入帧缓冲区,随后屏幕控制器会按照 VSync 信号逐行读取帧缓冲区的数据,经过可能的数模转换传递给显示器显示。
当前屏幕渲染,指的是 GPU 的渲染操作是在当前用于显示的屏幕缓冲区中进行。
离屏渲染,指的是 GPU 在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作。
特殊的离屏渲染:如果将不在 GPU 的当前屏幕缓冲区中进行的渲染都称为离屏渲染,那么就还有另一种特殊的离屏渲染方式:CPU 渲染。

4)为什么离屏渲染会造成性能损耗?

当使用离屏渲染的时候会很容易造成性能消耗,因为离屏渲染会单独在内存中创建一个屏幕外缓冲区并进行渲染,而屏幕外缓冲区跟当前屏幕缓冲区上下文切换是很耗性能的。
由于垂直同步的机制,如果在一个 VSync 时间内,CPU 或者 GPU 没有完成内容提交,则那一帧就会被丢弃,等待下一次机会再显示,而这时显示屏会保留之前的内容不变。这就是界面卡顿的原因。

5)什么是 OpenGL 渲染管线(Pipeline)?

OpenGL 渲染管线就是 OpenGL 的工作流程,指的是一堆原始图形数据途经一个输送管道,期间经过各种变化处理最终出现在屏幕的过程。
图形渲染管线可以大致被划分为两个主要部分:第一部分把你的 3D 坐标转换为 2D 坐标;第二部分是把 2D 坐标转变为实际的有颜色的像素。

 CSDN站内私信我,或文末免费领取最新最全C++/音视频开发学习提升资料,内容包括(C/C++,Linux 服务器开发,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。

6)OpenGL 渲染管线主要包含哪些部分?

OpenGL 的渲染管线其实也是类似的一个过程,它的工序包括:顶点着色器 → 图元装配 → 几何着色器 → 光栅化 → 片段着色器 → 测试与混合。

OpenGL 渲染管线

7)为什么说 OpenGL 渲染管线中的着色器(Shader)是可编程管线?

OpenGL 渲染管线中着色器允许开发者自己配置,这样我们就可以使用 GLSL(OpenGL Shading Language)来编写自己的着色器替换默认的着色器,从而更细致地控制图形渲染管线中的特定部分。

8)有哪些着色器可以由程序员进行编程?

可编程的着色器有:顶点着色器(Vertex Shader)、几何着色器(Geometry Shader)、片段着色器(Fragment Shader)。常用的是顶点着色器和片段着色器。

9)什么是 VBO、EBO 和 VAO?

可以认为它们是在 OpenGL 中处理数据的三大类缓冲内存对象。
VBO(Vertex Buffer Objects)顶点缓冲区对象,指的是在 GPU 显存里面存储的顶点数据(位置、颜色)。
EBO(Element Buffer Object)图元索引缓冲区对象,指的是为了更高效的利用数据,存储索引来达到减少重复数据的索引数据。
VAO(Vertex Array Object)顶点数组对象,主要作用是用于管理 VBO 或 EBO,减少  glBindBufferglEnableVertexAttribArrayglVertexAttribPointer 这些调用操作,高效地实现在顶点数组配置之间切换。

10)Vertex Buffer Object 的布局格式是怎样的?

当我们的 Vertex Shader 如下:
#version 330 core
layout (location = 0) in vec3 position; // 位置变量的属性位置值为 0
layout (location = 1) in vec3 color; // 颜色变量的属性位置值为 1

out vec3 ourColor; // 向片段着色器输出一个颜色

void main()
{
gl_Position = vec4(position, 1.0);
ourColor = color; // 将ourColor设置为我们从顶点数据那里得到的输入颜色
}

Fragment Shader 如下:
#version 330 core
in vec3 ourColor;
out vec4 color;

void main()
{
color = vec4(ourColor, 1.0f);
}


创建 VBO 的代码如下:
GLfloat vertices[] = {
// 位置 // 颜色
0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f,  // 右下
-0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f,  // 左下
0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f  // 顶部
};

GLuint VBO;
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

这时候对应的 VBO 布局格式如下图所示:

11)Vertex Array Object 的布局格式是怎样的?

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2835.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mybatis学习(1)

使用mybatis也是有一段时间了,但是一直没有系统了解和学习,最近正好有空,索性花点时间熟悉下。 为什么是mybatis? 了解mybatis之前,需要知道什么是"数据库持久层",我的理解,就是将数…

Decoder与Encoder重要组件

Decoder与Encoder重要组件 大家知道,Netty从底层Java通道读到ByteBuf二进制数据,传入Netty通道的流水线,随后开始入站处理。在入站处理过程中,需要将ByteBuf二进制类型,解码成Java POJO对象。这个解码过程&#xff0c…

【Python基础篇020】网络编程初识

文章目录 🦠一、前言 🦠二、软件开发架构 🍀2.1、C/S架构 🍀2.2、B/S架构 🍀2.3、服务端与客户端 🦠三、ip与端口号 🍀3.1、IP地址与端口号常识 🍀3.2、MAC和IP的概念与不同…

实际应用效果不佳?来看看提升深度神经网络泛化能力的核心技术(附代码)

目录 数据增强 📌 技术介绍 📌 手动数据处理&增强 📌 基于 TensorFlow 的数据增强 Dropout 随机失活 📌 技术介绍 📌 基于TensorFlow应用Dropout 💡 L1 和 L2 正则化 📌 技术介绍 …

Mybatis日志框架

文章目录一、 用日志打印代替sout1、sout有什么问题①问题1:I/O影响性能②问题2:无法统一管理③问题3:显得你很low2、使用日志框架的好处①设定级别,统一管理②灵活指定输出位置③自定义日志格式④基于日志分析问题二、最佳用法1、…

设计模式之【单例模式】全解,单例模式实现方式,暴力打破单例模式与解决方案,你真的认识单例模式吗?

文章目录什么是单例模式单例模式的应用场景处理有线程冲突的资源表示全局唯一类单例模式的实现方式1、饿汉式之静态常量2、饿汉式之静态代码块3、懒汉式之线程不安全方式(不推荐)4、懒汉式之加锁方式(不推荐)5、懒汉式之双重锁检查…

波司登的高端化后遗症

(题图) 文|螳螂观察 作者| 青月 受“三重”拉尼娜现象的影响,2022年冬天可能会因为阶段性冷空气的影响出现阶段性低温,且极端寒潮爆发的可能性大。 极端天气越来越多,年年冷冬,有望催化以羽绒服为代表的…

【uni-app从入门到实战】打包

小程序打包发布 1、小程序的打包发布很简单,只需要将程序运行到微信开发者工具中,然后点击右上角的上传按钮即可 我们这里的上传按钮不能点击是因为没有配置微信小程序AppID 打开项目的 manifest.json,选中微信小程序配置,填入微…

Java并发编程——线程间通信

线程间通信一、volatile 关键字二、等待/通知机制三、管道通信四、Thread.join一、volatile 关键字 为什么volatile关键字可以?因为之前说过了,此关键字能保证变量的可见性,也就是说变量一旦被修改,立马能被其他线程所感知 例子如…

拓端tecdat|R语言代做泰坦尼克号随机森林模型案例数据分析

全文链接:http://tecdat.cn/?p4281 原文出处:拓端数据部落公众号 视频:从决策树到随机森林:R语言信用卡违约分析信贷数据实例 从决策树到随机森林:R语言信用卡违约分析信贷数据实例,时长10:11 如果我们对…

Linux:环境变量

基本概念 环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数。 环境变量通常具有某些特殊用途,通常具有全局特性,可以被子进程继承下去 常见的环境变量 PATH : 指定命令的搜索路径 HOME : 指定用户的主工作目录(即用户登陆到Linux系统中…

[Linux]----文件操作(复习C语言+文件描述符)

文章目录前言一、基础概念二、回顾C语言2.1 对文件进行写操作2.2 追加写文件2.3 读文件2.4 简易cat功能总结stdin&stdout&stderr打开文件的方式三、系统文件I/O接口介绍open介绍使用open接口closewriteread四、文件描述符先验证0,1,2就是标准的IO标准输入流标准输出流标…

基于寄生-捕食算法的函数寻优算法

文章目录一、理论基础1、寄生-捕食算法(1)初始化(2)筑巢阶段(鸟窝)(3)寄生阶段(乌鸦-布谷鸟)(4)捕食阶段(乌鸦-猫)2、PPA算法伪代码二、仿真实验与结果分析三、参考文献一、理论基础…

QCC51XX---QACT用户指南

更新记录链接:QCC51XX---系统学习目录_嵌入式学习_force的博客-CSDN博客 QACT安装包不要放在有中文路径下,否则—直会安装报错。适用V7,V7.1 V7.2版本 打开QACT. 打开QACT. 点击 connection configuration 进去之后 点击1,然后点2,选择kalaccess.dll文件, workspace …

【C++】vector的模拟实现不会怎么办?看过来

🌈欢迎来到C专栏~~vector的模拟实现 (꒪ꇴ꒪(꒪ꇴ꒪ )🐣,我是Scort🎓🌍博客主页:张小姐的猫~江湖背景快上车🚘,握好方向盘跟我有一起打天下嘞!送给自己的一句鸡汤🤔&…

MySQL是如何保证主从一致的

一:什么是binlog Binary log(二进制日志),简称Binlog。 Binlog是记录所以数据表结构变更以及表数据修改的二进制日志,不会记录select和show这类操作。Binlog是以事件形式记录,还包括语句所执行的消耗时间。Binlog是MySql Server自…

0082 时间复杂度,冒泡排序

/* * 排序也称排序算法(Sort Algorithm) * 排序是将一组数据,依指定的顺序进行排列的过程。 * * 排序分类 * 1.内部排序:将需要处理的所有数据都加载到内存存储器中进行排序(使用内存) * 插…

Keil MDK的sct分散加载文件详解

sct 分散加载文件简介 MDK 生成一个以工程名命名的后缀为 *.sct 的分散加载文件 (Linker Control File,scatter loading),链接器根据该文件的配置分配各个节区地址,生成分散加载代码,因此我们通过修改该文件可以定制具体节区的存…

Spring源码:Spring源码阅读环境搭建

本篇内容包括:Mac 环境下 gradle 的安装和配置、源码克隆、新建测试类,测试Spring源码 等内容! 第一步:Mac 环境下 gradle 的安装和配置 1、下载安装包 # 到 GitHub 的 Spring 仓库选定 Spring 版本,查看对应版本 Sp…

Linux项目自动化构建工具make/makefile

1.背景 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力一个工程中的源文件不计其数,其按类型,功能,模块分别放在若干目录中,makefile定义了一系列的规则来制定,那些文件需要先编译&a…