0

異なるシェーダーステージ間の計算を理解するのに苦労しています。

ライトの観点から見たフラグメントシェーダーでは、基本的にfragDepthをrgbカラーに書き込みます。

#version 330

out vec4 shader_fragmentColor;

void main()
{
    shader_fragmentColor = vec4(gl_FragCoord.z, gl_FragCoord.z, gl_FragCoord.z, 1);
    //shader_fragmentColor = vec4(1, 0.5, 0.5, 1);
}

上記のシェーダーを使用してシーンをレンダリングすると、シーンはすべて白色で表示されます。gl_FragCoord.zが1より大きいためだと思います。うまくいけば、1で最大になりませんが、今のところその質問はそのままにしておくことができます。

カメラの観点からのジオメトリシェーダーでは、基本的にすべてのポイントを四角形に変換し、おそらく「正しくない」テクスチャ位置を書き出して、lightTextureでルックアップします。ここでの数学が問題です。また、次のシェーダーステージで補間値が正しいかどうかについても少しわかりません。

#version 330
#extension GL_EXT_geometry_shader4 : enable

uniform mat4 p1_modelM;
uniform mat4 p1_cameraPV;
uniform mat4 p1_lightPV;

out vec4 shader_lightTexturePosition;

void main()
{
    float s = 10.00;

    vec4 llCorner = vec4(-s, -s, 0.0, 0.0);
    vec4 llWorldPosition = ((p1_modelM * llCorner) + gl_in[0].gl_Position);
    gl_Position = p1_cameraPV * llWorldPosition;
    shader_lightTexturePosition = p1_lightPV * llWorldPosition;
    EmitVertex();

    vec4 rlCorner = vec4(+s, -s, 0.0, 0.0);
    vec4 rlWorldPosition = ((p1_modelM * rlCorner) + gl_in[0].gl_Position);
    gl_Position = p1_cameraPV * rlWorldPosition;
    shader_lightTexturePosition = p1_lightPV * rlWorldPosition;
    EmitVertex();

    vec4 luCorner = vec4(-s, +s, 0.0, 0.0);
    vec4 luWorldPosition = ((p1_modelM * luCorner) + gl_in[0].gl_Position);
    gl_Position = p1_cameraPV * luWorldPosition;
    shader_lightTexturePosition = p1_lightPV * luWorldPosition;
    EmitVertex();

    vec4 ruCorner = vec4(+s, +s, 0.0, 0.0);
    vec4 ruWorldPosition = ((p1_modelM * ruCorner) + gl_in[0].gl_Position);
    gl_Position = p1_cameraPV * ruWorldPosition;
    shader_lightTexturePosition = p1_lightPV * ruWorldPosition;
    EmitVertex();

    EndPrimitive();
}

カメラの観点からのフラグメントシェーダーでは、基本的にlightTextureでルックアップし、ライトパースペクティブからどの色が表示されるかを調べ、同じ色を書き出します。

#version 330

uniform sampler2D p1_lightTexture;

in vec4 shader_lightTexturePosition;

out vec4 shader_fragmentColor;

void main()
{
    vec4 lightTexel = texture2D(p1_lightTexture, shader_lightTexturePosition.xy);
    shader_fragmentColor = lightTexel;
    /*
    if(lightTexel.x < shader_lightTexturePosition.z)
        shader_fragmentColor = vec4(1, 0, 0, 1);
    else
        shader_fragmentColor = vec4(0, 1, 0, 1);
    */
    //shader_fragmentColor = vec4(1, 1, 1, 1);
}

カメラの観点からレンダリングすると、シーンが適切に描画されているのがわかりますが、不適切なテクスチャ座標が適用されて繰り返されます。テクスチャの繰り返しは、テクスチャ座標が0から1の範囲外にあることが原因である可能性があります。

私はいくつかのことを試みましたが、それでも数学がどうあるべきか理解できません。コメントアウトされたコードの一部と不明な例の1つは次のとおりです。

shader_lightTexturePosition = normalize(p1_lightPV * llWorldPosition) / 2 + vec4(0.5, 0.5, 0.5, 0.5);

左下隅に。他のコーナーへのsimilairコード

ソリューションから、シーンはカメラの視点からライトの視点とまったく同じ色でレンダリングされると思います。おそらくいくつかの精度エラーがあります。

4

1 に答える 1

0

テクスチャ マッピング ビットを自分で見つけました。深度値ビットはまだ少し奇妙です。screenProjectedCoords を normalizedDeviceCoords に変換し、1 除算を 2 で追加します。

vec4 textureNormalizedCoords(vec4 screenProjected)
{
    vec3 normalizedDeviceCoords = (screenProjected.xyz / screenProjected.w);
    return vec4( (normalizedDeviceCoords.xy + 1.0) / 2.0, screenProjected.z * 0.005, 1/screenProjected.w);
}

void main()
{
    float s = 10.00;

    vec4 llCorner = vec4(-s, -s, 0.0, 0.0);
    vec4 llWorldPosition = ((p1_modelM * llCorner) + gl_in[0].gl_Position);
    gl_Position = p1_cameraPV * llWorldPosition;
    shader_lightTextureCoords = textureNormalizedCoords(p1_lightPV * llWorldPosition);
    EmitVertex();a
于 2013-01-06T03:05:49.463 に答える