0

宿題 (ここに来る) の宿題のために最初の頂点シェーダーを書いていますが、正しく機能させることができません。

openGL の固定関数パイプライン頂点シェーダーを完全に模倣するよりも頂点シェーダー (および頂点シェーダーのみ) を実装し、FFP フラグメント シェーダーを使用する必要があります (したがって、FS には何も記述しません)。組み込みのユニフォーム変数を認識しており、それらを使用して、openGL 照明方程式に基づいて頂点の最終的な色を計算しています。読みやすくするために、いくつかの値の名前を変更しました (normal と lightVec は正規化されています)。

    //given as part of the assignment, not modifable
    vec4 position = gl_ModelViewMatrix * gl_Vertex;
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;

    //my (partial) code below here

    lightVec = (lightPos - position).xyz;
    distance = length(lightVec);
    vec3 normal = gl_NormalMatrix * gl_Normal;

    //I've stored a lot of the values in variables I defined locally
    //to make the code easier to read.
    //eg - constAtten = gl_LightSource[].constantAttenuation

    atten = 1/max((constAtten + distance*linearAtten + distance*distance*quadAtten),1); 
    ambient = ambInt * matAmbInt * atten;
    diffuse = difCol * matDifInt * max(dot(normal, lightVec),0.0) * atten;
    specular = specInt * matSpecInt * atten * pow(max(dot(normal, (gl_LightSource[i].halfVector).xyz),0.0), gl_FrontMaterial.shininess);

シーン内の各ライトのアンビエント、ディフューズ、スペキュラーを合計し、「合計」として保存します。

    gl_FrontColor = gl_FrontMaterial.emission + sum;
    gl_FrontColor.a = 1.0;

その結果、シーンのカメラを動かすたびにクレイジーな色が点滅します。これはopenGL v1.2です。

編集:画像へのリンク

http://i305.photobucket.com/albums/nn208/wolverine1190/shadercomp_zpsc546ac31.png

カメラを動かすたびに、左側の色が変わります。それは、法線が正しく計算されていないことを示している可能性がありますか、それともカメラ座標を使用すべきではない場所で使用されている可能性がありますか?

================================================== ===============

解決済み

問題を修正しました。なぜ今それが機能するのか正確にはわかりませんが、機能します。すべてを破棄し、同じアプローチと計算でゼロからコードを書き直しました。私が別の方法で行ったことは次のとおりです。

1)代入だけでなく、コンストラクターで値を設定します。例 - vec3 test = someOtherVec3 の代わりに、vec3 test = vec3(someOtherVec3) を実行しました。

2)正規化するとき、normalize()を呼び出すだけでなく、変数の正規化された結果をそれ自体に割り当てました。例 - normalize(normal) の代わりに、normal = normalize(normal);

3) 中間値を合計で格納し、最後に gl_FrontColor に合計を追加する代わりに、各ステップで直接 gl_FrontColor に追加しました。

それ以外は、すべて同じままでした。なぜそれが修正されたのかははっきりとは言えません。誰かが知っている場合は、説明をコメントしてください。

4

1 に答える 1

0

あなたの説明から、私はあなたの色があふれているのだろうか. 試してみるとどうなりますか:

    gl_FrontColor = clamp(gl_FrontMaterial.emission + sum, 0.0, 1.0);
于 2013-03-02T08:04:41.210 に答える