GLSL试图将数据传递到几何设计着色器时

发布于 2025-02-08 09:03:59 字数 2455 浏览 1 评论 0原文

我有一个顶点着色器,可以在适当的位置,纹理坐标,正态和一些制服:

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

我经过我的几何形状着色器:

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

但是我遇到了错误:

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

我会在传递给几何ry的顶点着色器中的每个变量中得到这些错误着色器。

该着色器以无几何着色器形式的形式起作用,并且应该设置为当前什么都不做,那么我做错了什么?

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?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

巨坚强 2025-02-15 09:03:59

即使下一个阶段为a getemetry shinder a>。 vertex shader 处理一个单个顶点,因此,输出始终是单一的值那个顶点。几何着色器的输入界面是一个数组,因为几何着色器将原始(多个顶点)作为输入而不是单个顶点。在顶点着色器中删除[]

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

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 []
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文