我正在尝试编写一个在状态上工作的计算着色器。我希望将此状态的初始值存储在单通道纹理中。然而,这是行不通的。
我有以下代码:
GLuint tex;
glGenTextures(1, &tex);
int time_horizon = 1000;
std::vector<decltype(time_horizon)> tex_vals(width * height * 4, time_horizon);
for (auto x: tex_vals)
assert(x == time_horizon);
glBindTexture(GL_TEXTURE_2D, tex);
assert(glGetError() == 0);
glTexImage2D(GL_TEXTURE_2D, 0, GL_R32I, width, height, 0, GL_RED_INTEGER, GL_INT, tex_vals.data());
auto err = glGetError();
if (err) {
std::cerr << "gl error is: " << err << '\n';
exit(1);
}
decltype(time_horizon) test[static_cast<size_t>(width*height)];
glBindTexture(GL_TEXTURE_2D, tex);
glReadPixels(0, 0, width, height, GL_RED_INTEGER, GL_SHORT, test);
for (auto x: test) {
std::cerr << x << '\n';
assert(time_horizon == x);
}
在这两种情况下,对glGetError的调用都返回0,并且glReadPixels调用之后的断言在第一次调用时会被触发。纹理主要由0组成。然而,似乎也有一些1,-1和随机值的区块。
我试着存储整型和短型,但似乎都不起作用。我还在glTexImage2D调用中摆弄过不同的GL_ENUMs,但都无济于事。
发布于 2021-06-10 17:59:14
我将在这里提供问题评论中已经提供的答案。
glReadPixels从当前绑定的帧缓冲区中读取像素。
要从纹理中读取像素,应使用glGetTexImage
或更新的版本glGetTextureImage (4.5),后者允许直接传递纹理句柄,而无需将纹理绑定到上下文。
https://stackoverflow.com/questions/67854357
复制相似问题