Как эмулировать GL_DEPTH_CLAMP_NV? - PullRequest
1 голос
/ 11 мая 2011

У меня есть платформа, на которой это расширение недоступно (не NVIDIA).Как я мог подражать этой функциональности?Мне это нужно для решения проблемы отсечения в дальней плоскости при рендеринге теневых томов трафарета с использованием алгоритма z-fail.

Ответы [ 2 ]

5 голосов
/ 05 марта 2012

Поскольку вы говорите, что используете OpenGL ES, но также упомянули, что пытаетесь ограничить gl_FragDepth, я предполагаю, что вы используете OpenGL ES 2.0, поэтому вот трюк с шейдером:

Вы можете эмулировать ARB_depth_clamp с помощьюиспользуя отдельную переменную для z-компонента.

Вершинный шейдер:

varying float z;
void main()
{
    gl_Position = ftransform();

    // transform z to window coordinates
    z = gl_Position.z / gl_Position.w;
    z = (gl_DepthRange.diff * z + gl_DepthRange.near + gl_DepthRange.far) * 0.5;

    // prevent z-clipping
    gl_Position.z = 0.0;
}

Фрагментный шейдер:

varying float z;
void main()
{
    gl_FragColor = vec4(vec3(z), 1.0);
    gl_FragDepth = clamp(z, 0.0, 1.0);
}
1 голос
/ 11 мая 2011

«Откат» к ARB_depth_clamp?

Проверьте, существует ли NV_depth_clamp в любом случае? Например, моя карта ATI поддерживает пять расширений GL «только для NVidia».

...