gpt4 book ai didi

c++ - 在 glReadPixels 调用后丢失

转载 作者:行者123 更新时间:2023-11-27 23:57:39 24 4
gpt4 key购买 nike

我在纹理/图像中存储了不同的信息。我想将它们渲染到 FBO 纹理上,然后用 glReadPixels 读出它们。整个图像被分成不同的区域,我在这个图像中有 4 行和 4 列的信息,我想将它们存储在不同的指针上。

std::vector<float*> data;

for (int i = 0; i < _resolution; ++i) {
int posX = mod((float)i, (float)sqrt(_resolution));
posX *= _resolution;
int posY = ((float)i / _resolution);
posY *= _resolution;

float pixels[_resolution*_resolution*3];
glReadPixels(posX, posY, posX + _resolution, posY + _resolution, GL_RGB, GL_FLOAT, pixels);

for (int j = 0; j < _resolution*_resolution; ++j) {
cout << "(" << pixels[j*3] << ", " << pixels[j*3+1] << ", " << pixels[j*3+2] << ")";
}
cout << endl;

data.push_back(pixels);

}

控制台上的输出只是临时用于调试。

这个函数在 A 类中。现在在调用 glReadPixels 之后的第二次迭代(i = 1,posX = 16,posY = 0)我失去了“这个”调试控制台(我不知道Xcode 中左下角的名称)说明了这一点,因此类 A NULL。之后 for 循环抛出异常访问错误。

那里发生了什么?

最佳答案

glReadPixels(posX, posY, posX + _resolution, posY + _resolution, GL_RGB, GL_FLOAT, pixels);

glReadPixel 的第二个和第三个参数是宽度和高度,而不是右上角坐标(正如您的代码所假设的那样)。这样做的结果是您分配的缓冲区对于 glReadPixel 返回的数据量而言太小,从而导致缓冲区溢出。

假设 glReadPixels 的参数是正确的,你应该分配一个更大的缓冲区:

float pixels[(posX+_resolution)*(posy+_resolution)*3];

或者改正对 glReadPixels 本身的调用:

glReadPixels(posX, posY, _resolution, _resolution, GL_RGB, GL_FLOAT, pixels);

关于c++ - 在 glReadPixels 调用后丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41437262/

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