|
我想问一下 这里的 GLuint m_Resolve_FBO; // MSAA FBO is copied to this FBO after render.
GLuint m_Resolve_ColorTex; // color texture for above FBO.
GLuint m_MSAA_FBO; // framebuffer for MSAA RTT
GLuint m_MSAA_ColorTex; // color texture for MSAA RTT
GLuint m_MSAA_DepthTex; // depth texture for MSAA RTT
GLint m_width; // width of texture in pixels
GLint m_height; // height of texture in pixels
int m_samples; // sample width for MSAA
这些变量的含义是什么意思 下面的代码是为其分配缓冲区的 这些缓冲区的作用是干嘛的。还有getGLExtensions函数和 getTextureExtensions 函数有什么用啊
typedef osg::FBOExtensions OSG_GLExtensions;
typedef osg::Texture::Extensions OSG_Texture_Extensions;
static const OSG_GLExtensions* getGLExtensions(const osg::State& state)
{
#if(OSG_VERSION_GREATER_OR_EQUAL(3, 4, 0))
return state.get<osg::GLExtensions>();
#else
return osg::FBOExtensions::instance(state.getContextID(), true);
#endif
}
static const OSG_Texture_Extensions* getTextureExtensions(const osg::State& state)
{
#if(OSG_VERSION_GREATER_OR_EQUAL(3, 4, 0))
return state.get<osg::GLExtensions>();
#else
return osg::Texture::getExtensions(state.getContextID(), true);
#endif
}
const OSG_GLExtensions* fbo_ext = getGLExtensions(*state);
// We don't want to support MIPMAP so, ensure only level 0 is allowed.
const int maxTextureLevel = 0;
// Create an FBO for secondary render target ready for application of lens distortion shader.
fbo_ext->glGenFramebuffers(1, &m_Resolve_FBO);
glGenTextures(1, &m_Resolve_ColorTex);
glBindTexture(GL_TEXTURE_2D, m_Resolve_ColorTex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, maxTextureLevel);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
// Create an FBO for primary render target.
fbo_ext->glGenFramebuffers(1, &m_MSAA_FBO);
const OSG_Texture_Extensions* extensions = getTextureExtensions(*state);
// Create MSAA colour buffer
glGenTextures(1, &m_MSAA_ColorTex);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, m_MSAA_ColorTex);
extensions->glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, m_samples, GL_RGBA, m_width, m_height, false);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER_ARB);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER_ARB);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MAX_LEVEL, maxTextureLevel);
// Create MSAA depth buffer
glGenTextures(1, &m_MSAA_DepthTex);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, m_MSAA_DepthTex);
extensions->glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, m_samples, GL_DEPTH_COMPONENT, m_width, m_height, false);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MAX_LEVEL, maxTextureLevel);
// check FBO status
GLenum status = fbo_ext->glCheckFramebufferStatus(GL_FRAMEBUFFER_EXT);
if (status != GL_FRAMEBUFFER_COMPLETE_EXT)
{
osg::notify(osg::WARN) << "Error setting up frame buffer object." << std::endl;
}
|
|