注:リンク/画像がテキストにすぎないことをお詫びします。新しいユーザーとして、画像を投稿したり、2つ以上のハイパーリンクを投稿したりすることはできません。
そのため、私は非推奨のOpenGLをしばらく使用しており、数週間前に最終的に最新の方法にジャンプすることを決定しました。Open.glをリソースとして使用して(LWJGLチュートリアルは一貫性がなく、まばらであることがわかりました)、かなり遠くまで到達し、このチュートリアルの最後の画像までレンダリングすることができます。しかし、次のページ(立方体のレンダリング)でいくつかの深刻な問題が発生しました。
私はこの問題について多くの調査を行い、すべてのコンポーネントの目的を完全に理解し、基本的なもの(バッファーの反転を忘れるなど)を見逃さないように、コードを何度も改良/再編成しました。エラーが発生している可能性がある領域を絞り込むため。
したがって、私の基本的な目標は、次のサンプルコードを使用して、立方体をレンダリングすることです。http://open.gl/content/code/c5_cube.txt
比較のためのコードは次のとおりです。http://pastie.org/5864112#241
コードから得られる結果は次のとおりです。
ビューマトリックスをZ方向にのみ変換すると、最後のチュートリアルの最後の画像とまったく同じになります。https://dl.dropbox.com/u/38489921/vbo11.png
//set up view matrix - TODO: problem 1?
Matrix4f view = new Matrix4f();
view.setIdentity();
view.translate(new Vector3f(0.0f, 0.0f, -2f));
view.m13 = 1f;
FloatBuffer viewSend = BufferUtils.createFloatBuffer(16);
view.store(viewSend);
viewSend.flip();
int uniView = glGetUniformLocation(shaderProgram, "view");
glUniformMatrix4(uniView, false, viewSend);
これは実際にはここでの私の問題である可能性があります-サンプルコードはアクセスできないglm::lookAt()を使用しているため、マトリックスで完全に間違ったことをしている可能性があります。
次に、ビューマトリックスをY方向に任意の量だけ移動すると(画像の下のコード)、一種の歪んだ立方体が得られます。https://dl.dropbox.com/u/38489921/vbo12.png
//set up view matrix - TODO: problem 1?
Matrix4f view = new Matrix4f();
view.setIdentity();
view.translate(new Vector3f(0.0f, 1.0f, -2f));
view.m13 = 1f;
FloatBuffer viewSend = BufferUtils.createFloatBuffer(16);
view.store(viewSend);
viewSend.flip();
int uniView = glGetUniformLocation(shaderProgram, "view");
glUniformMatrix4(uniView, false, viewSend);
これにより、遠近法の投影に問題があると思いました。そこで、もう少し調査を行い、perspective()関数が正しいことを確認しました。投影の実装にほとんど変更を加えても視覚的な結果は変わらないので、代わりに関数とその使用方法をここで強調します。
//set up projection matrix //TODO: problem 2?
Matrix4f proj = perspective(90f, 600f / 800f, 1f, 10f);
FloatBuffer projSend = BufferUtils.createFloatBuffer(16);
proj.store(projSend);
projSend.flip();
int uniPersp = glGetUniformLocation(shaderProgram, "proj");
glUniformMatrix4(uniPersp, false, projSend);
private Matrix4f perspective(float fov, float aspectRatio, float zNear, float zFar) {
float zm = zFar - zNear;
float zp = zFar + zNear;
Matrix4f persp = new Matrix4f();
persp.m00 = (1 / (float)Math.tan(Math.toRadians(fov / 2))) / aspectRatio;
persp.m11 = 1 / (float)Math.tan(Math.toRadians(fov / 2));
persp.m22 = -zp / zm;
persp.m23 = -1;
persp.m32 = -((2 * zNear * zFar) / zm);
return persp;
}
私の意見では、これは非常に奇妙なエラーであり、私はそれを完全に理解することができません。自分で直そうと研究を重ねた結果、正直脳が痛くなるところまで来たので、助けを求めたいと思いました。
ここでの私の目標は、このエラーの原因、理由、および修正方法を確認することです(必要に応じて、このタイプのエラーが再発しないようにするために使用できる特別なヒントやコツ)。私はどんな助けにも感謝しており、必要なさらなる情報を提供します。
どうもありがとう、-ジョンノ。