質問

私はGLSLとOpenGLでポイントライトを実装してみてください。私はシェーダに必要なすべてのデータを送信します。簡単にするために私はここでしか拡散光を使用します。

私の例では、私は、単一の光源を照射するようにしたい巨大な三角形を示しています。光源は小さな青い三角形として示されている。

拡散光のために私は光と表面との間の角度を知っておく必要があります。したがって、私は、法線と光の方向を計算します。 0と1の間のすべてが点灯しているのに対し、ドット積は、その後、-1と1の間に私に数を与えます。

この角度は、私の例では、誤って計算されているため、

しかし、ここで私はこだわっています。それはシェーダをデバッグするのは難しいですので、私は私の表面の色として複数の出力を使用しました。私は、三角形のための色として正常を使用し、光があったどこに、表面は常に緑色でした。つまり、法線はY軸を指し、したがって、それらが正しい計算されます。これは、光の方向が間違っていなければなりません、です。しかし、私はそれが間違っている理由を見つけることができません。光の位置と頂点」位置は、光の方向を計算し、フラグメントシェーダにこれを渡し、その後、目のスペースにそれらを変換頂点シェーダにワールド空間に渡されます:

頂点シェーダます:

vec4 pos = modelview_matrix * <input vertex>;
vec4 lightPos = modelview_matrix * <light position>;

vec3 lightDir = normalize(lightPos.xyz - pos.xyz);

フラグメントシェーダ:

float NdotL = max(dot(normalize(<correct normal>), normalize(lightDir)), 0.0);
gl_FragColor = vec4(1.0, NdotL, 0.0, 1.0);

私は間違いなく補間が本当に奇妙であることを示し、この例のいくつかの写真を追加しました。私は私が貼り付けたコードが正しいかどうかは、コードの詳細を知る必要があるかどうかを知りたい知っています。さらに、この補間動作が正常であるか、それは私のコードにバグがありますか?

http://img41.imageshack.us/img41/3566/interpolation.png http://img189.imageshack.us/img189/3566/interpolation.png

は、特に最初の画像は、光の中心スポットがないは直接光の下であるが、わずかに三角形の中心に移動することを示している。

私は(それはそれが補間されている)フラグメントシェーダに「POS」を渡した後、フラグメントシェーダで「lightDir」を計算する場合は、

、すべてが正常に動作します。

役に立ちましたか?

解決

私は、頂点シェーダであなたのlightDirを正規化すると、それは式のうち、長さを取るため、補間の「速さ」を影響するためのベクトルを補間するときあなたが得る結果に影響を与えると思います。

あなたは(視覚的に)説明をしたい場合は、

、紙の上に2Dでそれを描画してみてください。最初の行(あなたの三角形)と点(光源)を描きます。光源に線の両端のための2つの行(lightDir)を追加し、それらが同じ長さを有し、両方の光源で会うようにそれらlightDir線を縮小(正規化)。あなたは、正規化lightDirラインの両端を接続した場合(光源があなたの最初の行の真ん中に正確ではない場合)あなたは非平行線を取得します。 今、あなたは正確にあなたはそれが他のラインの中央を通過しませんが、少し左または右にそれをヒットすることがわかります行の1の中央を通過する線を引く場合ます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top