0

私はフラグメントシェーダーを持っています。それには構造体とそれらの構造体のユニフォームがあります。それらをコンパイルしようとすると、OpenGL で次のエラーが発生しました。

0(30) : error C0000: syntax error, unexpected identifier, expecting '{' at token "lights_a"
0(31) : error C0000: syntax error, unexpected identifier, expecting '{' at token "material"

ここで何が問題なのかわかりません。私は問題を探していました... 30行目と31行目を見て、想像できることはすべてやりましたが、成功しませんでした。

コードは次のとおりです。

#version 330 core
struct LightBase
{
    int renderit;

    vec4 ambient_light;
    vec4 specular_light;
    vec4 diffuse_light;

    float radius;

    vec3 light_position;
    vec3 light_direction;

    int light_type;
};

struct MaterialBase
{
    vec4 ambient_affect;
    vec4 specular_affect;
    vec4 diffuse_affect;
    float shining;

    float mirror;

    int light_affect;
};

in vec3 VertexPos;
in vec3 Normal;
uniform int light_quantity;
uniform LightBase lights_a[50];
uniform MaterialBase material;
uniform float usingTex;
uniform sampler2D texturemap;
in vec2 UVs;
in vec4 Colors;
out vec4 color;

void main() {

    vec4 texture_u = texture(texturemap,UVs).rgba * usingTex;
    vec4 color_u = Colors * (1.0f-usingTex);

    vec4 final_color = color_u+texture_u;
    // Light
    for(int i=0;i<light_quantity;i++) {
        if(lights_a[i].renderit==1) {
            if(lights_a[i].light_type==1) {

                float attenuation = max(0.0,1.0-dot(lights_a[i].light_direction,lights_a[i].light_direction));

                vec3 L = normalize(lights_a[i].light_direction);
                vec3 N = normalize(Normal);
                vec3 V = normalize(-VertexPos);
                vec3 R = normalize(-reflect(L,N));

                float nDotL = max(0.0,dot(N,L));
                float rDotV = max(0.0,dot(R,V));

                float ambient_result = lights_a[i].ambient_light * material.ambient_affect * attenuation;
                float diffuse_result = lights_a[i].diffuse_light * material.diffuse_affect * nDotL * attenuation;
                float specular_result = lights_a[i].specular_light * material.specular_affect * pow(rDotV,material.shining) * attenuation;

                vec4 this_colour = (ambient_result + diffuse_result + specular_result) * final_color;
                    final_color = this_colour;
            }
    }
    }


    color = final_color;
}

コードの何が問題になっていますか?

4

1 に答える 1

3

コードをコンパイルしてもエラーは表示されません。いくつかの警告のみです。

0(62) : error C7011: implicit cast from "vec4" to "float"
0(63) : error C7011: implicit cast from "vec4" to "float"
0(64) : error C7011: implicit cast from "vec4" to "float"

struct LightBaseandの宣言をコメント アウトすることで、表示されるエラーをほぼ再現できます-- 33 行目と 34 行目に表示されることをstruct MaterialBase除きます。lights_amaterial

これにより、あなたの問題は、自分が思っているプログラムを実際にコンパイルしていないことにあると私は信じています。ファイルからメモリに読み込んでいるのかもしれませんが、glShaderSource を呼び出す前に何らかの理由でメモリが壊れてしまいます...

于 2013-03-10T20:14:05.767 に答える