2013-07-14 2 views
1

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

В https://en.wikipedia.org/wiki/Z-buffering здесь формула как изображение: enter image description here

и здесь это написано мной:
г»= (2^д -1) * ((далеко + рядом)/(2 * (дальний) + (1/z) * (-far * near)/(far-near) + 1/2) , когда d - глубина z-буфера (24 бит в моем случае) и z - значение z вершины.

Я написал простой код и попытался запустить его и прочитать значение буфера глубины и вычислить его, но i получать отклики.

мой пример кода:

/* init */ 
#define CUBE_SIDE_SIZE 0.25 
glViewport(0,0,WINDOW_WIDTH,WINDOW_HEIGHT); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(-1, 1, -1, 1, -1, 1); 
/* draw */ 
glEnable(GL_DEPTH_TEST); 
glBegin(GL_QUADS); 
glColor3f(1, 0, 0); 
glVertex3f(-CUBE_SIDE_SIZE, -CUBE_SIDE_SIZE, -CUBE_SIDE_SIZE); 
glVertex3f(-CUBE_SIDE_SIZE, CUBE_SIDE_SIZE, -CUBE_SIDE_SIZE); 
glVertex3f(CUBE_SIDE_SIZE, CUBE_SIDE_SIZE, -CUBE_SIDE_SIZE); 
glVertex3f(CUBE_SIDE_SIZE, -CUBE_SIDE_SIZE, -CUBE_SIDE_SIZE); 
glEnd(); 

Я прочитал от 0,375 значения глубины буфера. Как я могу получить это значение путем вычисления?

Спасибо.

+0

Почему вы хотите рассчитать значения буфера глубины? Btw: Не используйте устаревшие методы OpenGL! –

ответ

2

nearValue is -1, farValue - +1. Ваш куб находится в -0.25. Таким образом, расстояние от ближней плоскости составляет 0,75. Значения z масштабируются до диапазона глубины, который по умолчанию равен [0,1]. Поскольку farValue-nearValue = 2, это означает, что значение глубины составляет 0,75/2 = 0,375.

Кроме того, вы опубликовали формулу для перспективной проекции, но используете орфографическую проекцию.

+0

спасибо, но как насчет цельной формулы выше? мне не нужна глубина битов Z-буфера? – user893269

+1

Нет, вам это не нужно. Если вы хотите понять преобразования OpenGL, я бы предложил посмотреть на [9.011. Как преобразуются координаты? Каковы различные координатные пространства?] (Http://www.opengl.org/archives/resources/faq/technical/transformations.htm). Еще лучшим ресурсом является сама спецификация OpenGL. Вы должны придерживаться ресурсов, специфичных для OpenGL, и игнорировать Википедию. –

+0

исправьте меня, если я ошибаюсь, но по этим расчетам:
Z-buffer value = (z - nearValue)/(farValue - nearValue)
Z-буфер является supposet линейным, а это не так.
Что мне не хватает? – user893269

Смежные вопросы