2013-03-10 133 views
0

我有一個片段着色器,它有結構和統一的結構。當我試圖編譯它們時,OpenGL給了我這個錯誤:編譯着色器時GLSL奇怪的錯誤(結構)

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; 
} 

什麼是錯的代碼?

+0

什麼是31行? – 2013-03-10 21:48:29

回答

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 LightBasestruct MaterialBase聲明查看錯誤 - 除非它們出現在第33行和第34行,這些行是帶有標記的行lights_amaterial

這使我相信你的問題是你並沒有真正編譯你認爲你的程序。也許你正在從一個文件讀取到內存中,但在調用glShaderSource之前內存會受到某種損壞...

+0

我將檢查位於內存中的數據(它是一個const char *)。 – Spamdark 2013-03-10 22:22:06

+0

數據沒有問題,結構也沒有評論....這不應該發生,這很奇怪... – Spamdark 2013-03-10 22:27:49

+0

是的,我發現了錯誤......其實數據被破壞了......看起來沒錯,但事實並非如此。 – Spamdark 2013-03-10 22:36:29