рендеринг буфера глубины в текстуру с использованием glCopyTexSubImage2D

0

Я хочу сделать буфер глубины текстурой и нарисовать квад с DepthTexture. Но это не сработает.

Сначала я делаю DepthTexture:

glGenTextures(1, &_iTexDepth);
glBindTexture(GL_TEXTURE_2D, _iTexDepth);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, _w, _h, 0, 
    GL_DEPTH_COMPONENT,  GL_UNSIGNED_BYTE, 0);
glBindTexture(GL_TEXTURE_2D, 0);

и подготовиться к оказанию:

glViewport(0, 0, _w, _h);
glMatrixMode(GL_PROJECTION);
glLoadMatrixf(camera_proj);
glMatrixMode(GL_MODELVIEW);
glLoadMatrixf(camera_modelview);
glPushAttrib(GL_COLOR_BUFFER_BIT | GL_PIXEL_MODE_BIT); 
    glDrawBuffer(GL_BACK);
    glReadBuffer(GL_BACK);
glClearColor(0, 0, 0, 1);
glClearDepth(1.0f); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

и сделать что-то, и скопировать в текстуру:

glBindTexture(GL_TEXTURE_2D, _iTexDepth);
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, _w, _h);
glBindTexture(GL_TEXTURE_2D, 0);

и, наконец, я связываю _iTexDepth и нарисую Quad

Этот код хорошо работает с текстурой GL_RGBA8, но не работает с GL_DEPTH_COMPONENT (белый только с DEPTH_COMPONENT)

Если у вас есть представление об этой проблеме, я хочу помочь

PS Я не хочу использовать FBO

  • 0
    Почему вы не хотите использовать FBO? Это был бы самый простой путь.
  • 0
    это часть моего дипломного проекта, и я должен представить это. Но компьютер нынешней комнаты не поддерживает FBO. так что я хочу сделать оба (FBO, CopyTexture)
Теги:
opengl

1 ответ

0
Лучший ответ

Если ваша текстура получается белой, она действительно отображается правильно.

Проблема, я думаю, связана с настройкой дальних и ближних плоскостей в вашей проекционной матрице. Буфер глубины не является линейным, и если ближайшая к вам плоскость очень близка, например, 0,1 и ваша дальняя плоскость далеко, как 500,0, то много возможных значений глубины ОЧЕНЬ близко к вашей ближней плоскости.

Лучше установить близкую плоскость к чему-то вроде 2.0 или даже выше. Экспериментируйте с разными значениями ближней/дальней плоскости и сообщите мне, если у вас все еще есть проблемы.

Что касается твоего английского, это прекрасно! Как бывший частный преподаватель английского языка для людей в Японии, ваш стандарт довольно хорош.

  • 0
    Это действительно полезный совет для меня, спасибо вам большое! Я использовал гигантские модели, поэтому мои ближние и дальние самолеты были далеко друг от друга. Теперь я предварительно масштабирую ModelViewMatrix, и я меняюсь рядом / далеко. Теперь это работа!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню