2016-03-19 14 views
0

glDisableVertexAttribArrayが私の解決策で動作する非常に奇妙な現象が発生していますが、Perforceリポジトリからソリューションを取得したときに実行されず、glDisableVertexAttribArrayは1つのVisual Studioソリューションで動作しますが、別のものでは動作しません

私はこのforum questionをチェックアウトしましたが、残念ながら、私の問題は解決しませんでした。これは私が取り組んでいるシャドーマッピングのためのもので、深度バッファに物を描画して頂点属性を無効にしようとするとエラーになります。ここで

は私のコードがレイアウトされている方法は次のとおりです。プログラムで

#version 430 core 

uniform mat4 u_projection; 
uniform mat4 u_view; 
uniform mat4 u_model; 
uniform mat4 u_lightSpaceMat; 

in vec3 a_position; 
in vec3 a_normal; 
in vec2 a_texture; 

out VS_OUT { 
    vec3 v_fragPos; 
    vec3 v_normal; 
    vec2 v_texCoords; 
    vec4 v_fragPosLightSpace; 
} vs_out; 

void main() 
{ 
    gl_Position = u_projection * u_view * u_model * vec4(a_position, 1.0); 
    vs_out.v_fragPos = (u_model * vec4(a_position, 1.0)).xyz; 
    vs_out.v_normal = transpose(inverse(mat3(u_model))) * a_normal; 
    vs_out.v_texCoords = a_texture; 
    vs_out.v_fragPosLightSpace = u_lightSpaceMat * vec4(vs_out.v_fragPos, 1.0); 
} 

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

#version 430 core 

uniform sampler2D u_shadowMap; 
uniform sampler2D u_diffuseTexture; 

uniform vec3 u_lightPos; 
uniform vec3 u_viewPos; 

in VS_OUT { 
    vec3 v_fragPos; 
    vec3 v_normal; 
    vec2 v_texCoords; 
    vec4 v_fragPosLightSpace; 
} fs_in; 

out vec4 fragColor; 

float shadowCalculation(vec4 fragPosLightSpace, vec3 normal, vec3 lightDir) 
{ 
    // perform perspective divide 
    vec3 projCoords = fragPosLightSpace.xyz/fragPosLightSpace.w; 
    // transform to [0,1] range 
    projCoords = projCoords * 0.5 + 0.5; 
    // Get closest depth value from light's perspective (using [0,1] range 
    // fragPosLight as coords) 
    float closestDepth = texture(u_shadowMap, projCoords.xy).r; 
    // Get depth of current fragment from lights perspective 
    float currentDepth = projCoords.z; 
    float bias = max(0.05 * (1.0 - dot(normal, lightDir)), 0.005); 
    // Percentage closer filtering 
    float shadow = 0.0; 
    vec2 texelSize = 1.0/textureSize(u_shadowMap, 0); 
    for (int x = -1; x <= 1; ++x) 
    { 
    for (int y = -1; y <= 1; ++y) 
    { 
     float pcfDepth = texture(u_shadowMap, projCoords.xy + vec2(x, y) * texelSize).r; 
     shadow += currentDepth - bias > pcfDepth ? 1.0 : 0.0; 
    } 
    } 
    shadow /= 9.0; 

    return shadow; 
} 

void main() 
{ 
    vec3 color = texture(u_diffuseTexture, fs_in.v_texCoords).rgb; 
    vec3 normal = normalize(fs_in.v_normal); 
    vec3 lightColor = vec3(1.0); 
    // ambient 
    vec3 ambient = 0.15 * color; 
    // diffuse 
    vec3 lightDir = normalize(u_lightPos - fs_in.v_fragPos); 
    float diff = max(dot(lightDir, normal), 0.0); 
    vec3 diffuse = diff * lightColor; 
    // specular 
    vec3 viewDir = normalize(u_viewPos - fs_in.v_fragPos); 
    float spec = 0.0; 
    vec3 halfWayDir = normalize(lightDir + viewDir); 
    spec = pow(max(dot(normal, halfWayDir), 0.0), 64.0); 
    vec3 specular = spec * lightColor; 
    // calculate shadow 
    float shadow = shadowCalculation(fs_in.v_fragPosLightSpace, normal, lightDir); 
    vec3 lighting = (ambient + (1.0 - shadow) * (diffuse + specular)) * color; 

    fragColor = vec4(lighting, 1.0); 
} 

glUseProgram(shaderProgram); 
glUniform1i(u_diffuseTextureLocation, 0); 
glUniform1i(u_shadowMapLocation, 1); 

[...] 

glUseProgram(shaderProgram); 

[Render some stuff to depth buffer] 

glBindBuffer(GL_ARRAY_BUFFER, 0); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 
glBindVertexArray(0); 
glDisableVertexAttibArray(a_normalAttribLocation); // This gives the GL_INVALID_OPERATION 
                // enum 

そして、ここでは、そのプログラムで頂点シェーダです私が本当に混乱しているのは、ローカルファイルを使用しているときにプログラムが実行されるということです。しかし、Perforceリポジトリからファイルを取り出して実行しようとすると、例外がスローされます。私はチェックし、必要なファイルはすべてPERFORCEにアップロードされます。実際にアクティブな属性が間違っているように見えるでしょうか?よく分かりません。ただ、ここに私の頭を悩ま...

答えて

1
glBindVertexArray(0); 
glDisableVertexAttibArray(a_normalAttribLocation); 

​​は現在VAOを変更します。 は、現在のVAOをとして削除し、0に設定します。コアプロファイルでは、VAOをまったく意味しません。互換性プロファイルにはVAO 0があります。これはおそらく別のマシンで互換性プロファイルを取得しているためです。

しかし、VAOを使用している場合、アトリビュート配列をすべて無効にする理由は明確ではありません。 VAOの全体のポイントは、フレームごとに属性配列関数を呼び出す必要がないことです。 VAOをバインドして移動するだけです。

+0

非常に真です。私は今それを試すつもりだし、それがうまくいくならあなたに戻ってくるだろう。 –

+0

うん、あなたは正しい。私はそれを見ていないとは信じられない。私がVAOの使い方をブラッシュアップする必要があると思います。どうもありがとう! –