OpenGL - копировать текстуру с экрана, меньшего, чем этот экран - PullRequest
0 голосов
/ 20 мая 2009

Я пытаюсь сделать снимок экрана с текстурой с более низким разрешением, чем сам экран (чтобы вернуться на экран и создать эффект размытия / цветения), и он работает не совсем хорошо. Я понимаю, что для этого можно использовать mipmaps, но я просто не могу заставить работать правильную последовательность команд.

Мой текущий код:

width=1024;
height=1024;

glGenTextures(1, &texture);

glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture);

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glEnable (GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,  GL_MODULATE);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );

glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, width, height, 0);

// code for rendering the screen back on goes here

1 Ответ

2 голосов
/ 21 мая 2009

Вы не можете захватывать и понижать фильтрацию за один раз. Сначала вам нужно сделать полноэкранный снимок с более крупной текстурой, затем следует создать мип-карты, если включено автоматическое создание мип-карт, а затем вы можете рендерить один, используя эту текстуру снова, убедившись, что вы соответствующим образом настроили уровень мип-карты.

Однако это будет выглядеть уродливо, поскольку автоматическое mipmap-поколение обычно использует блочный фильтр.

Вместо этого я бы настроил несколько FBO (Frame Buffer Objects) и шейдеры GLSL. Это дает вам более полный контроль над всеми шагами:

  • создать оригинальное изображение в текстуре
  • применить хорошую гауссовскую фильтрацию нижних частот
  • наложение фильтрации с исходным изображением на буфер кадров
...