2017-01-25 5 views
1

Я обрабатываю несколько треугольников, предусмотренных в координатах клипа с OpenGL ES 3.0. Используя переменную, я генерирую интерполированные координаты текстуры для каждого фрагмента. Однако, поскольку интерполяция использует координату z вершин, интерполяция не является линейной в пространстве экрана. GLES, насколько мне известно, не поддерживает новый квалификатор, который якобы делает то, что я хочу.GLES и neroverspective

У вас есть рекомендация об обходном пути? Я мог бы предоставить координаты клипа без z, но мне нужно z для тестирования глубины.

С уважением

ответ

1

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

Таким образом, в пиксельный шейдер вы бы иметь что-то вроде:

... 
varying zPositionComponent; 
... 
    vac4 actualVertexPosition = ...; // whatever you had in gl_Position 
    zPositionComponent = actualVertexPosition.z; 
    gl_Position = vec4(actualVertexPosition.x, actualVertexPosition.y, 0.0, actualVertexPosition.w); 

затем в пиксельный шейдер просто добавить коррекцию глубины фрагмента, как gl_FragDepth = zPositionComponent;

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

+0

Согласно этому https://www.khronos.org/opengl/wiki/Depth_Test тест глубины будет использовать gl_fragdepth, но это устранит ранний тест глубины которые я бы хотел избежать. – user5024425

+0

Да, это то, что я имел в виду с ручным буфером глубины. Это усложняется. Тем не менее, может быть не лучшее решение ... Возможно, вы могли бы написать форму «ID» в буфере трафарета с буфером глубины, а затем перерисовать их без координаты Z, но это звучит еще хуже. Возможно, если вы добавите дополнительную информацию о что именно вы делаете. –

+0

В основном я рисую несколько рекламных щитов/2D-квадов, но геометрия все равно должна иметь правильное z-тестирование с остальной частью сцены. – user5024425

0

OpenGL использует w компонент положения для коррекции перспективы. См. Уравнение 13.7 этого specification.

attribute vec2 a_uv; 
varying vec3 v_uv; 

vec4 pos = MVP * vertex; 
gl_Position = pos; 
v_uv = vec3(a_uv * pos.w, pos.w); 

затем в пиксельный шейдер:

vec2 uv = v_uv.xy/v_uv.z;