gpt4 book ai didi

c++ - 使用 OpengGLES2(角度)从帧缓冲区对象中读取

转载 作者:行者123 更新时间:2023-11-30 05:10:24 25 4
gpt4 key购买 nike

使用 Angle 对 UWP 应用程序进行编程以运行 OpenGL ES,我遇到了使用 glReadPixels 从帧缓冲区对象读取的基本操作的问题。从 Visual Studio 模板“OpenglES2 应用程序(Android、iOS、Windows 通用)”开始,我可以将默认场景渲染检索到内存缓冲区中。

初始化:

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::Draw()
{

// drawing calls here
// (...)

glReadPixels(0, 0, tex_width, tex_height, GL_RGBA, GL_UNSIGNED_BYTE, mReadBuf);
// success : mReadBuf is updated with pixel values
}

但是如果我只是创建一个帧缓冲区对象,尝试在其中绘制并检索结果,glReadPixels 不会返回任何值,而 glError 返回 INVALID_FRAMEBUFFER_OPERATION

初始化:

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()
{
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);
}

*edit - 由于下面的评论解决了。纹理的正确初始化是

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
tex_width,
tex_height,
0, GL_RGBA, GL_UNSIGNED_BYTE,
buf);

郑重声明,在它得到解决之前,我使用 glCheckFramebufferStatus 检查帧缓冲区状态,它返回了 GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT

最佳答案

OpenGL函数的第三个参数 glTexImage2D 指定纹理缓冲区的内部格式。

在方法中SimpleRenderer::InitFbo你通过了4到内部格式,这不是有效参数。使用 GL_RGBA相反:

glTexImage2D(GL_TEXTURE_2D, 0, 
GL_RGBA, // <-----------------------
tex_width,
tex_height,
0, GL_RGBA, GL_UNSIGNED_BYTE,
buf);

请注意,内部格式(在 OpenGL ES 2.0 中)的有效参数是 GL_ALPHA , GL_LUMINANCE , GL_LUMINANCE_ALPHA , GL_RGB , GL_RGBA .

如果您使用 glGetErrorglTexImage2D 的电话之后你会得到 GL_INVALID_VALUE如果内部格式不是可接受的格式,则会生成。此外,这会导致 GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT错误(使用 glCheckFramebufferStatus 检查时),如果纹理附加到帧缓冲区和 glReadPixels导致 INVALID_FRAMEBUFFER_OPERATION错误。

关于c++ - 使用 OpengGLES2(角度)从帧缓冲区对象中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45700742/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com