librocket (HTML からメッシュを生成する UI ライブラリ) の実装を始めたばかりで、要件の 1 つはRenderInterface
. ライブラリは基本的にRenderInterface
、生成されたメッシュから継承するクラスを送信し、メッシュを保存してから、この生成されたメッシュをレンダリングしてもらいます。サードパーティのライブラリ用に独自のレンダリング システムを実装する機会があるので、いいですね。しかし、私の問題はおそらくライブラリとは何の関係もありません。
私が言ったように、ライブラリはメッシュを私のクラスに送信します:
GLuint m_BufferID[2];
//...
glGenBuffers(2, m_BufferID);
//..
glBindBuffer(GL_ARRAY_BUFFER, m_BufferID[0]);
glBufferData(GL_ARRAY_BUFFER, size, data, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_BufferID[1]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, size, data, GL_STATIC_DRAW);
これは基本的に、Lib がメッシュを送信したときに発生します。実際にはテクスチャなどもロードしますが、これは現時点では重要ではありません。(注: data は ROCKET_LIB::Vertex の配列へのポインタです)
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(ROCKET_CORE::Vertex), (GLvoid*)offsetof(Rocket::Core::Vertex, position));
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ROCKET_CORE::Vertex), (GLvoid*)offsetof(Rocket::Core::Vertex, colour));
glEnableVertexAttribArray(2);
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(ROCKET_CORE::Vertex), (GLvoid*)offsetof(Rocket::Core::Vertex, tex_coord));
glUniformMatrix4fv(0, 1, GL_FALSE, &m_TransMatrix[0][0]);
glUniform2f(1, translation.x, translation.y);
glActiveTexture(GL_TEXTURE0);
glBindBuffer(GL_ARRAY_BUFFER, m_BufferID[0]);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_BufferID[1]);
glDrawElements(GL_TRIANGLES, m_indices_count, GL_UNSIGNED_INT, NULL);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(2);
メッシュが GPU にアップロードされた後、上位のコードでレンダリングします。この質問を完了するために、ここに私のシェーダーがあります:
頂点シェーダー:
#version 330
layout(location = 0) in vec2 inPosition;
layout(location = 1) in vec4 inColor;
layout(location = 2) in vec2 inTexCoord;
out vec4 fragColor;
out vec2 fragTexCoord;
layout(location = 0) uniform mat4 m_Ortho;
layout(location = 1) uniform vec2 m_Translation;
void main()
{
// Setting out values
fragColor = inColor;
fragTexCoord = inTexCoord;
// Settings transformed position
gl_Position = vec4(inPosition + m_Translation, 1.0f, 1.0f) * m_Ortho;
}
フラグメント シェーダー:
#version 330
in vec4 fragColor;
in vec2 fragTexCoord;
out vec4 outColor;
layout (location = 2) uniform sampler2D m_TextureSampler;
void main()
{
// Just for testing purpose show the text coord as color
outColor = vec4(fragTexCoord, 0.0f, 1.0f);
}
ああ、私は単純に行列を生成します:
glm::ortho(0.0f, static_cast<float>(m_Width), static_cast<float>(m_Height), 0.0f, -1.0f, 1.0f);
DirectX から、行列を転置する必要があることを知り、opengl でもそれを試しましたが、最終的にはどちらの結果も奇妙でした。これは、何かが間違いなく正しくないことを示すスクリーンショットです。(ワイヤーフレームが有効化されています)