Совершенно новый в шейдерах, поэтому, пожалуйста, потерпите меня, если я делаю что-то глупое здесь.:)
Я пытаюсь преобразовать буфер глубины сцены в текстуру, используя 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), и мне нужна очень высокая точность для дальнейшей обработки, или я получаю заметные артефакты.
Я могу добиться довольно высокой точности, увеличив количество полигонов, но это сильно снижает мою частоту кадров, так что, есть ли лучший способ?