C++ 使用OpengGLES2(角度)从帧缓冲区对象读取
使用Angle编程UWP应用程序以运行OpenGL ES,我面临一个问题,即使用C++ 使用OpengGLES2(角度)从帧缓冲区对象读取,c++,uwp,opengl-es,textures,opengl-es-2.0,C++,Uwp,Opengl Es,Textures,Opengl Es 2.0,使用Angle编程UWP应用程序以运行OpenGL ES,我面临一个问题,即使用glReadPixels从帧缓冲区对象读取的基本操作。 从VisualStudio模板“OpenglES2应用程序(Android、iOS、Windows Universal)”开始,我可以将默认场景渲染检索到内存缓冲区中 初始化: void SimpleRenderer::InitFbo() { int buf_size = tex_height*tex_width * 4; mReadBuf =
glReadPixels
从帧缓冲区对象读取的基本操作。
从VisualStudio模板“OpenglES2应用程序(Android、iOS、Windows Universal)”开始,我可以将默认场景渲染检索到内存缓冲区中
初始化:
void SimpleRenderer::InitFbo()
{
int buf_size = tex_height*tex_width * 4;
mReadBuf = new char[buf_size];
memset(mReadBuf, 123, buf_size); // arbitrary value to detect changes
}
void SimpleRenderer::InitFbo()
{
glGenFramebuffers(1, &mRenderFbo);
glGenTextures(1, &mRenderTexture);
int buf_size = tex_height*tex_width * 4;
char*buf = new char[buf_size];
memset(buf, 255, buf_size);
glBindTexture(GL_TEXTURE_2D, mRenderTexture);
glTexImage2D(GL_TEXTURE_2D, 0, 4,
tex_width,
tex_height,
0, GL_RGBA, GL_UNSIGNED_BYTE,
buf);
glBindFramebuffer(GL_FRAMEBUFFER, mRenderFbo);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
mRenderTexture, 0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
delete[] buf;
mReadBuf = new char[buf_size];
memset(mReadBuf, 123, buf_size);
}
绘图功能:
void SimpleRenderer::Draw()
{
// drawing calls here
// (...)
glReadPixels(0, 0, tex_width, tex_height, GL_RGBA, GL_UNSIGNED_BYTE, mReadBuf);
// success : mReadBuf is updated with pixel values
}
void SimpleRenderer::Draw()
{
glBindFramebuffer(GL_FRAMEBUFFER, mRenderFbo);
// drawing calls here
// (...)
glReadPixels(0, 0, tex_width, tex_height, GL_RGBA, GL_UNSIGNED_BYTE, mReadBuf);
// failure : mReadBuf is unchanged
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
但是如果我只是创建一个帧缓冲区对象,尝试在那里绘制并检索结果,glReadPixels
不返回任何值,glError
返回无效的\u帧缓冲区\u操作
初始化:
void SimpleRenderer::InitFbo()
{
int buf_size = tex_height*tex_width * 4;
mReadBuf = new char[buf_size];
memset(mReadBuf, 123, buf_size); // arbitrary value to detect changes
}
void SimpleRenderer::InitFbo()
{
glGenFramebuffers(1, &mRenderFbo);
glGenTextures(1, &mRenderTexture);
int buf_size = tex_height*tex_width * 4;
char*buf = new char[buf_size];
memset(buf, 255, buf_size);
glBindTexture(GL_TEXTURE_2D, mRenderTexture);
glTexImage2D(GL_TEXTURE_2D, 0, 4,
tex_width,
tex_height,
0, GL_RGBA, GL_UNSIGNED_BYTE,
buf);
glBindFramebuffer(GL_FRAMEBUFFER, mRenderFbo);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
mRenderTexture, 0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
delete[] buf;
mReadBuf = new char[buf_size];
memset(mReadBuf, 123, buf_size);
}
绘图功能:
void SimpleRenderer::Draw()
{
// drawing calls here
// (...)
glReadPixels(0, 0, tex_width, tex_height, GL_RGBA, GL_UNSIGNED_BYTE, mReadBuf);
// success : mReadBuf is updated with pixel values
}
void SimpleRenderer::Draw()
{
glBindFramebuffer(GL_FRAMEBUFFER, mRenderFbo);
// drawing calls here
// (...)
glReadPixels(0, 0, tex_width, tex_height, GL_RGBA, GL_UNSIGNED_BYTE, mReadBuf);
// failure : mReadBuf is unchanged
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
*编辑-由于下面的评论而解决。需要正确初始化纹理
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
tex_width,
tex_height,
0, GL_RGBA, GL_UNSIGNED_BYTE,
buf);
对于记录,在它得到解决之前,我正在使用
glCheckFramebufferStatus
检查帧缓冲区状态,它返回GL\u framebuffer\u complete\u ATTACHMENT
OpenGL函数的第三个参数指定纹理缓冲区的内部格式
在方法SimpleRenderer::InitFbo
中,将4
传递给内部格式,该格式不是有效的参数。改用GL\u RGBA
:
glTexImage2D(GL_TEXTURE_2D, 0,
GL_RGBA, // <-----------------------
tex_width,
tex_height,
0, GL_RGBA, GL_UNSIGNED_BYTE,
buf);
glTexImage2D(GL_纹理_2D,0,
GL_RGBA,//完成;对不起,我到处找,但找不到验证答案的方法。谢谢你的帮助。