Буфер глубины OpenGL для текстуры (для изображений разных размеров)

У меня проблема с буфером глубины. Я хочу вставить в текстуру. Но, похоже, это не работает.

Итак, вот фрагмент кода, который я выполняю после рендеринга объектов:

  glGenTextures(1, (GLuint*)&_depthTexture);
  glBindTexture(GL_TEXTURE_2D, _depthTexture);

  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);

  const pair<int, int> &img_size = getImageSize();
  glTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32, img_size.first, img_size.second, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0);
  glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, img_size.first, img_size.second);

  glClear( GL_DEPTH_BUFFER_BIT );

Дело в том, что (у меня OpenGL 3.2+) изображение для рендеринга имеет разный размер. В большинстве случаев это не будет 2 ^ i на 2 ^ j для размера. Итак, это проблема?

Кроме того, другая часть проблемы может быть во фрагментном шейдере после:

#version 140

uniform sampler2D depthTexture;
uniform ivec2 screenSize;

out vec4 outColor;

void main()
{
    vec2 depthCoord = gl_FragCoord.xy / screenSize.xy;
    float d = texture2D(depthTexture, depthCoord).x;
    outColor =  vec4(d, d, d, 1.0);
}

После этого, когда я визуализирую некоторые фигуры во второй раз, я хочу использовать предыдущую глубину (буфер глубины текстуры) для создания некоторых эффектов.

А если серьезно... кто-нибудь может показать мне кусок кода, где вы можете добавить буфер глубины в текстуру? Мне все равно, рендерится ли он в текстуру или текстура извлекается после рендеринга! Пока у меня есть текстура со значением глубины для второго прохода... вот что важно!


person widgg    schedule 30.08.2012    source источник
comment
это не работает. Каким образом это не работает?   -  person Nicol Bolas    schedule 30.08.2012
comment
мой образ черный! И, согласно другому веб-сайту, буфер глубины должен выглядеть белым, когда он находится далеко, и черным вблизи... но половина моего изображения должна быть белой!... по крайней мере, часть, покрытая новыми треугольниками!   -  person widgg    schedule 30.08.2012
comment
буфер глубины должен выглядеть белым, когда он находится далеко, и черным вблизи. Это скорее зависит от того, что там хранится. Если вы используете диапазон глубины по умолчанию, то это будет правдой.   -  person Nicol Bolas    schedule 31.08.2012
comment
Но мой код, это нормально или нет? поместить буфер глубины в текстуру?   -  person widgg    schedule 31.08.2012
comment
Попробуйте glEnable(GL_DEPTH_TEST); Почему бы не использовать FBO для глубины рендеринга и избежать проблем с операцией копирования и размером текстуры?   -  person ChatCloud    schedule 31.08.2012
comment
Можете ли вы сделать мягкую частицу с FBO?   -  person widgg    schedule 31.08.2012
comment
Могу ли я прочитать FBO из фрагментного шейдера? В 2007 году это было невозможно... если бы это изменилось, это было бы здорово!   -  person widgg    schedule 31.08.2012


Ответы (2)


http://www.joeforte.net/projects/soft-particles/

это может быть хорошим решением!

По крайней мере, это полный код... возможно, он сможет получить все разные части!

person widgg    schedule 04.09.2012

Вам может понадобиться glReadBuffer звонок. Если ваш контекст имеет двойную буферизацию, это будет glReadBuffer( GL_BACK ).

Кроме того, попробуйте GL_DEPTH_COMPONENT24, так как 32-битный буфер глубины, я думаю, был бы необычным.

person JWWalker    schedule 30.08.2012
comment
32-битная глубина не так уж необычна, это обычное число с плавающей запятой (хотя существуют и 32-битные форматы буфера int). 24-битная версия на самом деле менее распространена, так как это пережиток того времени, когда карты не были достаточно быстрыми, чтобы обрабатывать 32 целых бита, а 16-битная скорость была недостаточно точной для рендеринга. Тогда некоторые драйверы использовали 24-битные вместо 32-битных; сейчас все наоборот. - person ssube; 31.08.2012
comment
@peachykeen: 32-битные буферы глубины с плавающей запятой являются необычными. Кроме того, DEPTH_COMPONENT32 — это нормализованный целочисленный буфер глубины, а не число с плавающей запятой (это DEPTH_COMPONENT32F) - person Nicol Bolas; 31.08.2012
comment
это хороший вопрос... но это может быть двойная буферизация! Я просто не уверен. - person widgg; 31.08.2012
comment
Итак, где мне разместить glReadBuffer в моем коде? Пробовал до glTexImage2D, но в обоих случаях, когда ставлю GL_FRONT или GL_BACK, получаю ошибку INVALID_ENUM! Что как-то странно! Любая идея ? - person widgg; 04.09.2012
comment
хорошо... нашел... это GL_COLOR_ATTACHMENT0_EXT... что бы это ни было! - person widgg; 04.09.2012