- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个应用程序需要执行以下操作:
rootContext = CGLGetCurrentContext();
CGLPixelFormatObj pf = CGLGetPixelFormat(rootContext);
CGLCreateContext(pf, rootContext, &childContext);
CGLSetCurrentContext(childContext);
glGenTextures(1, &childTexture);
glBindTexture(GL_TEXTURE_2D, childTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image.width(), image.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glGenFramebuffers(1, &childFramebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, childFramebuffer);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, childTexture, 0);
childContext
当前并呈现给它:
CGLSetCurrentContext(childContext);
glBindFramebuffer(GL_FRAMEBUFFER, childFramebuffer);
glUseProgram(childProgram);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, inputTexture);
glUniform1i(childTextureUniform, 0);
glBindBuffer(GL_ARRAY_BUFFER, childQuadPositionBuffer);
glVertexAttribPointer(childPositionAttribute, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*2, (void*)0);
glEnableVertexAttribArray(childPositionAttribute);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, childQuadElementBuffer);
glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, (void*)0);
glDisableVertexAttribArray(childPositionAttribute);
glUseProgram(0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
rootContext
当前并将 FBO 的纹理渲染到屏幕:
CGLSetCurrentContext(rootContext);
glUseProgram(rootProgram);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, childTexture); // This texture was created and populated on childContext.
glUniform1i(rootTextureUniform, 0);
glBindBuffer(GL_ARRAY_BUFFER, rootQuadPositionBuffer);
glVertexAttribPointer(rootPositionAttribute, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*2, (void*)0);
glEnableVertexAttribArray(rootPositionAttribute);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, rootQuadElementBuffer);
glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, (void*)0);
glDisableVertexAttribArray(rootPositionAttribute);
glUseProgram(0);
CGLSetCurrentContext(childContext);
来电 .
childTexture
:
CGLError
s 创建共享上下文时——没有错误;它已成功创建。 glGetError()
— 没有错误。 glCheckFramebufferStatus()
— 它是 GL_FRAMEBUFFER_COMPLETE
. glBindTexture(GL_TEXTURE_2D, 0);
在每个 glDisableVertexAttribArray()
之后正如@datenwolf 所建议的那样打电话。不用找了。 最佳答案
帧缓冲区对象 (FBO) 不能在上下文之间共享。 Only data carrying objects (textures, buffer objects, etc) are shared .抽象对象,即仅绑定(bind)其他对象并管理状态的对象(帧缓冲区对象,顶点数组对象)不是。
因此绑定(bind)您在其他上下文中创建的 FBO 不起作用。但是您可以在辅助上下文中创建一个 FBO,并将主要上下文中的纹理对象绑定(bind)为颜色附件就好了。
更新
如果 FBO 目标纹理在主要上下文中绑定(bind)为纹理源,则可能会出现另一个问题,同时它也应该用作渲染目标。实际上,对于 OpenGL 规范对这种情况的说法,我并不确定^1(我可能不得不深入研究规范,大概是我们的一半左右),但我猜驱动程序可能会认为这是一种情况,即FBO 不能以纹理为目标。所以我建议你使用互斥锁或信号量来同步主线程中纹理的绑定(bind)/解除绑定(bind)与辅助线程中FBO的绑定(bind)。
1 :编辑OpenGL规范说,可以在光栅化操作中获取片段的纹理层不能同时用作FBO渲染目标;但是他们自己的 OpenGL 规范的措辞并没有明确考虑共享上下文。但我很确定,受共享上下文的约束并有可能随时获取资源,满足了这个约束。在我自己的项目中,如果我在这种情况下实现这样的东西,我会自动实现双缓冲或三缓冲方案,并渲染到缓冲区 (n+1)%M
从缓冲区获取数据时 n%M
.
关于macos - 如何在共享上下文中渲染到 FBO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16782279/
我有以下 OpenGL 设置来解决帧缓冲区问题: 我将立方体渲染到帧缓冲区中。 我使用此帧缓冲区中的目标纹理绘制带纹理的四边形,它在我的视口(viewport)中显示立方体。 当流程的两个阶段都在同一
我一直在研究乒乓球着色,并认为在我上一个问题之后我已经破解了它。但是,随着对着色器的进一步了解,看起来虽然我能够在 FBO A 和 FBO B 上运行着色器,但 A 的输出并未用作 B 的源。换句话说
平台是iPhone OpenGL ES 2.0 框架已经创建了一个带有渲染缓冲区的主fbo,因为它是颜色附件。 我有自己的 fbo ,其中 texture2D 作为颜色附件。我想将主 fbo 的内容复
我有一个应用程序需要执行以下操作: 将纹理从磁盘加载到 GL 纹理 在其上运行图像过滤器(通过 FBO 将其渲染到另一个纹理上) 在屏幕上显示生成的纹理 我有那么多工作。 接下来,我希望能够将第 2
我正在尝试创建一个 FBO 来绘制 3D 场景,并创建另一个 FBO 来绘制 HUD。然后,我尝试通过将 3D 场景 block 传输到默认 FBO,然后将 HUD block 传输到默认 FBO,来
除了默认的帧缓冲区之外,在什么情况下我希望在 OpenGL FBO 中添加渲染缓冲区附件而不是纹理附件?因为,纹理附件似乎更加通用。 最佳答案 纹理为您提供更多功能(采样!、格式多样性),因此更有可能
我正在考虑重构我的渲染代码的很大一部分,然后我想到了一个问题:是否可以使用帧缓冲区对象中的多个颜色附件渲染到屏幕和纹理?尽管它有许多有用的应用程序,但我找不到任何信息是否可能。我想将我的纹理作为颜色a
我尝试在 OpenGL 中使用 FBO 的模板缓冲区,但无法正常工作。我将深度和模板目标的 depth24_stencil8 纹理绑定(bind)到 FBO。作为一个简单的测试,我尝试了: /* En
到目前为止,在对自定义 FBO 进行深度测试时,我一直在使用渲染缓冲区。现在我需要用深度纹理替换它们(因为我需要在着色器中读取它)。我正在查看不同的来源,如 here并看到 GL_FLOAT 用作数据
我现在正在尝试实现阴影贴图几天,我想我开始看到手头的真正问题:我有一个附加了深度纹理的 FBO,用于阴影贴图的光 channel ,但是其中没有任何内容被渲染。甚至没有硬编码值。 我已经仔细检查了程序
我正在尝试关注 ThinMatrix's water tutorial 。为此,我需要创建一个 FBO 并将其渲染为纹理。 但是正如您所看到的,水是完全黑色的: 我正在使用source code pr
我正在使用 A FBO 捕捉四边形表面上方的反射。前提是将相机移动到水面下然后渲染场景到fbo,然后恢复到原来的观看位置,像这样: WaterFrameBuffer fbos; Water test(
我有一个按以下方式创建的 FBO: glGenRenderbuffers(1, &m_depthStencilBuffer); glBindRenderbuffer(GL_RENDERBUFFER,
我无法使用 glreadpixels 函数从深度纹理读取正确的深度值。 FBO 状态完成。其他渲染目标在传输到另一个 FBO 后看起来也很好。 代码片段: // Create the FBO
我正在尝试将多采样场景渲染为纹理,这是我正在使用的代码。我得到一个黑屏。我在 init 结束时检查了 fbo 的完整性,他们报告两个 fbo 都是完整的。 void init_rendered_FBO
我读到在分层渲染中,我们创建了一个 2D 纹理数组(GL_TEXTURE_2D_ARRAY): glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTU
我在网上看到了很多示例(for example),它们执行以下操作 创建和绑定(bind) FBO 创建和绑定(bind)缓冲区 (纹理、渲染、深度、模板) 然后,解除绑定(bind)缓冲区 要使用
我想使用片段着色器输出到 FBO,然后将其纹理附件绘制到默认帧缓冲区。最终,我希望能够输出到一个 FBO,然后使用另一个着色器将其传递给另一个 FBO,依此类推。但我认为让它在默认帧缓冲区上工作是一个
在我的渲染器中,我在多重采样的 FBO 上生成抗锯齿场景,该场景被位 block 传输到颜色附件为纹理的 FBO。然后在渲染到帧缓冲区期间读取纹理。 我想更新它,以便获得 Gamma 正确的结果。使用
我想将图像处理 OpenGL 着色器程序的输出保存到图像文件中,并在屏幕上显示结果。我知道如何使用 glReadPixels() 保存窗口帧缓冲区。然而,屏幕的分辨率小于图像的尺寸。 如果我渲染到 F
我是一名优秀的程序员,十分优秀!