1
charten 2020-02-28 15:40:54 +08:00
WebGL 属于 OpenGL ES 2 的子集,而 OpenGL ES 又是 OpenGL 的子集,那么四舍五入我也算是学过 OpenGL (的皮毛)了。
|
2
glumess 2020-02-28 15:44:35 +08:00
学习 OpenGL 可以关注一下我的公众号:音视频开发进阶,或者博客 https://glumes.com 当时学的时候写了不少博客,一起交流学习一下。
OpenGL 是 Khronos Group 组织开发维护的一个接口规范,具体的实现是由驱动厂商完成。 着色器语言按区分应该编译型语言,最终编译成二进制的。 GPU 那块的切换机制就不太懂了.... |
3
charten 2020-02-28 15:46:12 +08:00
我能回答的只能是 2 了,shader 着色器语言属于编译型语言,根据不同显卡的指令集,编译成对应的可执行二进制码,在 GPU 上执行。编译是在 CPU 上编译,执行是在 GPU 执行。
|
4
crackhopper 2020-02-28 15:52:18 +08:00
了解的不多。尽量答一下
1. OpenGL 的调用像是在驱动层,但并不是给操作系统设计的,是给应用程序设计的规范。应用程序接入 OpenGL 会直接操作显卡,不走操作系统驱动。当然创建设备上下文的时候系统应该会有一定的工作。 2. 着色器语言是编译型语言,一般会由 GPU 厂商提供编译器,链接的时候会和 CPU 的编译器的产出链接到一起。着色器程序直接跑在 GPU 上。 3. 显卡是用文件标识的。多核心和显存,我不确定,我觉得是 OpenGL 还有 CUDA 这种 SDK 帮忙助理的。GPU 多核心一般很多,上千个,而且一般不会细粒度操作(就是一般不会对指定某个核心做某个事情,都是多核心协同运作)。显存本身是 GPU 的一部分,单独作为一个文件设备来映射还是挺诡异的。 4. 显卡不对进程管理。虽然显卡会标注不同进程用了多少资源。但显卡更像是一个接收到命令,然后执行的一个东西。当进程切换的时候,如果进程窗口还在,那么对应的渲染还会执行;只不过上层窗口后渲染,覆盖了之前的区域。如果窗口最小化了,那么操作系统应该会有优化对设备上下文进行管理,实际不发生渲染。 里面部分有我的猜测,如果不正确欢迎指正。 |
5
misaka19000 2020-02-28 15:52:30 +08:00
据我了解 OpenGL 只是一种规范,类似于 HTML
|
6
23571113 2020-02-28 15:54:52 +08:00
1. 如果你不是写驱动的或写系统的, 你能调用的 API 基本都是在应用层.
2. 编译, 因为是跑在显卡上的, 而显卡不是通用计算设备(CPU), 没法给你解释. 3. CPU 对于周边设备控制大部分都是靠写内存, GPU 也不例外. 4. 实际上显卡渲染的是显存的数据, 而显存的数据在内存也有一份相同的, 显卡定时到内存对应地址拿数据更新, 因此 CPU 上下文切换和显卡没什么关系. 如果没有优化基本就是 while 循环遍历每个对象渲染. |
7
crackhopper 2020-02-28 16:01:36 +08:00
@23571113 我感觉自己也明白了很多,感谢~
有个问题:比如用 shader 渲染的结果应该是保存在显存中。但你说显卡定期去内存同步。那会不会内存的结果覆盖显存的结果呢?我猜测是有个机制,部分覆盖,部分不覆盖。 |
8
across 2020-02-28 16:03:31 +08:00
1. 记得这个术语叫硬件抽象层吧,OpenGL 内部实现了对硬件的支持,所以应用层可统一调用(所以叫驱动似乎也没啥问题···)
2. 编译。你写过 GLSL 就知道,还有语句是加载代码并进行编译的,OpenGL 代码自然运行在 GPU 上,和硬件紧密相关。 3. linux 不知道 4. OpenGL 自己也是有上下文的,就是 OpenGL Context,内部状态机。 OpenGL 教材就经典的那两本: OpenGL 编程指南 OpenGL 超级宝典 红蓝宝书···· 外加 OpenGL-ES 有一本 OpenGL ES 3.0 编程指南。 看网络教程也行,不过初次上手挺难消化的,反复看书好点。 |
9
23571113 2020-02-28 16:07:52 +08:00
@crackhopper 就是要覆盖, 要不你游戏中的小人怎么动呢? CPU 负责游戏逻辑(比如改变小人的这个对象的坐标, 然后显存也会延迟更新) , GPU 只是单纯负责让你在屏幕上看到的效果罢了.
|
10
across 2020-02-28 16:21:39 +08:00
|
11
gggxxxx 2020-02-28 16:37:29 +08:00
1. 应用层
2. 编译型,gpu 执行 3. 这种思路去看待 opengl 是错误的,你把 opengl 当作一个可以操作 gpu 的 sdk 就行了,任何操作一切按照 opengl 的规范来就是 4. 操作系统提供 |
12
TSai2019 2020-02-29 13:23:09 +08:00 via Android
微软推出 dx,苹果推出 metal
是不是证明了 gl 并不靠近底层,且效率不高 |
13
crackhopper 2020-03-02 09:58:24 +08:00
@23571113 小人动画啥的,有的是在 CPU 上算的,存内存,按照您说的应该是 ok 的;有的则是把矩阵传递给 GPU 在 GPU 上进行变换的,变换结果应该直接存放在显存里,如果后面再去 CPU 同步那么结果就被覆盖了?比如 fragment shader 这种的。
|