Я начинаю с OpenGL и работаю над простым приложением для отображения графиков финансовых свечей.
Финансовые свечи представляют собой графическое представление цены акции за определенный период времени. В основном это бары с усиками, точки баров и усов определяются ценами Хай / Лоу и ценами открытия / закрытия.
![candlestick](https://i.stack.imgur.com/Wkfuj.png)
Данные, которые определяют свечу:
open price
high price
low price
close price
volume
timestamp
Я хочу представить эту сущность как графическую сущность в OpenGL.
Поэтому я хочу использовать эти значения в качестве входных данных для моего конвейера OpenGL. Я думаю, что это можно сделать следующим образом: передать эти значения в шейдер Vertex с помощью шейдера Vertex, передавшего эти значения в геометрический шейдер, и использовать геометрический шейдер, который фактически преобразует это в OpenGL graphi c примитивы.
Вот код, который я использую для шейдера 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;
}
Затем я делаю это как шейдер Geometry, что явно неверно, так как я не знаю, как извлечь выходные данные из вершины Shader. На данный момент я просто пытаюсь нарисовать вертикальную линию от High до Low:
#version 330
layout (points) in;
layout (line_strip, max_vertices = 2) out;
void main() {
float x = gl_in[2] / 100.0;
float y1 = gl_in[0][1].gl_Position / 100.0;
float y2 = gl_in[0][2].gl_Position / 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: 12:1: '/' : wrong operand types no operation '/' exists that takes a left-hand operand of type 'varying highp block' and a right operand of type 'const float' (or there is no acceptable conversion)
ERROR: 12:1: '=' : cannot convert from 'varying highp block' to 'highp float'
ERROR: 13:1: 'expression' : left of '[' is not of type array, matrix, or vector
ERROR: 13:1: 'gl_Position' : field selection requires structure, vector, or matrix on left hand side
ERROR: 14:1: 'expression' : left of '[' is not of type array, matrix, or vector
ERROR: 14:1: 'gl_Position' : field selection requires structure, vector, or matrix on left hand side
Я хотел бы понять:
- Если этот подход имеет смысл и согласуется с тем, как обычно пишется OpenGL.
- Если приведенный выше код является правильным подходом для написания вершинного шейдера, который переводит данные в геометрию шейдер.
- Что должно быть изменено в шейдере Geometry, который явно ошибочно закодирован.