请选择 进入手机版 | 继续访问电脑版

开源计算机图形学社区(Open Source Computer Graphics Community) |OpenGPU Forum (2007-2013)| OpenGPU Project

 找回密码
 注册
搜索
查看: 888|回复: 2

请教CPU,OpenGL,GPU之间的协作关系 [复制链接]

Rank: 5Rank: 5

注册时间
2011-3-17
积分
92
发表于 2017-9-22 14:29:35 |显示全部楼层
对应用程序端来说,主要在cpu阶段执行OpenGL函数,这些具体的OpenGL操作都发生了什么?
比如glDraw系列函数,是立即告知gpu去执行相关绘制操作,还是缓存在某个地方,等到glFlush的时候才去执行?
比如绑定纹理,glBindTexture和glActiveTeture又发生了什么?
FBO帧缓存在哪里?
顶点缓存VBO又在哪里?
glBlendFunc这样的设置gl状态又发生了什么?
希望有大神来解释一下,或者提供资料查阅

Rank: 28Rank: 28Rank: 28Rank: 28Rank: 28Rank: 28Rank: 28

注册时间
2007-6-11
积分
29826
发表于 2017-9-22 15:20:20 |显示全部楼层
不要想象为每一个GL API调用之后就立刻执行,最后其实就是一个命令给驱动暂存起来,如果是glFlush,或者是之后一股脑的都执行。glDraw这些API是不会立刻执行的。立刻模式的API是原始的glBegin/glVertex/glEnd那些,但是其实这些也不会立刻执行,而是驱动那边运行期构造,效率很低。

至于glActiveTexture/glBindTexture,这个其实是来自于GL自己的API设计,也就是告诉GL Context,我将要操作第N个纹理单元了。可以理解为C模式的面向对象,全部由Handle+Method来实现。

FBO其实只是一组状态,以前没有FBO的时候,绘制都假设在一组全局独立的缓冲,比如Color、Depth等。显然有了FBO,这个地方相当于可编程化,允许用户挂一组RT,这样绘制命令的结果都作用在用户的RT上。

VBO其实就是一组缓冲,不过这个缓冲由驱动管理,这个缓存执行的时候直接给硬件读写操作。因为毕竟内存访问这个地方,CPU内存,到GPU内存,还是得多绕一层的。

这些都是标准定义,具体的实现来自于各个厂家的实现,GL只是一组上层API,不管底层,但是思路大同小异。

具体的看GL Specification。

https://www.khronos.org/registry ... l/glspec45.core.pdf

如果不具备英文能力先学英语。

使用道具 举报

Rank: 5Rank: 5

注册时间
2011-3-17
积分
92
发表于 2017-9-22 15:43:47 |显示全部楼层
Jedimaster 发表于 2017-9-22 15:20
不要想象为每一个GL API调用之后就立刻执行,最后其实就是一个命令给驱动暂存起来,如果是glFlush,或者是 ...


先表示感谢,我再去看。

使用道具 举报

最近看过此主题的会员

您需要登录后才可以回帖 登录 | 注册

‹‹
我的工具栏

关于我们|手机版|Archiver|开源计算机图形学社区(Open Source Computer Graphics Community) | OpenGPU Project | OpenGPU Forum (2007-2013)

GMT+8, 2017-10-23 23:17 , Processed in 0.053431 second(s), 11 queries .

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部