1

GLSL シェーダーに問題があります。フラグメント シェーダー部分をコンパイルしようとすると、次のエラーが発生します。

0:24: error(#181) Cannot be used with a structure: out
error(#273) 1 compilation errors. No code generated

したがって、問題は out 変数の周りにあると思います。ここに私のフラグメントシェーダーがあります:

#version 410

uniform mat4 gWVP;
uniform mat4 gWorld;

uniform sampler2D gColorMap;                

in VSOutput
{
    vec3 WorldSpacePos;
    vec2 TexCoord;
    vec3 Normal;  
} FSin;


struct FSOutput
{                   
    vec3 WorldSpacePos;    
    vec3 Diffuse;     
    vec3 Normal;      
    vec3 TexCoord;
};

out FSOutput FSOut;

void main()
{                                           
    FSOut.WorldSpacePos = FSin.WorldSpacePos;                   
    FSOut.Diffuse      = texture(gColorMap, FSin.TexCoord).xyz; 
    FSOut.Normal       = normalize(FSin.Normal);                    
    FSOut.TexCoord     = vec3(FSin.TexCoord, 0.0);              
}

私が知っているように、OpenGL 4.0+で構造体を出力できるはずですよね? だから私はエラーを取得しません、それはドライバーの問題ですか、それともそのようなものですか?13.4 ドライバを搭載した Radeon HD 6950 で実行しています。

4

1 に答える 1

6

私が知っているように、OpenGL 4.0+で構造体を出力できるはずですよね?

いいえ、そうすべきではありません。

GLSL 仕様はこれについて非常に明確です。頂点シェーダーの入力とフラグメント シェーダーの出力は構造体にすることはできません。GLSL 4.4 仕様のセクション 4.3.6 から:

フラグメント出力は、float、単精度浮動小数点ベクトル、符号付きまたは符号なしの整数または整数ベクトル、またはこれらの配列のみにすることができます。倍精度型、行列、または構造体を出力として宣言すると、コンパイル時エラーになります。

ご参考までに、それらはinterface blocksに集約することもできません。それらは緩やかな変数でなければなりません。

于 2013-08-31T23:49:16.413 に答える