Opengl 一些问题解答
为什么opengl 不能跨线程
大家有没有想过这个问题,网上给出的答案其实看得不太明白,接下来我们看源码让你知道
C |
通过上边源码可以看到, 它是把context 放入到thread local中去,这就是不能夸线程根本原因,在做opengl 一些操作的时候,首先去线程中取context, 如果夸了线程取的context就不是之前使用的context导致了crash,这个希望大家要明确知道
纹理是什么
C++ |
glGenTextures(GLsizei n, GLuint* textures)
这个textures返回的 是int值,具体是什么?
要想知道这个答案要看下opengles的源码:
C |
通过上边源码也可以看出来, 首先创建纹理的时候会从当前线程的threadlocal取出context,再从context取出来mResourceManager,在从mResourcManager取出一个空隙的ID,也就说这个gentexutre只是拿到一个id,其他什么都没干
纹理绑定到底干了些啥
C |
也就是说从上边可以看的出来纹理绑定是了创建2D的纹理对象,指定了当前 mState.samplerTexture[TEXTURE_2D][mState.activeSampler]活动的纹理对象,这个时候还没有分配真正的分配显存
glActiveTexutre到底干了啥
glTexImage2D 并没有参数是纹理ID,那它是怎么知道上传到哪个纹理的
也就是说这两个问题很类似,这一点我之前也很困惑,只有源码才能解决我们的困惑
C |
从上边可以看出来activetexutre是设置当前活动的activeSampler,然后纹理绑定的时候会使用这个信息,在上传纹理,或者其他使用纹理的时候,就去mStat去取对应的纹理
纹理是如何分配显存的
想必大家都困惑 显存是在什么时候分配的,我们c,c++分配一般会调用new,malloc,但是opengl从头到尾接口也没有看到,gl什么alloc,gl什么new之类的函数,这个我从学习opengl以来,十分困惑,接下来我就重点讲述下纹理是如何分配显存的
可能你会觉得glTexImage2D(......, nullptr);最后这个nullptr是告诉opengl 要分配显存,到底是不是呢,接下来我们就重点分析这个glTexImage2D
C |
从上边分析可以看出来,首先它会从当前绑定的纹理上找到要上传的纹理,当真正只有裸数传进来的,才会创建显存
FBO是什么
C++ |
相信这张图很多人都看到过,接下来我们就着重分析帧缓冲区到底是什么东西
glGenFramebuffers 做了什么
C |
跟纹理类似,帧缓冲区创建也仅仅是分配了id而已
glBindFramebuffer 干了什么
C |
也就是说glBindFramebuffer 填充了mState.readFramebuffer = mState.drawFramebuffer 这个read跟draw在后边绘制的时候还是会用的上的
glFramebufferTexture2D 跟纹理是什么关系
C++ |
也就是说glFramebufferTexture2D 是纹理的显存单元附加到framebuffer颜色附件上去了,当然纹理也可以作为深度或者模板附件,添加framebuffer
什么只有绑定了FBO纹理的才能下载
大家肯定或多或少的都碰到过android 硬件解码出来的纹理,直接glreadpixel 读出来是一张黑图,当我们调用了copy texture接口后,读下来的纹理就是正常的,我们就看下源码中是这怎么做到的
C |
也就说glreadpixel 是 通过getReadFramebuffer 来获取的FBO,从FBO中绑定的rendertarget,最终去取像素值,所以 如果你想读取的纹理没有绑定fbo,是读取不出来的,原因就是它压根不是直接读取纹理的
FBO 跟 屏幕的关系
glDrawArrays 干了啥
大家有没有想过为什么纹理绑定在fbo上,就是离屏渲染,没有绑定就是渲染到屏幕呢,这一点也困惑我很久,因为调用glDrawArrays 并没有指定绘制在哪里,很奇怪,所以接下来我们就要探究下,底层是怎么做的
首先要分析下glDrawArrays 的源码
C++ |
通过上边代码分析,我们可以明确的得出结论,就是无论画屏幕,还是画纹理,本质都是对其绑定surface 做处理,也就是说FBO id是0号,就是画屏幕,非0号,就是绑定了其他的纹理或者renderbuffer。总而言之,大家应该清晰的明白这到底是怎么回事
为什么FBO 不能共享context
为什么纹理可以共享context
有哪些资源可以共享context呢
C++ |
共享context后可以同时创建纹理吗
Sourcecode:
https://github.com/adobe/angle