Могу ли я использовать массив из 6 целых чисел из вершинного шейдера в геометрический шейдер?

Я пытаюсь сгенерировать примитивы OpenGL из 6 целочисленных вершин. т.е. 6 целочисленных значений будут генерировать 4 пользовательских line_strip.

Сначала я пытаюсь переместить массив из 6 целых чисел из Vertex в Shader, и для этого я выполняю простой тест следующим образом.

Это код вершинного шейдера:

#version 330

layout (location = 0) in int inVertex[6];
out int outVertex[6];

void main()
{
    outVertex = inVertex;
}

И для шейдера геометрии, который жестко кодирует сегмент:

#version 330

in int vertex[6];
layout (line_strip, max_vertices = 2) out;

void main()
{

    gl_Position = vec4(-0.2, -0.2, 0.0, 1.0); 
    EmitVertex();    
    gl_Position = vec4(-0.2 +0.4, -0.2, 0.0, 1.0); 
    EmitVertex();    
    EndPrimitive();

}

Но у меня пустой экран.

введите здесь описание изображения

Если я изменю шейдер Vertex на это:

#version 330

layout (location = 0) in int inVertex[6];
out int outVertex[6];

void main()
{   
    //outVertex = inVertex;
    gl_Position = vec4(0.0, 0.0, 0.0, 0.0);
}

и шейдер геометрии к этому:

#version 330

//in int candle[6];
layout (points) in;
layout (line_strip, max_vertices = 2) out;

void main()
{

    gl_Position = vec4(-0.2, -0.2, 0.0, 1.0); 
    EmitVertex();    
    gl_Position = vec4(-0.2 +0.4, -0.2, 0.0, 1.0); 
    EmitVertex();    
    EndPrimitive();

}

Затем я получаю сегмент на экране:

введите здесь описание изображения

Обязательно ли использовать gl_Position? Если да, то как я могу передать дополнительные переменные вместе с gl_Position, чтобы обогатить мою вершину?


person M.E.    schedule 06.04.2020    source источник
comment
Что это за 6 целых чисел? Как указать массив общих данных атрибутов вершин? Что такое примитивный тип?   -  person Rabbid76    schedule 06.04.2020
comment
@ Rabbid76 Целое число 6 представляет: цену открытия, цену закрытия, максимальную цену, низкую цену, объем и отметку времени. Это обычное представление для финансового фондового рынка. Из этого вы строите графическое представление, которое подразумевает прямоугольник и два уса. Я пытаюсь, чтобы GPU обрабатывал данные. en.wikipedia.org/wiki/Candlestick_chart Поэтому я пытаюсь заставить геометрический шейдер построить графические примитивы (отрезки линий)   -  person M.E.    schedule 06.04.2020
comment
@M.E.: Сколько у вас данных? Если это не буквально миллионы значений, вероятно, было бы лучше обработать их на ЦП в правильные данные вершин и просто отправить их. Особенно, если эти данные необходимо регулярно обновлять, поскольку вам все равно придется передавать данные на графический процессор.   -  person Nicol Bolas    schedule 06.04.2020
comment
У меня есть сотни тысяч значений, может быть несколько миллионов. Данные не нуждаются в регулярном обновлении, поэтому я пытаюсь передать эту часть обработки в GPU. Я вижу, что современные графические процессоры имеют сотни ядер.   -  person M.E.    schedule 06.04.2020
comment
Эта ссылка khronos.org/opengl/wiki/Vertex_Specification помогает мне многое понять как вершины обрабатываются шейдерами. Например, я не знал, что если я отправлю целочисленный буфер в вершинный шейдер, он как будто по умолчанию преобразуется в плавающий.   -  person M.E.    schedule 06.04.2020


Ответы (2)


Вершинные шейдеры работают с вершинами (как ни странно). Они имеют соответствие 1:1 с данными вершин: для каждой вершины в операции рендеринга вы получаете одну выходную вершину.

Геометрические шейдеры работают с примитивами. Они имеют отношения 1:many со своими входными примитивами. GS получает один примитив и выводит 0 или более примитивов с различными ограничениями.

Примитив состоит из одной или нескольких вершин. Таким образом, GS должен иметь возможность получать несколько фрагментов входных данных, сгенерированных VS, которые выполняются для создания примитива, который обрабатывает GS. Таким образом, все входные данные GS упорядочены. То есть для любого типа T, который выводит VS, GS принимает T[] (или эквивалент). Это верно, даже если тип входного примитива вашего GS — points.

Итак, если VS имеет это как выход out int outVertex[6];, то соответствующий GS должен быть in int outVertex[][6];. Обратите внимание, что индексы массивов массивов читаются слева направо, так что это массив элементов с примитивным счетом, где каждый элемент представляет собой массив из 6 ints. Также обратите внимание, что имена должны совпадать. Вы должны были получить ошибку компоновщика из-за несоответствия имени.

В качестве альтернативы вы можете использовать интерфейсный блок, чтобы немного упростить упорядочение:

//VS:
out Prim
{
    int data[6];
};

//GS:
in Prim
{
    int data[6];
} vsData[];

//Access with vsData[primIx].data[X];
person Nicol Bolas    schedule 06.04.2020

Вершинный шейдер выполняется для каждой вершины, поэтому входные и выходные данные не являются массивами, а являются одним атрибутом:

#version 330

layout (location = 0) in vec3 inVertex;
out vec3 vertex;

void main()
{
    vertex = inVertex;
}

Входные данные для геометрического шейдера являются примитивными. Все выходные данные вершинного шейдера, формирующие примитив, составляются. Таким образом, входными данными геометрического шейдера являются массивы.
Размер входного массива зависит от введите тип примитива в шейдер геометрии. например, для строки размер входного массива равен 2:

#version 330

layout (lines) in;
layout (line_strip, max_vertices = 4) out;

in vec3 vertex[];

void main()
{
    // [...]
}
person Rabbid76    schedule 06.04.2020
comment
Насколько я знаю, вершина — это набор данных, который может быть чем угодно. Я пытаюсь ввести 6 целых чисел в графический процессор и получить 6 строк после базового вычисления этих целых чисел. Я не знаю, как мне перенести лишние данные из вершины в геометрию. Это вообще возможно? - person M.E.; 06.04.2020
comment
ссылка, которую я предоставил в комментарии к предыдущему вопросу, содержит ссылки на вершинный шейдер и геометрический шейдер примеры, которые делают именно то, что вы хотите (Я думаю). Найдите VS_OUT. - person G.M.; 06.04.2020
comment
Спасибо за ваше терпение и помощь @G.M. После повторного чтения ссылки я попробую еще раз с VS_OUT. - person M.E.; 06.04.2020