2014-09-07 5 views
0

Я хочу организовать глубину для объектов в OpenGL ES 2.0, чтобы я мог указать один объект перед другими объектами (просто отправить единую переменную). Если я хочу выделить две строки отдельно, я просто уточню, какой из них ближе.Рендеринг глубины объекта в OpenGL ES 2.0

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

Кроме того, я попытался в вершинном шейдере что-то вроде gl_Position.z = depthAttr;, где depthAttr является равномерной переменной для объекта рендеринга.

Может кто-нибудь сказать мне, что еще я могу сделать, или что я сделал не так? Есть ли предпочтительный способ?

+0

Вы уверены, что используете gl_FragDepth из фейдер-шейдера? не вершин? – Savail

+0

Да, я вызываю его из фрагмента –

+0

На самом деле объекты должны отправлять свою глубину в качестве атрибута, потому что глубина для всех объектов не одинакова. Почему вы не отправляете свою позицию в шейдер как vec3 (x, y, z)? – Savail

ответ

0

Предустановленная выходная переменная шейдера фрагмента gl_FragDepth не поддерживается в ES 2.0. Он доступен только в полном формате OpenGL, а также в ES 3.0 или новее.

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

uniform float depthAttr; 
... 
gl_Position = ...; 
gl_Position.z = depthAttr; 

Гораздо более стандартный подход, чтобы сделать требуемую глубину часть вашего координаты положения. Если в настоящее время вы используете 2D-координаты для рисования линий, просто добавьте нужную глубину в качестве третьей координаты и измените атрибут позиции в вершинном шейдере с vec2 на vec3. Затем глубина будет поступать в шейдер в качестве части атрибута, и нет необходимости в дополнительных однородных переменных.

+0

Я использую третью координату z для чего-то еще. Я попробовал gl_Position.z = depthAttr; но результат тот же, независимо от того, что такое depthAttr. –

+0

Возможно, возникнет проблема с тем, как вы установите свою равномерную переменную. Это определенно будет работать, если равномерная переменная имеет правильное значение. –

+0

Я протестировал его, и значение верное. –

0

OpenGL ES 2.0 поддерживает дополнительное расширение - EXT_frag_depth, что позволяет назначить флеш-шейдеру gl_FragDepthEXT.

См. specification, но, конечно, будьте готовы отступить, когда он недоступен.

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