4

同じ問題についてネット上にいくつかのスレッドがあることは知っていますが、実装が異なるため、これらのスレッドからの助けは得られません。

ビュースペースの色、法線、奥行きをテクスチャにレンダリングしています。次に、テクスチャをフルスクリーンクワッドにバインドし、ライティングを計算します。指向性ライトは正常に機能しているようですが、ポイントライトはカメラと一緒に動いています。

対応するシェーダーコードを共有します:

ライティングステップ頂点シェーダー

in vec2 inVertex;
in vec2 inTexCoord;
out vec2 texCoord;
void main() {
    gl_Position = vec4(inVertex, 0, 1.0);
    texCoord = inTexCoord;
}

ライティングステップフラグメントシェーダー

float depth = texture2D(depthBuffer, texCoord).r;
vec3 normal = texture2D(normalBuffer, texCoord).rgb;
vec3 color = texture2D(colorBuffer, texCoord).rgb;

vec3 position;
position.z = -nearPlane / (farPlane - (depth * (farPlane - nearPlane))) * farPlane;
position.x = ((gl_FragCoord.x / width) * 2.0) - 1.0;
position.y = (((gl_FragCoord.y / height) * 2.0) - 1.0) * (height / width);
position.x *= -position.z;
position.y *= -position.z;

normal = normalize(normal);
vec3 lightVector = lightPosition.xyz - position;
float dist = length(lightVector);
lightVector = normalize(lightVector);

float nDotL = max(dot(normal, lightVector), 0.0);
vec3 halfVector = normalize(lightVector - position);
float nDotHV = max(dot(normal, halfVector), 0.0);

vec3 lightColor = lightAmbient;
vec3 diffuse =  lightDiffuse * nDotL;
vec3 specular = lightSpecular * pow(nDotHV, 1.0) * nDotL;
lightColor += diffuse + specular;
float attenuation = clamp(1.0 / (lightAttenuation.x + lightAttenuation.y * dist + lightAttenuation.z * dist * dist), 0.0, 1.0);

gl_FragColor =  vec4(vec3(color * lightColor * attenuation), 1.0);

ユニフォームとしてシェーダーにライト属性を送信します。

shader->set("lightPosition", (viewMatrix * modelMatrix).inverse().transpose() * vec4(0, 10, 0, 1.0));

viewmatrixはカメラマトリックスであり、modelmatrixはここでは単なるアイデンティティです。

なぜポイントライトがモデルではなくカメラで変換されているのですか?

どんな提案でも大歓迎です!

4

1 に答える 1

4

計算するすべてのベクトルを正規化する必要があるという誰のコメントにも加えて、それらがすべて同じ空間にあることを確認する必要があります。ビュー空間の位置をビューベクトルとして使用する場合、法線ベクトルもビュー空間にある必要があります(最初のパスでGバッファーに書き込まれる前に、逆転置モデルビュー行列によって変換される必要があります)。また、光ベクトルもビュースペースにある必要があります。したがって、逆転置ではなく、ビューマトリックス(またはライト位置がワールド空間にない場合はmodelviewマトリックス)によってライト位置を変換する必要があります。

shader->set("lightPosition", viewMatrix * modelMatrix * vec4(0, 10, 0, 1.0));

編集:指向性ライトの場合、ライトの方向をライトの方向として指定する場合(vec4(0, 1, 0, 0)-z方向を指すライトの場合のように)、逆転置は実際には良い考えです。

于 2011-08-28T18:00:17.413 に答える