私はこれほど小さくはないタイルベースのゲームを手に入れました。これは私の最初の実際の OpenGL プロジェクトです。すべてのタイルを 3D オブジェクトとしてレンダリングしたいと考えています。最初に、立方体や球体などのオブジェクトをいくつか作成し、それらに頂点法線を指定して、フラット シェーディングのイミディエイト モードでレンダリングしました。しかし、レベルごとに 10,000 個のオブジェクトがあるため、少し遅くなりました。そこで、頂点と法線を VBO に入れました。
ここで最初の問題に遭遇しました。VBO を使用する前に、すべてのオブジェクトのマトリックスを編集して編集し、/ を使用push()
してそれらをシーンに配置しました。しかし、VBO で同じことを行ったところ、照明の動作がおかしくなり始めました。カメラの後ろに固定された照明の位置ではなく、照明がオブジェクトと一緒に回転するように見えました。それらを 180 度回転すると、影しか見えませんでした。pop()
glTranslate
glRotate
だから私はいくつかの研究をしました。私は特定の問題に対する答えを見つけることができませんでしたが、glTranslate
/を使用する代わりに、glRotate
シェーダーを実装して均一なマトリックスを提供する必要があることを読みました。
私は「おそらく私の問題も解決できるだろう」と考え、詳細に集中する前にシェーダーが機能するかどうかを確認するために、オブジェクトを少しだけ引き伸ばす最初の小さな頂点シェーダー プログラムを実装しました。
void main(void)
{
vec4 v = gl_Vertex;
v.x = v.x * 0.5;
v.y = v.y * 0.5;
gl_Position = gl_ModelViewProjectionMatrix * v;
}
オブジェクトが引き伸ばされますが、OpenGL のフラット シェーディングが壊れています。私はちょうど白い色合いを取得します。そして、私は有益な情報を見つけることができません。だから私はいくつかの質問を得ました:
一度に 1 つのシェーダーしか使用できません。独自のシェーダーを使用する場合、OpenGL のフラット シェーディングはオフになりますか? では、フラット シェーディングを自分で実装する必要がありますか?
私のベクトル法線はどうですか?正規行列のようなものがあるとどこかで読みました。おそらく、頂点を変更するときに、法線にも操作を適用する必要がありますか?