ライトの方向を説明するラインを描画。XFCのものから、抜き出し。頂点シェーダープログラム。シンプルな平行光源+環境光のライト。頂点シェーダープログラム。頂点色によるスペキュラーライト。頂点シェーダープログラム。テクスチャーによるスペキュラーライト。頂点シェーダープログラム。頂点シェーダープログラム。平行光源+半球環境光ライト。頂点シェーダープログラム。平行光源+半球環境光+スペキュラーライト。頂点シェーダープログラム。頂点シェーダープログラム。(空デカール)あと、いつもの様に、モデルと、実行ファイル及び、プロジェクトファイルとメニューのリソースファイルが入っています。■テクスチャーマップのおさらいさて、いままでの何回か出てきたテクスチャーマップに関しておさらいします。頂点シェーダーでは、適当な浮動小数点数をテクスチャーのUV座標に指定できます。なるので、y軸の真上にある平行光源からのライティングが表現できます。余分なテクスチャーがいらない分、効率的。浪費しないためにも、頂点色のほうが望ましい)、普通は頂点色を用います。この計算が威力を発揮するのは、スペキュラ(鏡面光沢)のとき等です。適当なベクトルにすることによって、全く同じ計算で光沢の在る表現をすることができます。次の画像は平行光源のものです。この画像に、スペキュラーのテクスチャーを張ったものは以下の用になります。同様の計算を頂点色で表現した場合には、以下になります。(いや、頂点色をつける場合には、小数点のべき乗ができないので、ホントは問題なんですけどね)。値が大きく)なっています。そこを差し引いてもテクスチャーによる方法にメリットがあります。それは、テクスチャーの模様を自由に替えられることです。x^4』のような制限に縛られません。テクスチャーをまだら模様にすれば、下のような金属光沢的なライティングに変わります。これは、いいかげんに描いたものですが、ゲームのような『それらしく見えれば良い』世界では、これでも十分な場合が多いです。欠点は頂点色の場合と比べて解像度が低いことです。程度しか使えません(それ以上使うと、他の人から使いすぎと文句を言われるでしょう(笑))。頂点色の場合には、浮動小数点分の解像度が使えるわけですからテクスチャーよりもあらは見えません。テクスチャーのほうがマッハバンドが出やすかったり、不自然なギザギザが見えます。この結果は、後でまとめて描くボールの場合のレンダリングに如実に現れています。光の裏を向いた面は、全て同じ色になります。裏面にも異なる色が使えれば、より抑揚がつきます。対応させれば良いです。範囲で内積の全ての範囲をサポートできます。先ほどの平行光源の結果を表現するには、下のようなテクスチャーを用いれば可能です。以下の部分は黒で塗りつぶされていますが、ここを適当な模様で塗りつぶせば裏面にも『表情』を持たせることができます。欠点はテクスチャーの解像度が半分になることです。最初と同じ結果を得るためには、テクスチャーの大きさを倍にしなくてはなりません。環境光の色の3つです。半球ライティングは、同じようにパラメータが3つと少ないライティングです。半球ライティングは一様な光で照らす半球を上下から二つ合わせたモデルです。半球の軸に、なります。0.5(1-cosθ)地球色になります。そちらを参照すると最高です。頂点シェーダープログラムは次のようになります。頂点と半球の向いている軸との内積を取れば計算できるので、あとはそれらを線形に組み合わせれば終了です。このプログラムによる結果は、次のようになります。値をテクスチャーのU値に対応させる方法で、少ないステップ数で表現することができます(先ほどのスペキュラー計算のライトの方向を半球の軸に置き換えるだけです)。テクスチャーステージが余っていれば、そちらを使うほうが高速でしょう。やった感じ、抑揚の少ないライティングだと感じました。原因は、表の色が裏まで回りこむ分グラデーションの濃淡が減るためでしょうか?ということで、半球ライティングにさらに平行光源を追加してみます。環境光を半球ライトに置きかえた事になります。0.5(1-cosθ)*地球色になります。半球ライティングの軸をY軸に平行(鉛直方向)にすると、次の画像が得られます。地面の色を写した『照り返し』の表現として受け止められます。スペキュラーをさらに加えた場合には、の様になります。さりげない変更ですが、光の裏の面に関しても趣が出てきたように感じます。■おまけのソフトトゥーンアニメのカービーを見ました。奴の丸さ加減は明らかにCGです。普通のトゥーンではなく、境界がぼやけていました。そんなレンダリングをしてみました。(やわらかいトゥーン用)です。真中が法線と光源の方向が垂直な場所なので、光の裏を向く直前から色が暗くなります。頂点シェーダープログラムは、次のようになります。soft.bmpの色に、なります。通常のトゥーンなら、色を2値にくっきり分けるのですが、今回は、その部分にグラデーションがかかっています。いうことで、少しやわらかいトゥーンになったと思います。左側がオレンジなのは、暗い部分に色を付けたかったからです。最初黒だったのですが、味気なかったのでこうしました。テクスチャーで環境光をつけたようなものですが、このほうがアニメっぽいんではないでしょうか?■まとめてみるとでは、今回出てきたものを球を使ってレンダリングしてみます。車のモデルでごまかされたと思った方は、こちらで確認してください。平行光源+環境光まぁ、基本。頂点色によるスペキュラきれいな白反射。テクスチャーによるスペキュラ上のものよりちょっとギザギザしてるかな?。金属的光沢これだけだとおかしいですね。『照り返し』として使えると思います。平行光源+半球環境光+スペキュラこの中では、一番リアルではないでしょうか?やわらかいトゥーン境界がギザギザしていますね。さん一押しの半球ライティングを試してみました。環境光の置き換えとして、照り返しを表現するのに使えるかなぁと思っています。ついでに輪郭抽出もしてみました(トップのやつです)。新坂さんの作られたソースを参考に、一部変更しました。輪郭用にモデルを(通常モデルを書くより前に)edge.vshで描画します。スクリーン座標で法線方向に押し出した後、さらに手前に押し出します。レンダリング状態は、深度バッファ書き込みと表裏カリングをやめます。もどるimagire@gmail.com。