Сбой одновременных показаний SSBO во фрагментном шейдере - PullRequest
0 голосов
/ 11 ноября 2018

Основное редактирование:

У меня есть один шейдер, устанавливающий значения SSBO:

#version 430

//Input variables
in vec3 f_pos;
in vec3 f_norm;
in vec3 f_uv;

struct Voxel_Node
{
    vec4 color;
    vec4 normal;
    uint children[8];
};
//Buffer for the rest of the tree
layout(std430, binding = 0) buffer tree_buffer
{
    uint t_index;
    uint pad1;
    uint pad2;
    uint pad3;
    Voxel_Node tree[];
};

void main()
{
    tree[0].children[7] = 1;
    tree[1].children[0] = 2;
    tree[2].children[7] = 3;
    tree[3].children[0] = 4;
    tree[4].children[7] = 5;

    tree[0].normal = vec4(0,0,1,1);
    tree[1].normal = vec4(0,1,0,1);
    tree[2].normal = vec4(0,1,1,1);
    tree[3].normal = vec4(1,0,0,1);
    tree[4].normal = vec4(1,0,1,1);
    tree[5].normal = vec4(1,1,0,1);
}

И одно шейдерное чтение из SSBO:

#version 430
#pragma optimize (off)

in vec2 f_coord;

out vec4 fragment_color;

struct Voxel_Node
{
    vec4 color;
    vec4 normal;
    uint children[8];
};
//Buffer for the rest of the tree
layout(std430, binding = 0) buffer tree_buffer
{
    uint t_index;
    uint pad1;
    uint pad2;
    uint pad3;
    Voxel_Node tree[];
};


void main()
{
    fragment_color = vec4(tree[1].children[0]);
    int pls = int(tree[1].children[0]);
    //set 1
    fragment_color = vec4(pls);         //white
    //fragment_color = vec4(pls-1);     //white
    //fragment_color = vec4(pls-2);     //black
    //fragment_color = vec4(pls)/2.f;   //grey

    //Set 2
    fragment_color = tree[pls].normal;      //blue
    //fragment_color = tree[pls+2].normal;  //cyan
    //fragment_color = tree[2].normal;      //cyan
}

Есть 2 набора тестов. сначала закомментируйте блок tree[value].normal.

Так что цвет фрагмента зависит от значения пожалуйста. Только один из 2-х блоков может быть незакомментирован за раз и только одна строка в каждом блоке. Значения справа являются итоговым цветом теста.

Первый блок тестов пройден успешно, все это ожидаемые результаты. Для второго блока тестов первый вывод должен быть синим, а вывод secddn не должен быть голубым.

Согласно этим тестам значение pls равно 2 при чтении первым набором тестов и 0 при чтении вторым набором.

Нет другой логики, кроме попытки прочитать содержимое SSBO, что может вызвать такое поведение?

Edit:

Я думаю, это может быть связано с этим, но я не уверен:

https://www.khronos.org/opengl/wiki/Memory_Model#Incoherent_memory_access

Обновление:

Установка SSBO на постоянный размер «решила» проблему, однако я бы предпочел использовать ssbo различного размера.

coherent layout(std430, binding = 0) buffer tree_buffer
{
    uint t_index;
    uint pad1;
    uint pad2;
    uint pad3;
    Voxel_Node tree[8];
};

Изменение кода к приведенным выше результатам приводит к ожидаемому поведению

...