1

ここに画像の説明を入力

私のプログラムが 1 つの三角形を描画する方法に注目してください。ただし、代わりに、コードで表現しようとしているのは正方形を描画することです。私のtri_indiciesインデックス バッファ オブジェクトは、正方形が描画されるようにこれらの要素を正しく順序付けていると思いますが、プログラムを実行すると、定義した描画順序がtri_indiciesウィンドウに反映されません。tri_indicies要素の順序を変更してもレンダリングされた出力に影響しないにもかかわらず、エラーの原因が.

私のプログラムでは、特に VertexBuffer、VertexArray、および IndexBuffer に対して抽象化を使用しています。詳細は以下で説明します。

const int buffer_object_size = 8;
const int index_buffer_object_size = 6;
float tri_verticies[buffer_object_size] = {
    -0.7f, -0.7f, // 0
     0.7f, -0.7f, // 1
     0.7f,  0.7f, // 2
    -0.7f,  0.7f  // 3
};
unsigned int tri_indicies[index_buffer_object_size] = {
    0, 1, 2,
    2, 3, 0
};

VertexArray vertexArray;                
VertexBuffer vertexBuffer(tri_verticies, buffer_object_size * sizeof(float)); // no call vertexBuffer.bind() constructor does it    

VertexBufferLayout vertexBufferLayout;
vertexBufferLayout.push<float>(3);
vertexArray.add_buffer(vertexBuffer, vertexBufferLayout);

IndexBuffer indexBuffer(tri_indicies, index_buffer_object_size);        

ShaderManager shaderManager;
ShaderSource shaderSource = shaderManager.parse_shader("BasicUniform.shader");  // ensure debug working dir is relative to $(ProjectDir)
unsigned int shader = shaderManager.create_shader(shaderSource.vertex_source, shaderSource.fragment_source);
MyGLCall(glUseProgram(shader));

メインの後半で、正方形を画面に描画し、 と の間で青色の値をフェードさせるループが1.0fあり0.0fます。

while (!glfwWindowShouldClose(window))
{
    MyGLCall(glClear(GL_COLOR_BUFFER_BIT));

    vertexArray.bind();
    indexBuffer.bind();

    MyGLCall(glDrawElements(GL_TRIANGLES, index_buffer_object_size, GL_UNSIGNED_INT, nullptr)); // nullptr since we bind buffers using glGenBuffers

    if (blue > 1.0f) {
        increment_color = -0.05f;
    }
    else if (blue < 0.0f) {
        increment_color = 0.05f;
    }

    blue += increment_color;

    glfwSwapBuffers(window);
    glfwPollEvents();
}
4

1 に答える 1

2

配列tri_verticiesは、2 つのコンポーネントを持つ頂点座標で構成されます(x, y)。したがって、一般的な頂点属性データの配列を指定するためのタプル サイズは、3 ではなく 2 にする必要があります。

vertexBufferLayout.push<float>(3);
vertexBufferLayout.push<float>(2);

実際に行うことは、次の座標で配列を指定することです。

-0.7, -0.7,  0.7 // 0
-0.7,  0.7,  0.7 // 1
 ???,  ???,  ??? // 2
 ???,  ???,  ??? // 3

一般に、バッファ オブジェクトへの範囲外アクセスの結果は未定義です。OpenGL 4.6 API コア プロファイル仕様 - 6.4 外部バッファ境界へのアクセスの影響、79 ページを参照してください

于 2019-09-28T16:49:42.173 に答える