1

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 でもそれを試しましたが、最終的にはどちらの結果も奇妙でした。これは、何かが間違いなく正しくないことを示すスクリーンショットです。(ワイヤーフレームが有効化されています) ここに画像の説明を入力

4

1 に答える 1

1

これが確かにあなたの実際の問題であるとは言えませんが、それ問題です:

#version 330

layout(location = 0) uniform mat4 m_Ortho;
layout(location = 1) uniform vec2 m_Translation;

この 2 つのことは両立しません。均一な場所の明示的な割り当ては、OpenGL 4.3 の機能です。また、GLSL バージョン 3.30 は OpenGL 3.3 に対応しています。

現在、3.3 対応のドライバーでこの機能が公開される可能性があります。ただし、拡張機能として公開されます。したがって、拡張機能のように有効にする必要があります。

#version 330
#extension ARB_explicit_uniform_location : require

明らかに、このようなシェーダーは、この拡張機能が利用可能な場合にのみコンパイルされます。

于 2013-05-17T02:29:09.617 に答える