4

非常に単純なパススルージオメトリシェーダーを作成しました。私の入力プリミティブはポイントであり、出力プリミティブもポイントです。また、カラーと法線を頂点シェーダーからジオメトリシェーダーを介してフラグメントシェーダーに転送したいと思います。シェーダーは完璧にコンパイルおよびリンクされていますが、最終的な色は非常に奇妙です。この転送には何か問題があると思います。誰かが問題を指摘できますか?これが私のシェーダーです:

バーテックスシェーダー:

#version 330 compatibility

struct vData
{
    vec3 normal;
    vec4 color;
};

out vData vertex;

void main()
{
    vertex.normal = gl_NormalMatrix * gl_Normal;
    vertex.color = gl_Color;
    gl_Position = ftransform();
}

ジオメトリシェーダー:

#version 330

layout (points) in;
layout (points) out;
layout (max_vertices = 1) out;

struct vData
{
    vec3 normal;
    vec4 color;
};

in vData vertices[];
out vData frag;


void main()
{
    int i;
    for(i = 0;i < gl_in.length();i++)
    {
        frag.normal = vertices[i].normal;
        frag.color = vertices[i].color;
        gl_Position = gl_in[i].gl_Position;
        EmitVertex();
    }
    EndPrimitive();
}

フラグメントシェーダー:

#version 330

struct vData
{
    vec3 normal;
    vec4 color;
};

in vData frag;

void main()
{
    gl_FragColor = frag.color;
}
4

1 に答える 1

17

私はこれを理解しました!in / out変数は同じ名前である必要があります。つまりvertices[]、ジオメトリシェーダーでは。である必要がありますvertex[]。それでおしまい!

私の洗練された動作するコードは次のようになります。

バーテックスシェーダー:

#version 330 compatibility

out vData
{
    vec3 normal;
    vec4 color;
}vertex;

void main()
{
    vertex.normal = normalize(gl_NormalMatrix * gl_Normal);
    vertex.color = gl_Color;
    gl_Position = ftransform();
}

ジオメトリシェーダー:

#version 330

layout (points) in;
layout (points) out;
layout (max_vertices = 1) out;

in vData
{
    vec3 normal;
    vec4 color;
}vertices[];

out fData
{
    vec3 normal;
    vec4 color;
}frag;    

void main()
{
    int i;
    for(i = 0;i < gl_in.length();i++)// gl_in.length() = 1 though!
    {
        frag.normal = vertices[i].normal;
        frag.color = vertices[i].color;
        gl_Position = gl_in[i].gl_Position;
        EmitVertex();
    }
    EndPrimitive();
}

フラグメントシェーダー:

#version 330 compatibility

in fData
{
    vec3 normal;
    vec4 color;
};

void main()
{
    gl_FragColor = frag.color;
}

ハッピーコーディング!

于 2013-02-18T04:28:24.880 に答える