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);
...

問題は、位置 7 の頂点属性だけで構成される配列と等しくなるように設定すると、passFIndex が適切に設定されないことです。問題は、常に 0 に設定されることです。ただし、FIndex の基礎となる頂点データはわかっています。別のシェーダー プログラム (GS のないプログラム) を使用でき、FIndex は適切に変化するため、0 ではありません。

「passFIndex = int [ ] (FIndex)」を「passFIndex = int [ ] (2)」またはその他の定数に置き換えることができます。これは、ゼロ以外の配列を作成するために機能し、期待どおりにインデックスを付けますジオメトリ シェーダー。これは、頂点シェーダーで何か問題が発生していることを示しているようですが、それが何であるか想像できません。

4

1 に答える 1

4

頂点シェーダーで配列を出力しようとする試みは不可解です。これにより、頂点シェーダーとジオメトリ シェーダーの間のインターフェイスが一致しないため、GLSL プログラムでリンク エラーが発生するはずです。

ジオメトリ シェーダーの入力は、変換された複数の頂点を使用してプリミティブを構築するため、常に配列の形式になります。ただし、頂点シェーダーの出力は通常、配列ではありません。頂点シェーダーで配列を出力したい場合、ジオメトリ シェーダーがインターフェイスに一致する 2D 配列を必要とする状況が発生します。これはサポートされていません。

GLSL 3.30 仕様- 4 つの変数と型- pp. 30

頂点シェーダーとジオメトリ シェーダー間のインターフェイスでは、頂点シェーダーの出力変数と同じ名前のジオメトリ シェーダーの入力変数は、型と修飾が一致している必要があります。配列として宣言します。そうしないと、リンクエラーが発生します。

頂点シェーダーの出力自体がジオメトリ シェーダーによって消費される配列である場合、頂点シェーダーの出力ブロック (以下のインターフェイス ブロックを参照) と、ブロック インスタンスを含むジオメトリ シェーダーの入力ブロックに表示される必要があります。配列として宣言された名前。これは、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 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 に答える