1

I have the following Vertex shader:

#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;
}

And I want to receive outOHLC, outVolume and outTimestamp in the Geometry shader. I code this:

#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();

}  

But I get the following error:

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

Following @Rabbid76 comment, I have modified the code as follows:

#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();

} 

And now I get just one error:

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

Which I guess is related to either the (float) cast (does that even exist in GLSL?) or the float variable definitions.

M.E.
  • 4,955
  • 4
  • 49
  • 128

1 Answers1

2

Read the message carefully:

geometry shader input varying variable must be declared as an array

The input to the Geometry shader is a primitives. That means all the outputs of the vertex shader which form a primitive are composed. Thus the inputs of the geometry shader are arrays:

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

Furthermore you have to specify the input primitive type to the geometry shader. e.g for a line:

layout(lines​) in;

The primitive type lines implies that the geometry shader receives 2 vertices (array size of inputs is 2).


GLSL does not have a cast operator like C. If you want to convert an int to float, then you have to construct an new float. The overloaded float constructor accepts an int argument:

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

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

Indices start at 0 not at 1 (like in C, C++, C#, Java, JavaScript, Python, ...):

float y1 = float(ohlc[0]) / 100.0;
float y2 = float(ohlc[1]) / 100.0;
Rabbid76
  • 202,892
  • 27
  • 131
  • 174
  • My objective is to build 6 lines out of 4 integer values (ohlc array variable). Can I just ignore that input and build them myself using the 4 integer points? Also see edit for an additional error. – M.E. Apr 05 '20 at 16:27
  • Removing the casts and constructing floats makes the shader compile. Thanks also for the tip on indexes, I was trying to use 2nd and 3rd index as an example. (I will use the four to build 6 lines later, first I want to see at least one line). – M.E. Apr 05 '20 at 16:34