LINUX.ORG.RU

Отчистка буфера глубины по трафарету

 


0

3

Задача такая: трафарет opengl содержит значения 0 и 1. Для всех нулевых значений трафарета надо сбросить буфер глубины (присвоить ему значение 1). Аппаратного способа сделать это я не нашел. Попробовал в лоб cделать это программно:

    static GLfloat *zbuffer = new GLfloat[1024*768];
    glReadPixels(0, 0, 1024, 768, GL_DEPTH_COMPONENT, GL_FLOAT, zbuffer);
    static GLfloat *sbuffer = new GLfloat[1024*768];
    glReadPixels(0, 0, 1024, 768, GL_STENCIL_INDEX, GL_FLOAT, sbuffer);
    for (int i = 0; i < 1024*768; i++) {
        if (sbuffer[i] < 1.0f)
            zbuffer[i] = 1.0f;
    }
    glDepthFunc(GL_GREATER);
    glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
    glDrawPixels(1024, 768, GL_DEPTH_COMPONENT, GL_FLOAT, zbuffer);
    glDepthFunc(GL_LESS);
Но этот вариант слишком сильно грузит проц. Может всё таки есть способ ускорить эту операцию?

может быть чуть быстрее..

GLFloat *s,*z;
for(s=sbuffer,z=zbuffer;s!=sbuffer+1024*768;s++,z++)
   if (!(int)(*s)) *z=1.0f;
а может и нет :-)

MKuznetsov ★★★★★
()

Но этот вариант слишком сильно грузит проц. Может всё таки есть способ ускорить эту операцию?

да,использовать современные решения: а именно, заюзать FBO, отрисовать в текстуру и следующим пассом в шейдере сбросить буфер глубины

x4DA ★★★★★
()

может быть чуть быстрее..

Там не в цикле дело. 99% тормозов из-за glReadPixels/glDrawPixels.

да,использовать современные решения: а именно, заюзать FBO, отрисовать в текстуру и следующим пассом в шейдере сбросить буфер глубины

Я пока с Framebuffer Object не работал. Но попробую копнуть в эту сторону.

akinator ★★
() автор топика
Ответ на: комментарий от x4DA

отрисовать в текстуру

Да и FBO получается не нужно, если исходные данные в памяти sbuffer. Просто копировать sbuffer в текстуру через glTexImage или через buffer object. Дальше дело за шейдером.

Dendy ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.