Рендеринг буфера глубины в текстуру - PullRequest
1 голос
/ 11 декабря 2011

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

Я пытаюсь преобразовать буфер глубины сцены в текстуру, используя opengl ES 2.0 на iOS, но я не получаю совершенно точных результатов, если модели не имеют относительно высокую плотность показа полигоновна дисплее.

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

Это очень напоминает мне проблемы аффинного и перспективного отображения текстуры, и я думаю, что мне нужно как-то поэкспериментировать с компонентом ".w", чтобы это исправить.Но я думал, что «переменные» переменные должны уже учитывать это, поэтому я немного растерялся.

Это мой вершинный и фрагментный шейдер:

[vert]
uniform mat4 uMVPMatrix;
attribute vec4 aPosition; 
varying float objectDepth;
void main()
{
    gl_Position=uMVPMatrix * aPosition;
    objectDepth=gl_Position.z;
}

[frag]
precision mediump float;
varying float objectDepth;
void main()
{
    //Divide by scene clip range, set to a constant 200 here
    float grayscale=objectDepth/200.0;
    gl_FragColor = vec4(grayscale,grayscale,grayscale,1.0);
}

Обратите внимание, что этот шейдер сильно упрощен, просто чтобы выделить метод, который я использую.Хотя невооруженным глазом кажется, что в большинстве случаев это работает хорошо, на самом деле я рендеринг 32-битных текстур (упаковывая float в ARGB), и мне нужна очень высокая точность для дальнейшей обработки, или я получаю заметные артефакты.

Я могу добиться довольно высокой точности, увеличив количество полигонов, но это сильно снижает мою частоту кадров, так что, есть ли лучший способ?

Ответы [ 2 ]

2 голосов
/ 21 декабря 2011

Вам нужно разделить z на компонент w.

0 голосов
/ 12 января 2012

Это очень просто, глубина не линейная, поэтому вы не можете использовать линейную интерполяцию для z ... вы решите ее очень легко, если вы интерполируете 1 / z вместо z.Вы также можете выполнить некоторую математику, в точности так, как предлагает Расмус.Вы можете прочитать больше о интерполяции координат на http://www.luki.webzdarma.cz/eng_05_en.htm (страница о реализации простого программного рендерера)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...