Как использовать глубину текстуры с трафаретом, OpenGL ES 3.0

У меня есть приложение, в котором я хочу визуализировать глубину текстуры, используя маску трафарета. Я пытаюсь GL_DEPTH_STENCIL_OES:

Создание текстуры:

glGenFramebuffers(1, fbo);
glBindFramebuffer(GL_FRAMEBUFFER, *fbo);

glGenTextures(1, depthTexture);
glBindTexture(GL_TEXTURE_2D, *depthTexture);
// using combined format: depth + stencil
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_STENCIL_OES, w, h, 0, GL_DEPTH_STENCIL_OES, GL_UNSIGNED_INT_24_8_OES, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);

// attaching both depth and stencil
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, *depthTexture, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, *depthTexture, 0);

// No color output in the bound framebuffer, only depth.
GLenum drawbuffers[] = { GL_NONE };
glDrawBuffers(1, drawbuffers);

GL_CHECK(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE);

Создание трафаретной маски для карты теней:

// bind to depth fbo
glBindFramebuffer(GL_FRAMEBUFFER, *fbo);

glEnable(GL_STENCIL_TEST);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
glClear(GL_STENCIL_BUFFER_BIT);

// write to stencil when objects are rendered
glStencilFunc(GL_ALWAYS, 1, 0xFF);
glStencilMask(0xFF);

drawVisibleObjects();

Рендеринг глубины с помощью трафаретной маски:

glBindFramebuffer(GL_FRAMEBUFFER, *fbo);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glEnable(GL_STENCIL_TEST);
glStencilFunc(GL_EQUAL, 1, 0xFF); // Pass test if stencil value is 1
glStencilMask(0x00); // Don't write anything to stencil buffer
glDepthMask(GL_TRUE); // Write to depth buffer

drawObjects();

Когда код выполняется, экран черный. Это неожиданно, потому что я рендерирую глубину не в кадровый буфер по умолчанию, а в текстуру. Так как значения трафарета хранятся в текстуре, нужно ли использовать их по-другому?

Как правильно использовать трафаретное вложение, когда используется комбинированная глубина-трафаретная текстура GL_DEPTH_STENCIL_OES?

1 ответ

Значение шаблона является свойством кадрового буфера, в который вы рендерите. Если вы хотите использовать маску трафарета в FBO0, вам нужно запросить трафарет в FBO0 (и заполнить маску и т. Д. При рендеринге в FBO0).

Другие вопросы по тегам