LINUX.ORG.RU

Создается ли ссылка в OpenGL от программы на ssbo-буфер?

 


0

2

есть такой код:

bool   Model::bindBuffers(QOpenGLShaderProgram *p) {
    GLuint index;
    GLuint binding = 0;
    const char * names[]= {
        "matrices",
        "vertices",
        "rastbuf",
        0  
    };
    GLuint buffers[] = {
        mMeshMatrixBuffer,
        mMeshVertexBuffer,
        mRasterBuffer
    };
    for(int j = 0; names[j]; ++j) {
        index = gl->glGetProgramResourceIndex(
                    p->programId(),
                    GL_SHADER_STORAGE_BLOCK,
                    names[j]);
        if (index == GL_INVALID_INDEX) 
            continue;
        
        gl->glBindBufferBase(GL_SHADER_STORAGE_BUFFER,
                             binding, buffers[j]);
        gl->glShaderStorageBlockBinding(p->programId(),
                                        index, binding);
        checkGLError(gl, "Model::bindBuffers");
        ++binding;
    }  
    return true;
}
он пытается присобачить к шейдеру все необходимые буфера по списку если шейдер в них нуждается. проблема в том, что шейдера находятся в классе view, а буфера в классе model. моделька может быть закрыта и потребуется освободить буфера, но на них ссылается шейдер который их использовал когда-то. и тут оказывается, что отцепить буфер от шейдера невозможно или я неправ?

или я ошибаюсь, думая что шейдер ссылается на буфер а на самом деле он ссылается на индекс который ссылается на буфер?

линукс тут при том, что редактор воксельных моделек разрабатывается под линуксом.

В opengl никакого сбора мусора с подсчетом ссылок нет. Ну и буфер и шейдер - ортогональные понятия. Шейдер может читать и писать буфер, привязанный в данный момент к какому то активному индексу, но никакого отношения владения между ними быть не может

CatsCantFly
()

моделька может быть закрыта и потребуется освободить буфера

Если моделька закрыта и буфер вершин/треугольников/индексов/чегоугодно освобождён то ты ЭТО на отрисовку не посылаешь и всё.

но на них ссылается шейдер

Шейдер не ссылается ни на что если модель выгружена то ты шейдер не вызываешь. В шейдере ты просто BindBuffer делаешь вот и всё, а после отрисовки BindBuffer(0);

Делается всё так, сначала устанавливается шейдер затем юниформы, затем бинд буффера затем атрибуты вершин затем вызываешь drawчётотам затем bindbuffer(0); Если у тебя есть модель которой нет ты её не рисуешь это же очевидно, добавь себе в класс фигас bool can_renderable и при отрисовке проверяй если модель выгружена то устанавливаешь в false рендер твой это видит и ничего не делает.

anonymous
()

И вообще, ты видимо сразу биндишь всё и вся и потом рисуешь, не надо так, каждый кадр вноси в рендер свой всё по новой что-бы к концу кадра у тебя у рендера НИЧЕГО НЕБЫЛО. Пусть будет массив который ты каждый кадр заполняешь указателями на структуры моделек, рендер из берёт рисует (если они can_renderable) и удаляет из массива и так каждый кадр. Если вместо модели заглушка так как она была выгружена то ты просто не передаёшь в это массив указатель на модельку. Это стоит копейки, а так ты себе ад устроишь если всё и вся заранее будет и при это что-то там выгружется и загружается само по себе бесконтрольно

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