void OGLESTexture3DRenderView::OnAttached(FrameBuffer& fb, uint32_t att) { BOOST_ASSERT(att != FrameBuffer::ATT_DepthStencil); index_ = att - FrameBuffer::ATT_Color0; fbo_ = checked_cast<OGLESFrameBuffer*>(&fb)->OGLFbo(); OGLESRenderEngine& re = *checked_cast<OGLESRenderEngine*>(&Context::Instance().RenderFactoryInstance().RenderEngineInstance()); re.BindFramebuffer(fbo_); if (0 == copy_to_tex_) { glFramebufferTexture3DOES(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_3D_OES, tex_, level_, slice_); GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); if (GL_FRAMEBUFFER_COMPLETE == status) { glGenTextures(1, &tex_2d_); glBindTexture(GL_TEXTURE_2D, tex_2d_); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width_, height_, 0, GL_RGBA, GL_FLOAT, nullptr); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); copy_to_tex_ = 2; } else { copy_to_tex_ = 1; } } if (1 == copy_to_tex_) { glFramebufferTexture3DOES(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + att - FrameBuffer::ATT_Color0, GL_TEXTURE_3D_OES, tex_, level_, slice_); } else { BOOST_ASSERT(2 == copy_to_tex_); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + att - FrameBuffer::ATT_Color0, GL_TEXTURE_2D, tex_2d_, 0); } re.BindFramebuffer(0); }
void OGLESTexture3DRenderView::OnDetached(FrameBuffer& fb, uint32_t att) { UNREF_PARAM(fb); BOOST_ASSERT(att != FrameBuffer::ATT_DepthStencil); BOOST_ASSERT(fbo_ == checked_cast<OGLESFrameBuffer*>(&fb)->OGLFbo()); OGLESRenderEngine& re = *checked_cast<OGLESRenderEngine*>(&Context::Instance().RenderFactoryInstance().RenderEngineInstance()); re.BindFramebuffer(fbo_); BOOST_ASSERT(copy_to_tex_ != 0); if (1 == copy_to_tex_) { glFramebufferTexture3DOES(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + att - FrameBuffer::ATT_Color0, GL_TEXTURE_3D_OES, 0, 0, 0); } else { BOOST_ASSERT(2 == copy_to_tex_); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + att - FrameBuffer::ATT_Color0, GL_TEXTURE_2D, 0, 0); this->CopyToSlice(att); } re.BindFramebuffer(0); }
JNIEXPORT void JNICALL Java_org_lwjgl_opengles_OESTexture3D_glFramebufferTexture3DOES(JNIEnv *__env, jclass clazz, jint target, jint attachment, jint textarget, jint texture, jint level, jint zoffset) { glFramebufferTexture3DOESPROC glFramebufferTexture3DOES = (glFramebufferTexture3DOESPROC)tlsGetFunction(784); UNUSED_PARAM(clazz) glFramebufferTexture3DOES(target, attachment, textarget, texture, level, zoffset); }