2017-10-24 14 views
2

アンドロイドのOpenGL C++アプリケーションで指向性のあるライトを使ってシャドーマップを実装すると、シャドウが正しくレンダリングされますが、コード内に添付画像のようなバグがあります:OpenGLのシャドーマップでオブジェクト上の影が正しくない

モデル上奇妙な三角形分割の影が存在示すよう

enter image description here

、次のように実装:

は、第1の深さバッファと次のように深度マップを作成します

glTexImage2Dの内部形式はGL_Floatでは機能しませんので、GL_UNSIGNED_SHORTを使用しました。

私はライトビューからシーンをレンダリングします。最初はライトベクトルが(50,100,50)であり、ライト方向またはライトからの方向ですが、直接的な光方向については衝突があります。シーンは異なる光成分で良好にレンダリングされる。 コードです:

if (sun->castShadow) { 
     double delta = GetCurrentTime() - firstFrame; 
     glBindFramebuffer(GL_FRAMEBUFFER, depthMapFBO); 
     glViewport(0, 0, SHADOW_WIDTH, SHADOW_HEIGHT); 
     glClear(GL_DEPTH_BUFFER_BIT); 
     glm::vec3 pos = player->getPosition(); 
     glm::vec3 tar = pos + (-sun->direction); 
     glm::mat4 lightSpaceProjection = glm::ortho(-10.0f, 10.0f, -10.0f, 10.0f, -20.0f, 500.0f); 
     glm::mat4 lightSpaceView = glm::lookAt(pos, tar, glm::vec3(0, 1, 0)); 
     lightSpaceMatrix = lightSpaceProjection * lightSpaceView; 
     shaders.setDepthLightSpaceUniform(lightSpaceMatrix); 
     terrain->renderDepth(delta); 
     for (item_it it = engineItems.begin(); it != engineItems.end(); ++it) { 
      if (it->get()->castShadow) 
       it->get()->renderDepth(delta); 
     } 
     glBindFramebuffer(GL_FRAMEBUFFER, 0); 
    } 

ようやく正常にシーンをレンダリング:

shaders.setLightsUniforms(directlights, pointlights, spotlights); 
shaders.setViewUniforms(camera); 
double first = GetCurrentTime() - firstFrame; 
terrain->render(first); 
for (item_it it = engineItems.begin(); it != engineItems.end(); ++it) { 
    it->get()->render(first); 
} 

直接光の計算のフラグメントシェーダの一部は次のとおりです。

vec3 calcDirectLight(DirectLight light,vec3 norm,vec3 tLightPos,vec3 diffColor,vec3 specColor){ 
    vec3 lightDir ; 
    if(Has_normal_map==1) 
     lightDir= normalize(tLightPos-tFragPos); 
    else 
     lightDir = normalize(light.direction - tFragPos); 

    float diff = max(dot(lightDir,norm), 0.0); 
    vec3 diffuse = light.color * diff * diffColor; 

    vec3 viewDir = normalize(tViewPos - tFragPos);  
    vec3 halfwayDir = normalize(lightDir + viewDir); 
    float spec = pow(max(dot(norm, halfwayDir), 0.0), 32.0); 
    vec3 specular = shininess * spec *specColor* light.color; 
    vec3 result; 
    if(light.castShadow==1){ 
     vec3 projCoords = FragPosLightSpace.xyz/FragPosLightSpace.w; 
     projCoords = projCoords * 0.5 + 0.5; 
     float shadow = 1.0; 
     for (int i=0;i<4;i++){ 
      shadow -= 0.2*(1.0-texture(shadowMap, projCoords.xy + poissonDisk[i]/700.0).r); 
     } 
     if(projCoords.z > 1.0) 
      shadow = 0.0; 
     result =light.intensity* shadow * (diffuse + specular); 
    } 
    else 
     result =light.intensity* (diffuse + specular); 
    return result; 
} 

他のいくつかのバグが、これがあります主要なものです

答えて

3

私はここに問題があると信じています:

if(Has_normal_map==1) 
    lightDir= normalize(tLightPos-tFragPos); 
else 
    lightDir = normalize(light.direction - tFragPos); 

あなたは指向性ライトを使用しています。指向性光の方向を計算するために 単純です:あなたはHas_normal_mapかどうかに応じて、光の方向を計算するためのdiferent式を使用する理由も、私には分かりません

lightDir = light.direction 

。私は、光の方向が法線マップに依存しないことを信じています。私はあなたのバグを解決することを願っています。

+0

それは働いています、ありがとう –

関連する問題