3

パートナーと私は OpenGL の小さなデモに取り組んでいます。単純なシャドウ マッピングを行っています。彼は ATI と Intel HD グラフィックス 4000 を使用しており、すべて正常に動作しています。私は GTX 560 TI を使用しており、同じコードを使用していますが、影にきびが発生します。 ここに画像の説明を入力

私が動いているとき、影全体がちらつきます。フレームバッファの深度バッファを設定するには、次のようにします。

glBindTexture(GL_TEXTURE_2D,_t_depth->name());
  glTexImage2D(
    GL_TEXTURE_2D,0,
    GL_DEPTH_COMPONENT32,
    width,height,
    0, GL_DEPTH_COMPONENT, GL_FLOAT,0);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
  glBindTexture(GL_TEXTURE_2D,0);
  glFramebufferTexture(GL_FRAMEBUFFER,GL_DEPTH_ATTACHMENT,_t_depth->name(),0);

頂点シェーダーの関連部分は次のとおりです。

uniform mat4 u_lightspace_MVP;
layout(location=0) in vec3 v_position;
...
vec4 shadowcoord_x=u_lightspace_MVP*vec4(v_position,1.0);
shadowcoord_x/=shadowcoord_x.w;

フラグメント シェーダーの関連部分は次のとおりです。

 if (texture(s_shadowMap,shadowcoord_x.xy).r>shadowcoord_x.z-0.0001)

さまざまなバイアス値を試しましたが、にきびに影響しないか、影がまったくありません。また、ルックアップ関数として textureProj() および texture() で sampler2DShadow を使用しようとしました。何も機能していないようです。この問題は、シャドウだけでなく、シャドウマップも使用されるボリューム ライティング エフェクトにも影響します。一方、gl_ClipDistance を使用したクリッピングは、私の Nvidia では正常に機能しますが、彼のグラフィック カードでは機能しません。

4

1 に答える 1

1

さらなる試行錯誤の末、私はついににきびを取り除くことができました. 私がしなければならなかった唯一のことは、シャドウ マップの精度を 32 ビットから 16 ビットに半分にすることでした。初期化は次のようになります。

glBindTexture(GL_TEXTURE_2D,_t_depth->name());
  glTexImage2D(
    GL_TEXTURE_2D,0,
    GL_DEPTH_COMPONENT16,
    width,height,
    0, GL_DEPTH_COMPONENT, GL_FLOAT,0);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
  glBindTexture(GL_TEXTURE_2D,0);
  glFramebufferTexture(GL_FRAMEBUFFER,GL_DEPTH_ATTACHMENT,_t_depth->name(),0);

現在、深度テストのためにフラグメント シェーダーで sampler2DShadow と textureProj() も使用しており、すべて正常に動作しています。それでも、私の Nvidia では 32 ビットではなく、ATI ではなぜ動作しなかったのか不思議です。

于 2014-05-18T21:20:09.117 に答える