Чтение глубины буфера с использованием OpenGLES3 - PullRequest
1 голос
/ 10 ноября 2019

В OpenGL Я могу прочитать значения z-буфера, используя glReadPixels, например:

glReadPixels(scrx, scry, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth);

Если я сделаю то же самое в OpenGL ES3.2 Я получаю GL_INVALID_OPERATION ошибку.

Проверяя спецификацию, я вижу, что OpenGL позволяет GL_DEPTH_COMPONENT, но OpenGLES3 не .

В качестве обходного пути я скопировал глубину фрагмента в альфа-значение в цветовом буфере, используя этот GLSL:

#version 320 es
...
outCol = vec4(psCol.rgb, gl_FragCoord.z);

После выполнения glReadPixels () в GL_RGBA части кадрового буфераЯ использую rgba[3]/255.0 в качестве значения глубины.

Хотя это работает, 8-битная точность значения альфа недостаточна для моей цели выбора того, что находится под курсором мыши.

Есть ли способ получить значения Z из кадрового буфера в OpenGL ES3?

1 Ответ

1 голос
/ 10 ноября 2019

Существует расширение OpenGL ES NV_read_depth , которое позволяет читать из буфера глубины glReadPixels. Расширение написано в соответствии со спецификацией OpenGL ES 2.0, но все еще не является стандартным в OpenGL ES 3.2.

Получить набор имен расширений OpenGL es можно по:

std::set<std::string> ogl_es_extensins;
GLint no_of_extensions = 0;
glGetIntegerv(GL_NUM_EXTENSIONS, &no_of_extensions);
for ( int i = 0; i < no_of_extensions; ++i )
{
    std::string ext_name = reinterpret_cast<const char*>(glGetStringi(GL_EXTENSIONS, i));
    ogl_es_extensins.insert(ext_name);
}

Обратите внимание, выможет попытаться прочитать буфер глубины ( NV_read_depth ) или буфер глубины и трафарета ( NV_read_depth_stencil );

...