在 opengl 中将整数存储在单值纹理中不起作用

storing integers in single value texture in opengl not working

我正在尝试编写一个适用于状态的计算着色器。我想将此状态的初始值存储在单个通道纹理中。但是,这不起作用。

我有以下代码:

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 returns 0 的调用以及 glReadPixels 调用在其第一次调用时被触发后的断言。纹理主要由 0 组成。不过好像也有几块1s,-1s和随机值。

我试过存储整数和短裤,但似乎没有任何效果。我还在 glTexImage2D 调用中尝试了不同的 GL_ENUMs,但无济于事。

我会把问题评论中已经提供的答案放在这里。

glReadPixels 从当前绑定的帧缓冲区中读取像素。

要从纹理中读取像素,您应该使用 glGetTexImage 或更现代的版本 glGetTextureImage (4.5),它允许直接传递纹理句柄而无需将纹理绑定到上下文。