0

OpenGL 4.0 Shading Language Cookbookからディフューズパーバーテックスシェーダーを実装していますが、プロジェクトに合わせて少し変更しました。

これは私の頂点シェーダーコードです:

layout(location = 0) in vec4 vertexCoord;
layout(location = 1) in vec3 vertexNormal;

uniform vec4 position; // Light position, initalized to vec4(100, 100, 100, 1)
uniform vec3 diffuseReflectivity; // Initialized to vec3(0.8, 0.2, 0.7)
uniform vec3 sourceIntensity; // Initialized to vec3(0.9, 1, 0.3)

uniform mat4 projection;
uniform mat4 view;
uniform mat4 model;

out vec3 LightIntensity;

void main(void) {
    // model should be the normalMatrix here in case that
    // non-uniform scaling has been applied.
    vec3 tnorm = normalize(vec3(model * vec4(vertexNormal, 0.0)));

    // Convert to eye/camera space
    vec4 eyeCoordsLightPos = view * model * position;
    vec4 eyeCoords = view * model * vertexCoord;
    vec3 s = normalize(vec3(eyeCoordsLightPos - eyeCoords));

    // Diffuse shading equation
    LightIntensity = sourceIntensity * diffuseReflectivity * max(dot(s,tnorm), 0.0);

    gl_Position = projection * view * model * vertexCoord;
}

そして、これは私のフラグメントシェーダーです:

in vec3 LightIntensity;

layout(location = 0) out vec4 FragColor;

void main(){
    FragColor = vec4(LightIntensity, 1.0);
}

ボックスをレンダリングしていますが、すべての法線の値があります。しかし、箱は真っ黒です。ユニフォームがレンダリング時に正しく設定されていると仮定すると、シェーダーコードに明らかに問題がありますか?

この本のコードと比較して変更したのは、モデルマトリックスを通常のマトリックスとして使用し、ライトの位置をモデルスペースに渡して、シェーダーでカメラスペースに変換することです。

レンダリングの画像。テクスチャである影付きの背景と混同しないでください。 レンダリングの画像。テクスチャである影付きの背景と混同しないでください。

FragColor = vec4(f_vertexNormal, 1.0);フラグメントシェーダーで レンダリングするときの画像:ここに画像の説明を入力してください

アイスペースの提案でtnormを使用してコードを更新しました:

void main(void) {
    // model should be the normalMatrix here in case that
    // non-uniform scaling has been applied.
    vec3 tnorm = normalize(vec3(model * vec4(vertexNormal, 0.0)));

    // Convert to eye/camera space
    vec3 eyeTnorm = vec3(view * vec4(tnorm, 0.0));
    vec4 eyeCoordsLightPos = view * position;
    vec4 eyeCoords = view * model * vertexCoord;
    vec3 s = normalize(vec3(eyeCoordsLightPos - eyeCoords));

    // Diffuse shading equation
    LightIntensity = sourceIntensity * diffuseReflectivity * max(dot(s,eyeTnorm), 0.0);

    gl_Position = projection * view * model * vertexCoord;
    f_vertexNormal = vertexNormal;
}
4

1 に答える 1

2

上記の私のコメントに加えて、あなたは目空間ベクトルでdot世界空間ベクトルを-ingしています。同じスペースにドット ベクトルのみを配置する必要があります。そのため、目の空間への変換も検討することをお勧めします。tnormstnorm

于 2012-09-21T18:37:41.953 に答える