2

这是代码:

顶点着色器:

#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)”或其中的一些其他常量,这样可以创建一个非零的数组,并且它的索引符合预期几何着色器。这似乎告诉我顶点着色器出了点问题,但我无法想象它是什么。

4

1 回答 1

4

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

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

GLSL 3.30 规范- 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);
...
于 2014-02-03T17:40:05.107 回答