ポイント ライトのシャドウを作成するためにキューブ マップを使用しようとしています。
私に役立つさまざまなチュートリアルを見つけました ( Pointers on modern OpenGL shadow cubemapping?、https://www.opengl.org/discussion_boards/showthread.php/169743-cubemap-shadows-for-pointlights、http://www.cg. tuwien.ac.at/courses/Realtime/repetitorium/2011/OmnidirShadows.pdf、...) しかし、キューブ マップのルックアップにはまだ問題があります。
このシェーダーはキューブ マップを作成します (形式: GL_DEPTH_COMPONENT、GL_UNSIGNED_BYTE):
//vertex shader
#version 330
uniform mat4 Model;
uniform mat4 View;
uniform mat4 Projection;
in vec3 vertex;
out vec3 vertexModel;
void main()
{
gl_Position = Projection * View * Model * vec4(vertex, 1.0);
vertexModel = vec3(Model * vec4(vertex, 1.0));
}
//fragment shader
#version 330
uniform vec3 lightPosition;
uniform float lightRange;
out float fragDepth;
out vec4 fragColor;
in vec3 vertexModel;
void main()
{
gl_FragDepth = length(lightPosition - vertexModel) / lightRange;
fragColor = vec4(1.0);
}
lightPosition
はワールド空間でのライトの位置で、lightRange
基本的にはライトの射影行列の zFar です。
生成されたキューブ マップは、gDEBugger を使用してアプリケーションをデバッグするときに見栄えがします。
メイン シェーダーでのシャドウ ルックアップ:
float shadowValue(int i)
{
vec3 lookup_vector = vertexModel - lightPosition;
float dist = texture(shadowMap, lookup_vector).r;
float curr_fragment_dist_to_light = length(lookup_vector) / lightRange;
float result = 1.0;
if (dist < curr_fragment_dist_to_light)
result = 0.0;
return result;
}
この関数の結果は、ライト計算の値で乗算されます。問題は、常に 1.0 を返すことです。
誰かが私が間違っていることを知っていますか?