私は最近、私が取り組んでいるエンジン用のある種の遅延レンダリング パイプラインの構築を開始しましたが、深さから世界の位置を再構築することに固執しています。ライトの正確な距離と方向の計算に使用するには、ワールド ポジション テクスチャまたは深度テクスチャのいずれかが必要であると説明するかなりの数の例を見てきました。
私の問題は、おそらく世界の位置であるいわゆる位置テクスチャが正しいデータを提供していないように見えることです。したがって、世界の位置を取得する別の方法を見つけようとしましたが、代わりに深度テクスチャを使用する必要があると提案した人もいますが、その後はどうすればよいでしょうか?
より明確にするために、この写真は私が現在保存しているテクスチャを示しています。
位置 (左上)、法線 (右上)、拡散 (左下)、深度 (右下)。
ライト パスについては、最初のパスで使用すると正常に機能する方法を使用しようとしています。まったく同じ変数を使用してライト パスに同じ方法を試すと、機能しなくなります。
ここに私のジオメトリ頂点シェーダーがあります:
#version 150
uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform mat4 modelMatrix;
in vec4 in_Position;
in vec3 in_Normal;
in vec2 in_TextureCoord;
out vec3 pass_Normals;
out vec4 pass_Position;
out vec2 pass_TextureCoord;
out vec4 pass_Diffuse;
void main(void) {
pass_Position = viewMatrix * modelMatrix * in_Position;
pass_Normals = (viewMatrix * modelMatrix * vec4(in_Normal, 0.0)).xyz;
pass_Diffuse = vec4(1,1,1,1);
gl_Position = projectionMatrix * pass_Position;
}
ジオメトリ フラグメント シェーダ:
#version 150 core
uniform sampler2D texture_diffuse;
uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform mat4 modelMatrix;
in vec4 pass_Position;
in vec3 pass_Normals;
in vec2 pass_TextureCoord;
in vec4 pass_Diffuse;
out vec4 out_Diffuse;
out vec4 out_Position;
out vec4 out_Normals;
void main(void) {
out_Position = pass_Position;
out_Normals = vec4(pass_Normals, 1.0);
out_Diffuse = pass_Diffuse;
}
ライト頂点シェーダー:
#version 150
in vec4 in_Position;
in vec2 in_TextureCoord;
out vec2 pass_TextureCoord;
void main( void )
{
gl_Position = in_Position;
pass_TextureCoord = in_TextureCoord;
}
ライト フラグメント シェーダー:
#version 150 core
uniform sampler2D texture_Diffuse;
uniform sampler2D texture_Normals;
uniform sampler2D texture_Position;
uniform vec3 cameraPosition;
uniform mat4 viewMatrix;
in vec2 pass_TextureCoord;
out vec4 frag_Color;
void main( void )
{
frag_Color = vec4(1,1,1,1);
vec4 image = texture(texture_Diffuse,pass_TextureCoord);
vec3 position = texture( texture_Position, pass_TextureCoord).rgb;
vec3 normal = texture( texture_Normals, pass_TextureCoord).rgb;
frag_Color = image;
vec3 LightPosition_worldspace = vec3(0,2,0);
vec3 vertexPosition_cameraspace = position;
vec3 EyeDirection_cameraspace = vec3(0,0,0) - vertexPosition_cameraspace;
vec3 LightPosition_cameraspace = ( viewMatrix * vec4(LightPosition_worldspace,1)).xyz;
vec3 LightDirection_cameraspace = LightPosition_cameraspace + EyeDirection_cameraspace;
vec3 n = normal;
vec3 l = normalize( LightDirection_cameraspace );
float cosTheta = max( dot( n,l ), 0);
float distance = distance(LightPosition_cameraspace, vertexPosition_cameraspace);
frag_Color = vec4((vec3(10,10,10) * cosTheta)/(distance*distance)), 1);
}
最後に、現在の結果は次のとおりです。
だから私の質問は、誰かが結果を説明できるかどうか、または正しい結果を得るためにどのようにすべきかということです. また、この地域に関する優れたリソースに感謝します。