【问题标题】:Vertex attribute data passed to geometry shader is not set properly传递给几何着色器的顶点属性数据未正确设置
【发布时间】:2014-02-03 06:32:11
【问题描述】:

代码如下:

顶点着色器:

#version 330

layout(std140) uniform;


layout(location = 6) in vec4 worldPosition;
layout(location = 7) in int FIndex;


flat out int[] passFIndex;


uniform Projection
{
    mat4 view;
    mat4 projection;
};

uniform mat3[6] FMatrix;
void main()
{
    gl_Position = worldPosition;
    passFIndex = int[](FIndex);
}

几何着色器:

#version 330

layout(std140) uniform;

layout(points) in;
layout(triangle_strip, max_vertices = 136) out;

flat in int[] passFIndex;

uniform Projection
{
    mat4 view;
    mat4 projection;
};

uniform mat3[6] FMatrix;

void main()
{

    vec3 newPos = FMatrix[passFIndex[0]] * vec3(-0.5f, -0.5f, 0.5f);
...

所以问题是,当我将 passFIndex 设置为仅由位置 7 处的顶点属性组成的数组时,它没有正确设置。问题是,它总是设置为 0。但是,我知道底层顶点FIndex 的数据不是 0,因为我可以使用不同的着色器程序(没有 GS 的程序)并且 FIndex 会适当变化。

我可以将“passFIndex = int [] (FIndex)”替换为“passFIndex = int [] (2)”或其中的一些其他常量,这样可以创建一个非零的数组,并且它索引正如几何着色器中所预期的那样。这似乎告诉我顶点着色器出了点问题,但我无法想象它是什么。

【问题讨论】:

    标签: opengl graphics glsl vertex-shader geometry-shader


    【解决方案1】:

    您在顶点着色器中输出数组的尝试令人费解。这应该会在您的 GLSL 程序中生成链接错误,因为顶点着色器和几何着色器之间的接口不匹配。

    几何着色器输入始终采用数组的形式,因为它们采用多个变换顶点来构造图元。然而,顶点着色器的输出通常不是一个数组。如果你想在顶点着色器中输出一个数组,你会创建一个几何着色器需要一个二维数组来匹配接口的情况——这是不支持的。

    GLSL 3.30 Specification - 4 个变量和类型 - 第 30 页

    对于顶点着色器和几何着色器之间的接口,顶点着色器输出变量和几何着色器输入变量必须在类型和限定上匹配,除了顶点着色器名称不能声明为数组,而几何着色器名称必须声明为数组。 否则会出现链接错误。

    如果顶点着色器的输出本身是几何着色器使用的数组,那么它必须出现在顶点着色器的输出块(见下面的接口块)和几何着色器的输入块中声明为数组的块实例名称。这是从顶点着色器输出的数组所必需的,因为不支持二维数组。


    我会考虑重写你的着色器:

    顶点着色器:

    #version 330
    
    layout(std140) uniform;
    
    
    layout(location = 6) in vec4 worldPosition;
    layout(location = 7) in int FIndex;
    
    
    flat out int passFIndex;
    
    
    uniform Projection
    {
        mat4 view;
        mat4 projection;
    };
    
    uniform mat3 FMatrix [6];
    
    void main()
    {
        gl_Position = worldPosition;
        passFIndex  = FIndex;
    }
    

    几何着色器:

    #version 330
    
    layout(std140) uniform;
    
    layout(points) in;
    layout(triangle_strip, max_vertices = 136) out;
    
    flat in int passFIndex [];
    
    uniform Projection
    {
        mat4 view;
        mat4 projection;
    };
    
    uniform mat3 FMatrix [6];
    
    void main()
    {
    
        vec3 newPos = FMatrix[passFIndex[0]] * vec3(-0.5f, -0.5f, 0.5f);
    ...
    

    【讨论】:

      猜你喜欢
      • 2015-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-27
      • 2021-09-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多