2017-12-27 29 views
0

私が取り組んでいるプロジェクトで単純なシャドーマッピングを実装しようとしています。私はそれがそこにあることを知っているので、私は深さのテクスチャをスクリーンにレンダリングすることができます、問題は、シャドーマップをサンプリングして、座標がオフのように見えるシャドウテクスチャ座標をサンプリングするときです。ここで 遅延レンダリングでシャドーマップを使用する際の問題OpenGL 3.3

は私の 光空間マトリクス計算

ある
mat4x4 lightViewMatrix; 

vec3 sun_pos = {SUN_OFFSET * the_sun->direction[0], 
       SUN_OFFSET * the_sun->direction[1], 
       SUN_OFFSET * the_sun->direction[2]}; 

mat4x4_look_at(lightViewMatrix,sun_pos,player->pos,up); 

mat4x4_mul(lightSpaceMatrix,lightProjMatrix,lightViewMatrix); 

私はシャドウマップのサイズや錐台の値を微調整しますが、今の私はちょうどプレーヤーの位置の周りに影を描きたい

the_sun-> directionは正規化されたベクトルですので、定数を乗算して位置を取得します。

player-> POS光投影行列このように算出される

世界空間におけるカメラの位置である:

mat4x4_ortho(lightProjMatrix,-SHADOW_FAR,SHADOW_FAR,-SHADOW_FAR,SHADOW_FAR,NEAR,SHADOW_FAR); 

シャドウ頂点シェーダ:

uniform mat4 light_space_matrix; 

void main() 
{ 
    gl_Position = light_space_matrix * transfMatrix * vec4(position, 1.0f); 
} 

シャドウフラグメントシェーダ:

out float fragDepth; 
void main() 
{ 
    fragDepth = gl_FragCoord.z; 
} 

私はそう私はg_positionsバッファ

繰延フラグメントシェーダで私の影の計算内のすべての私の世界のポジションを持っているレンダリング延期を使用しています:

float get_shadow_fac(vec4 light_space_pos) 
{ 
    vec3 shadow_coords = light_space_pos.xyz/light_space_pos.w; 
    shadow_coords  = shadow_coords * 0.5 + 0.5; 

    float closest_depth = texture(shadow_map, shadow_coords.xy).r; 
    float current_depth = shadow_coords.z; 

    float shadow_fac = 1.0; 

    if(closest_depth < current_depth) 
     shadow_fac = 0.5; 

    return shadow_fac; 
} 

私は関数を呼び出しますこのように:

get_shadow_fac(light_space_matrix * vec4(position,1.0)); 

申し訳ありませんのために:位置iがここg_positionバッファ

をサンプリングから得た値は私の深さのテクスチャは(私はそれが低品質の影が生成されます知っているが、私はちょうどそれが今のために働いて取得したい)です圧縮、黒い汚れが木です... https://i.stack.imgur.com/T43aK.jpg

EDIT:深度テクスチャアタッチメント:

glTexImage2D(GL_TEXTURE_2D, 0,GL_DEPTH_COMPONENT24,fbo->width,fbo->height,0,GL_DEPTH_COMPONENT,GL_FLOAT,NULL); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_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); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, fbo->depthTexture, 0); 

答えて

0

私は、問題が何であったかが分かった私のg_positionsバッファテクスチャが持っていました私は

に変更
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA32F,fbo->width,fbo->height,0,GL_RGB,GL_FLOAT,NULL); 

影が現れたときにその内部GL_RGBA8のフォーマットとは

glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA8,fbo->width,fbo->height,0,GL_RGBA,GL_UNSIGNED_BYTE,NULL); 

ので、ワールド空間内の位置を保持するためには小さすぎる:D gbufferにワールド空間postitionを保存

+0

メモリ帯域幅の無駄です。必要なのはウィンドウスペースz(とにかく使用するデプスバッファー)だけです。ワールドスペースに簡単に戻すことができます。 – derhass

+0

問題を解決する方法を研究しているうちに何かを読んだことがありますが、それについては決して考えませんでした。私はそれをできるだけ実装することに言及してくれてありがとう。 – Gicla

関連する問題