Как написать вершинный и геометрический шейдеры для рисования финансовых свечных графических c сущностей? - PullRequest
0 голосов
/ 05 апреля 2020

Я начинаю с OpenGL и работаю над простым приложением для отображения графиков финансовых свечей.

Финансовые свечи представляют собой графическое представление цены акции за определенный период времени. В основном это бары с усиками, точки баров и усов определяются ценами Хай / Лоу и ценами открытия / закрытия.

candlestick

Данные, которые определяют свечу:

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 

Я хотел бы понять:

  1. Если этот подход имеет смысл и согласуется с тем, как обычно пишется OpenGL.
  2. Если приведенный выше код является правильным подходом для написания вершинного шейдера, который переводит данные в геометрию шейдер.
  3. Что должно быть изменено в шейдере Geometry, который явно ошибочно закодирован.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...