will martin
will martin

Reputation: 81

GLSL Error when trying to pass data to geometry shader

I have a vertex shader that takes in position, texture coordinates, normals and some uniforms:

#version 330 core

layout(location = 0) in vec4 position;
layout(location = 1) in vec2 texCoord;
layout(location = 2) in vec3 normal;

//MVP
uniform mat4 u_Model;
uniform mat4 u_View;
uniform mat4 u_Proj;

//Lighting
uniform mat4 u_InvTranspModel;
uniform mat4 u_LightMVP;

out DATA
{
    vec2 v_TexCoord;
    vec3 v_Normal;
    vec3 v_FragPos;
    vec4 v_LightSpacePos;
    mat4 v_Proj;
} data_out[];

void main()
{   
    gl_Position = u_Model * position;
    data_out.v_TexCoord = texCoord;
    data_out.v_Normal = mat3(u_InvTranspModel) * normal;
    data_out.v_Proj = u_Proj * u_View * u_Model;

    //Light
    data_out.v_FragPos = vec3(u_Model*position);
    data_out.v_LightSpacePos = u_LightMVP * position;
}

I'm passing into my geometry shader:

#version 330 core

layout(triangles) in;
layout(triangle_strip, max_vertices = 3) out;

in DATA
{
    vec2 v_TexCoord;
    vec3 v_Normal;
    vec3 v_FragPos;
    vec4 v_LightSpacePos;
    mat4 v_Proj;
} data_in[];

out vec2 g_TexCoord;
out vec3 g_Normal;
out vec3 g_FragPos;
out vec4 g_LightSpacePos;

void main()
{ 
    gl_Position = data_in[0].v_Proj * gl_in[0].gl_Position;
    g_Normal = data_in[0].v_Normal;
    g_FragPos = data_in[0].v_FragPos;
    g_TexCoord = data_in[0].v_TexCoord;
    g_LightSpacePos = data_in[0].v_LightSpacePos;
    EmitVertex();

    gl_Position = data_in[1].v_Proj * gl_in[1].gl_Position;
    g_Normal = data_in[1].v_Normal;
    g_FragPos = data_in[1].v_FragPos;
    g_TexCoord = data_in[1].v_TexCoord;
    g_LightSpacePos = data_in[1].v_LightSpacePos;
    EmitVertex();

    gl_Position = data_in[2].v_Proj * gl_in[2].gl_Position;
    g_Normal = data_in[2].v_Normal;
    g_FragPos = data_in[2].v_FragPos;
    g_TexCoord = data_in[2].v_TexCoord;
    g_LightSpacePos = data_in[2].v_LightSpacePos;
    EmitVertex();

    EndPrimitive();
}

However I get the errors:

ERROR: 0:28: '.' : dot operator to an array only takes length()
ERROR: 0:28: 'assign' :  cannot convert from 'attribute 2-component vector of highp        float' to 'varying unknown-sized array of highp block'
ERROR: 0:29: '.' : dot operator to an array only takes length()
ERROR: 0:29: 'assign' :  cannot convert from '3-component vector of highp float' to 'varying unknown-sized array of highp block'
................ Etc

I get these errors for every variable in the vertex shader that is passed to the geometry shader.

This shader works when its in a form without geometry shader, and should be setup currently to do nothing, so what have I done wrong?

Upvotes: 1

Views: 224

Answers (1)

Rabbid76
Rabbid76

Reputation: 211230

The output of the vertex shader is not an array, even if the next stage is a Geometry shader. The Vertex shader processes a single vertex, and therefore the outputs are always single values related to that vertex. The geometry shader's input interface is an array because the geometry shader takes a primitive (multiple vertices) as input rather than a single vertex. Remove [] in the vertex shader:

out DATA
{
    vec2 v_TexCoord;
    vec3 v_Normal;
    vec3 v_FragPos;
    vec4 v_LightSpacePos;
    mat4 v_Proj;
} data_out;           // <--- remove []

Upvotes: 1

Related Questions