Войти
ПрограммированиеФорумГрафика

OpenGL Вопросы (27 стр)

Страницы: 124 25 26 27 28 29 Следующая »
#390
23:55, 4 апр. 2018

}:+()___ [Smile]
Не знаю точно как в OpenGL происходит обновление кусочка буфера, потому что этой информации не находил нигде.
Но в DX11 есть аналогичная по функционалу штука, UpdateSubresource. Вот для неё есть хорошее описание как она работает:
https://msdn.microsoft.com/en-us/library/windows/desktop/ff476486(v=vs.85).aspx

* When there is contention for the resource, UpdateSubresource will perform 2 copies of the source data. First, the data is copied by the CPU to a temporary storage space accessible by the command buffer. This copy happens before the method returns. A second copy is then performed by the GPU to copy the source data into non-mappable memory. This second copy happens asynchronously because it is executed by GPU when the command buffer is flushed.
  • When there is no resource contention, the behavior of UpdateSubresource is dependent on which is faster (from the CPU's perspective): copying the data to the command buffer and then having a second copy execute when the command buffer is flushed, or having the CPU copy the data to the final resource location. This is dependent on the architecture of the underlying system.

  • То есть в любом случае оно делает себе локальную копию региона. Подозреваю что в OGL оно +- так же работает.
    #391
    0:14, 5 апр. 2018

    MrShoor
    Очень похоже на staging buffer, так делается в вулкане, только все вручную.

    #392
    7:04, 5 апр. 2018

    }:+()___ [Smile]
    Они реализованы по разному. Потому что если я укажу subData размер буфера, превышающий аллоцированый - у меня с определенным шансом сломаются данные в другом буфере. По крайней мере сталкивался с чем-то подобным.

    Прошло более 1 года
    #393
    (Правка: 3:36) 3:23, 24 окт. 2019

    Смотрю примеры использования SSBO и уже в конец запутался.
    Создал буфер, заполнил данными, далее перед отрисовкой вызываю glBindBufferBase(GL_SHADER_STORAGE_BUFFER, binding, buffer_id), который привязывает буфер к нужному интерфейс-блоку посредством layout(binding=N, std430).
    Запустил — работает.

    Зачем тогда нужна связка команд glGetProgramResourceIndex + glShaderStorageBlockBinding?
    Пример от steps3d:

    GLuint index = glGetProgramResourceIndex ( program, GL_SHADER_STORAGE_BLOCK, "FragInfo" );
    glShaderStorageBlockBinding ( program, index, 2 );
    отсюда: http://steps3d.narod.ru/tutorials/ssbo-tutorial.html
    Всё равно надо указывать binding, тогда какая польза от этого варианта?

    Вот ещё туториал с тем же самым: https://www.geeks3d.com/20140704/tutorial-introduction-to-opengl-… ts-ssbo-demo/

    Правильно ли я понимаю, что это DSA bindless альтернатива?

    #394
    3:56, 24 окт. 2019

    Джек Аллигатор
    > Зачем тогда нужна связка команд glGetProgramResourceIndex +
    > glShaderStorageBlockBinding?
    если ты хочешь сам указать binding, а не брать его из шейдера.

    #395
    6:48, 24 окт. 2019

    Suslik, спасибо!

    Ещё вопрос.
    Создаю текстуру, беру хендл, делаю её резидентной, кидаю хендл в SSBO.
    Как правильно объявить это в шейдере?

    Попробовал так:

    layout (std430, binding = 2) buffer ColorSSBO {
        sampler2D bindless_tex[];
    };
    
    // ...
    
    frag_color = texture2d(bindless_tex[0], tex_coord);
    Выдаёт ошибку: uniform/buffer in non-default interface block contains opaque variable.

    И так:

    layout (std430, binding = 2) buffer ColorSSBO {
        uvec2 bindless_tex[];
    };
    
    // ...
    
    frag_color = texture2d(sampler2D(bindless_tex[0]), tex_coord);
    Выдаёт ошибку: cannot construct opaque type `sampler2D'.

    #396
    (Правка: 8:16) 8:15, 24 окт. 2019

    Джек Аллигатор
    1) нужно #extension GL_ARB_bindless_texture : require
    2) сделай константный размер у bindless_tex
    3) нужна поддержка железа

    #397
    (Правка: 12:42) 12:13, 24 окт. 2019

    vindast, спасибо!
    Помогло добавление "#extension GL_ARB_bindless_texture : require".
    "#version 450 core" само по себе не работает, оно ж не в ядре.

    UPD: не, нифига. Оно теперь вообще вылетать стало =\
    А железо точно поддерживает.

    #398
    (Правка: 18:59) 18:16, 24 окт. 2019

    Джек Аллигатор
    Проверь заливку/содержимое ssbo
    Проверь является ли текстура резидентной

    #399
    (Правка: 21:09) 21:07, 24 окт. 2019

    0xc0de
    > Проверь заливку/содержимое ssbo
    Если заливать в ssbo не хэндл, а просто vec4 с каким-нибудь цветом, а затем во фрагментном шейдере вывести этот цвет, то работает.

    > Проверь является ли текстура резидентной
    Является.
    Код:

    println!("is_resident {:?}", glIsTextureHandleResident(handle));
    glMakeTextureHandleResident(handle);
    println!("is_resident {:?}", glIsTextureHandleResident(handle));

    Результат:

    is_resident false
    is_resident true

    Вылетает на команде glCreateShaderProgramv (это ARB_separate_shader_objects).
    Вылет происходит если в коде есть чтение из этой текстуры:

    + фрагментный шейдер

    Сейчас проверял на винде — поведение точно такое же как на линуксе. Надеялся что там хотя бы ошибка компиляции или линковки будет, но тоже просто вылетает без ошибки.

    #400
    (Правка: 22:02) 21:50, 24 окт. 2019

    Джек Аллигатор
    Попробуй ssbo определить также в вершинном шейдере и продублировать в нем
    #extension GL_ARB_bindless_texture : require

    #401
    22:04, 24 окт. 2019

    Джек Аллигатор
    > Вылетает на команде glCreateShaderProgramv

    Даже так. Может в дровах дело? Покажи еще код, где ты вызываешь glcreateshaderprogram

    #402
    22:13, 24 окт. 2019

    0xc0de
    > Может в дровах дело?
    Сначала тоже так подумал, но как говорил выше — результат абсолютно одинаковый что на винде, что на линуксе.

    > Покажи еще код, где ты вызываешь glcreateshaderprogram
    У меня там враппер, но условно как-то так получается:
    1. glCreateProgramPipelines — создаём конвейер.
    2. цикл из glCreateShaderProgramv + glUseProgramStages для каждого шейдера.
    Кароче ничего сверхестественного.

    Сейчас попробую классическими шейдерами, без ARB_separate_shader_objects, посмотрим на какой конкретно операции оно крашится.

    #403
    22:24, 24 окт. 2019

    Для separate shaders  вроде как нужно четко определять локейшен для , а у тебя: in vec2 tex_coord;

    #404
    (Правка: 22:43) 22:33, 24 окт. 2019

    0xc0de, верно. Тем не менее, это работает, а семплинг из bindless текстуры не работает.
    Переписал без ARB_separate_shader_objects, вылетает без ошибки на glCompileShader (Segmentation fault).

    Страницы: 124 25 26 27 28 29 Следующая »
    ПрограммированиеФорумГрафика