2017-05-14 9 views
1

私は2DレンダリングにOpenGLを使用しており、実際のピクセル座標を使用したいと考えています。これは、ウィンドウの左上に(0,0)を、ウィンドウの右下に(width、height)を置くことを意味します(幅と高さはウィンドウの大きさをピクセル単位で表します)。 )。これを行うために、私はglOrthoで生成された射影行列を使用し、その後、頂点シェーダに渡さ:OpenGL 2D投影行列に何も描画されていない

GL11.glViewport(0, 0, width, height); 
GL11.glDisable(GL11.GL_DEPTH_TEST); 
GL11.glMatrixMode(GL11.GL_PROJECTION); 
GL11.glOrtho(0f, width, height, 0f, -1f, 1f); 
GL11.glGetFloat(GL11.GL_PROJECTION_MATRIX, projectionBuffer); 
GL11.glLoadIdentity(); 

私が使用して2D正投影行列を得るようにGLMのバインディングを有していないLWJGLを、使用していOpenGLは上記の呼び出しを行います。投影行列をリセットして、後で描画呼び出しに影響を与えないようにします。この後、FloatBufferprojectionBufferを、glOrthoによって生成された投影行列が充填されています。

このようなルックスを生成射影行列(これは便利です場合、私は知らない):

0.0015625 0.0 0.0 1.0 
0.0 -0.0027777778 0.0 -1.0 
0.0 0.0 -1.0 0.0 
0.0 0.0 0.0 1.0 

マイ頂点シェーダは、次のようになります。私はシェーダを初期化すると、

#version 330 core 

layout (location = 0) in vec4 vertex; 

out vec2 TexCoords; 

uniform mat4 model; 
uniform mat4 projection = mat4(1.0); 

void main() 
{ 
    TexCoords = vertex.zw; 
    gl_Position = projection * model * vec4(vertex.x, vertex.y, 0.0, 1.0); 
} 

私はglUniformMatrix4を使って投影行列の値を設定します。私は、glGetUniformを使ったときと同じ投影行列を返すので、これがうまくいくと確信しています。

モデル行列は、すべてのテクスチャクワッドを描画するときに生成されます。各クワッドは、同じVAO内の単一のVBOにすべて格納されている同じ頂点とuvを共有します。頂点データは描画される各クワッド間で共有され、異なるモデルマトリックスがそれぞれに適用されます。モデルマトリックスは、実際のスクリーン座標を生成するために正しく計算されます。例えば、(0,0)で、その左上の正方形128の幅/高さは、以下のモデル行列を生成する:

128.0 0.0 0.0 0.0 
0.0 128.0 0.0 0.0 
0.0 0.0 1.0 0.0 
0.0 0.0 0.0 1.0 

このモデル行列はglUniformMatrix4を使用して正常シェーダーに渡され、私がチェックしていますこの。クワッドの頂点データと共有VAOを初期化する

は、私は次のコードを使用し

vao = GL30.glGenVertexArrays(); 
int vbo = GL15.glGenBuffers(); 
GL30.glBindVertexArray(vao); 
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); 
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, QUAD_BUFFER, GL15.GL_STATIC_DRAW); 

GL20.glEnableVertexAttribArray(0); 
GL20.glVertexAttribPointer(0, 4, GL11.GL_FLOAT, false, 16, 0); 
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); 
GL30.glBindVertexArray(0); 

QUAD_BUFFERを頂点及びテクスチャ座標データを含むfloat[]を指します。

は最後に、テクスチャクワッドを描画するために、私は次のようにします。

shader.setMatrix4f("model", model);//Makes a call to glUniformMatrix4 - model is the model matrix as explained above. 
GL13.glActiveTexture(GL13.GL_TEXTURE0); 
texture.bind(); 
GL30.glBindVertexArray(vao); 
GL11.glDrawArrays(GL11.GL_TRIANGLES, 0, 6); 

問題は、私はアプリケーションを実行すると、何も画面上に描画されていない、です。それは完全に黒のままです。シェーダを使用しないときは、古いメソッド(glBeginなど)を使用してシェイプを描画できます。私は何が間違っているのか分かりません。

答えて

0

私は、Javaゲーミングフォーラムで誰かに感謝してこの問題を解決することができました。彼はglOrthoを呼び出すと既存の行列が変更されるので、glOrthoを呼び出す前にglLoadIdentityを呼び出す必要があることを指摘しました。とにかくこれらの計算のためにglmのjavaポートを使用するように切り替えました。

関連する問題