应用计算着色器后未更新纹理

wecizke3  于 2022-09-26  发布在  其他
关注(0)|答案(1)|浏览(164)

我正在尝试将计算着色器应用于纹理以更新其值。我知道简单地说有些东西不起作用不是一个很好的问题,但我确实花了很多时间试图得到这份工作。

着色器程序编译得很好。将glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);行更改为glMemoryBarrier(GL_ALL_BARRIER_BITS); glFinish();没有影响。

以下是显示该问题的最小程序。SDL仅用于为GL上下文创建不可见窗口。程序期望用e1d2d1填充纹理并打印它们,但只打印e1d3d1。


# define SDL_MAIN_HANDLED

# include <stdio.h>

# include <assert.h>

# include <GL/glew.h>

# include <SDL2/SDL.h>

# define WIDTH 512

# define HEIGHT WIDTH

static const char *SHADER =
  "#version 430n" // "#version 310 esn"

  "layout (local_size_x = 1, local_size_y = 1) in;n"
  "layout (rgba32f, binding = 0) uniform image2D image;n"

  "void main() {n"
    "imageStore(image, ivec2(gl_GlobalInvocationID.xy), vec4(0.5f));n"
  "}n";

int main() {
  SDL_SetMainReady();
  assert(!SDL_Init(SDL_INIT_VIDEO));
  SDL_Window *window = SDL_CreateWindow("", SDL_WINDOWPOS_UNDEFINED,
    SDL_WINDOWPOS_UNDEFINED, 0, 0, SDL_WINDOW_HIDDEN | SDL_WINDOW_OPENGL);
  assert(window);
  SDL_GLContext gl = SDL_GL_CreateContext(window);
  assert(gl);
  assert(glewInit() == GLEW_OK);

  GLuint tex;
  glGenTextures(1, &tex);
  glBindTexture(GL_TEXTURE_2D, tex);
  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, WIDTH, HEIGHT, 0, GL_RGBA,
    GL_FLOAT, 0);
  glBindImageTexture(0, tex, 0, 0, 0, GL_READ_WRITE, GL_RGBA32F);

  GLuint shader = glCreateShader(GL_COMPUTE_SHADER);
  glShaderSource(shader, 1, &SHADER, 0);
  glCompileShader(shader);
  GLuint program = glCreateProgram();
  glAttachShader(program, shader);
  glLinkProgram(program);
  glUseProgram(program);
  glDispatchCompute(WIDTH, HEIGHT, 1);
  glMemoryBarrier(GL_ALL_BARRIER_BITS);
  glFinish();
  static float a[WIDTH * HEIGHT * 4];
  glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_FLOAT, a);

  puts((const char *)glGetString(GL_VERSION));
  for (int i = 0; i < 16; ++i) printf("%fn", a[i]);
  return 0;
}
gcxthw6b

gcxthw6b1#

如果不生成mipmap(使用glGenerateMipmap),则必须更改GL_TEXTURE_MIN_FILTER。由于默认过滤器为GL_NEAREST_MIPMAP_LINEAR,因此如果不将最小化函数更改为GL_NEARESTGL_LINEAR,则纹理将是“Mipmap Complete”。

glBindTexture(GL_TEXTURE_2D, tex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, WIDTH, HEIGHT, 0, GL_RGBA, GL_FLOAT, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glBindImageTexture(0, tex, 0, 0, 0, GL_READ_WRITE, GL_RGBA32F);

相关问题