Как вы перемещаете переменные из вершинного шейдера в геометрический шейдер? - PullRequest
1 голос
/ 05 апреля 2020

У меня есть следующий шейдер Vertex:

#version 330

layout (location = 0) in ivec4 inOHLC;
layout (location = 1) in int inVolume;
layout (location = 2) in int inTimestamp;

out ivec4 outOHLC;
out int outVolume;
out int outTimestamp;

void main()
{
    outOHLC = inOHLC;
    outVolume= inVolume;
    outTimestamp = inTimestamp;
}

И я хочу получить outOHLC, outVolume и outTimestamp в шейдере Geometry. Я кодирую это:

#version 330

in ivec4 inOHLC;
in int inVolume;
in int inTimestamp;

layout (line_strip, max_vertices = 2) out;

void main() {  

    float x = (float)inTimestamp / 100.0;
    float y1 = (float)inOHLC[1] / 100.0;
    float y2 = (float)inOHLC[1] / 100.0;
    gl_Position = vec4(x, y1, 0.0, 0.0);
    EmitVertex();    
    gl_Position = vec4(x, y2, 0.0, 0.0);
    EmitVertex();    
    EndPrimitive();

}  

Но я получаю следующую ошибку:

run:
. . . vertex compilation success.
. . . geometry compilation failed.
Shader Info Log: 
ERROR: 7:1: 'inOHLC' : geometry shader input varying variable must be declared as an array
ERROR: 8:1: 'inVolume' : geometry shader input varying variable must be declared as an array
ERROR: 9:1: 'inTimestamp' : geometry shader input varying variable must be declared as an array
ERROR: 15:1: ')' : syntax error syntax error

После комментария @ Rabbid76 я изменил код следующим образом:

#version 330

in ivec4 ohlc[];
in int volume[];
in int timestamp[];

layout (line_strip, max_vertices = 2) out;

void main()
{

    float x = (float)timestamp / 100.0;
    float y1 = (float)ohlc[1] / 100.0;
    float y2 = (float)ohlc[2] / 100.0;
    gl_Position = vec4(x, y1, 0.0, 0.0);
    EmitVertex();    
    gl_Position = vec4(x, y2, 0.0, 0.0);
    EmitVertex();    
    EndPrimitive();

} 

И теперь я получаю только одну ошибку:

run:
. . . vertex compilation success.
. . . geometry compilation failed.
Shader Info Log: 
ERROR: 40:1: ')' : syntax error syntax error

Я предполагаю, что это связано либо с приведением (float) (оно существует даже в GLSL?), Либо с определениями переменных с плавающей точкой.

1 Ответ

2 голосов
/ 05 апреля 2020

Внимательно прочитайте сообщение:

Входная переменная геометрического шейдера должна быть объявлена ​​как массив

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

in ivec4 inOHLC[];
in int inVolume[];
in int inTimestamp[];

Кроме того, вы должны указать тип входного примитива для геометрического шейдера. например, для строки:

layout(lines​) in;

Тип примитива lines подразумевает, что геометрический шейдер получает 2 вершины (размер массива входов равен 2).


GLSL не имеет оператор приведения типа C. Если вы хотите преобразовать int в float, то вам нужно создать новый float. Перегруженный конструктор float принимает аргумент int:

float y1 = (float)ohlc[1] / 100.0;

float y1 = float(ohlc[1]) / 100.0;

Индексы начинаются с 0, а не с 1 (как в C, C ++, C#, Java, JavaScript, Python, ...):

float y1 = float(ohlc[0]) / 100.0;
float y2 = float(ohlc[1]) / 100.0;
...