Визуализировать буфер глубины

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

Вот что я использую в представлении буфера глубины:

void get_gl_size(int &width, int &height)
{
    int iv[4];
    glGetIntegerv(GL_VIEWPORT, iv);
    width = iv[2];
    height = iv[3];
}

void visualize_depth_buffer()
{
    int width, height;

    get_gl_size(width, height);

    float *data = new float[width * height];

    glReadPixels(0, 0, width, height, GL_DEPTH_COMPONENT, GL_FLOAT, data);
    glDrawPixels(width, height, GL_LUMINANCE, GL_FLOAT, data);

    delete [] data;
}

Ответ 1

Я не уверен, является ли это вашей фактической ошибкой, но есть несколько вещей, которые я могу порекомендовать вам проверить. Было бы неплохо, если бы вы предоставили скриншот о том, как именно он увеличился.

Прежде всего, убедитесь, что матрицы проецирования/моделирования выглядят точно так же, как и рендеринг. Я не могу понять, как это повлияет на это, но это будет кое-что, чтобы заглянуть.

Во-вторых, spec указывает, что glPixelStore, glPixelTransfer и glPixelMap могут влиять на результаты, вы должны убедиться, что они правильно установить.

Если вы в конечном итоге получаете эту работу, пожалуйста, поделитесь тем, что пошло не так - кажется, интересный вопрос.:)

Ответ 2

Этот код должен работать. У вас есть что-то еще, вызывающее glPixelZoom? Это стоит сбросить его, чтобы проверить, что вы на самом деле не требуете увеличения.

Ответ 3

еще одна вещь, чтобы проверить, что ваша растровая позиция правильная. см. glRasterPos. код, как указано, должен работать, но я могу видеть, как состояние запутано в другом месте (вы рисуете что-то перед визуализацией глубины...) что вы, вероятно, находитесь в области драйверов gl, которые не очень хорошо протестированы, потому что это необычно. что вам следует делать дальше: - тест с другим поставщиком (ati/nv..) - записать данные чтения в файл, чтобы увидеть, не работает ли рисование или чтение, как ожидалось

Ответ 4

модель и проекционные матрицы не будут влиять на это.

возможно попробуйте установить позицию ничьей на 0,0 с помощью glRasterPos или glWindowPos. видимо там также glPixelZoom.

Ответ 5

1) Сбросьте необработанные данные буфера глубины в файл.

2) Откройте его, используя IrfanView (Открыть как → RAW файл)

3) Отрегулируйте параметры (ширину, высоту) и формат пикселей в соответствии с вашим буфером глубины BPP (8 бит, 16 бит,...). Убедитесь, что отмечена шкала серого.

4) Получите пиво.