私は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は上記の呼び出しを行います。投影行列をリセットして、後で描画呼び出しに影響を与えないようにします。この後、FloatBuffer
projectionBuffer
を、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
など)を使用してシェイプを描画できます。私は何が間違っているのか分かりません。