サーチ…


前書き

インスタンス化とは、1回の描画呼び出しで同じオブジェクトの複数のコピーを描画するレンダリング手法です。これは、通常、粒子、葉、または他の種類のオブジェクトの大量をレンダリングするために使用されます。

頂点属性配列によるインスタンス化

3.3

インスタンス化は、頂点シェーダに頂点属性がどのように提供されるかを変更することによって行うことができます。これにより、属性配列にアクセスする新しい方法が導入され、通常の属性のようなインスタンス単位のデータを提供できます。

1つのインスタンスは、1つのオブジェクトまたは頂点のグループ(1つの草の葉など)を表します。インスタンス化された配列に関連付けられた属性は、インスタンス間でのみ進みます。通常の頂点属性とは異なり、頂点ごとに新しい値を取得しません。

属性配列がインスタンス化されるように指定するには、次の呼び出しを使用します。

glVertexAttribDivisor(attributeIndex, 1);

これは、頂点配列オブジェクトの状態を設定します。 「1」は、インスタンスごとに属性が進められていることを意味します。 0を渡すと、属性のインスタンス化がオフになります。

シェーダでは、インスタンス化された属性は他の頂点属性のように見えます。

in vec3 your_instanced_attribute;

複数のインスタンスをレンダリングするには、値glDraw* Instancedフォームの1つを呼び出します。たとえば、1000個のインスタンスが描画され、各インスタンスは3つの頂点で構成されます。

glDrawArraysInstanced(GL_TRIANGLES, 0, 3, 1000); 

インスタンス化された配列コード

VAO、VBO、および属性の設定:

// List of 10 triangle x-offsets (translations)
GLfloat translations[10];
GLint index = 0;
for (GLint x = 0; x < 10; x++)
{
    translations[index++] = (GLfloat)x / 10.0f;
}

// vertices
GLfloat vertices[] = {
     0.0f,   0.05f,
     0.05f, -0.05f, 
    -0.05f, -0.05f,
     0.0f,  -0.1f,
};

// Setting VAOs and VBOs
GLuint meshVAO, vertexVBO, instanceVBO;
glGenVertexArrays(1, &meshVAO);    
glGenBuffers(1, &instanceVBO);
glGenBuffers(1, &vertexVBO);

glBindVertexArray(meshVAO);

    glBindBuffer(GL_ARRAY_BUFFER, vertexVBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GLfloat), (GLvoid*)0);

    glBindBuffer(GL_ARRAY_BUFFER, instanceVBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(translations), translations, GL_STATIC_DRAW);
    glEnableVertexAttribArray(1);
    glVertexAttribPointer(1, 1, GL_FLOAT, GL_FALSE, sizeof(GLfloat), (GLvoid*)0);
    glVertexAttribDivisor(1, 1); // This sets the vertex attribute to instanced attribute.

    glBindBuffer(GL_ARRAY_BUFFER, 0);

glBindVertexArray(0);

ドローコール:

glBindVertexArray(meshVAO);
glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, 4, 10); // 10 diamonds, 4 vertices per instance
glBindVertexArray(0);

頂点シェーダ:

#version 330 core
layout(location = 0) in vec2 position;
layout(location = 1) in float offset;

void main()
{
    gl_Position = vec4(position.x + offset, position.y, 0.0, 1.0);
}

フラグメントシェーダ:

#version 330 core
layout(location = 0) out vec4 color;

void main()
{
    color = vec4(1.0, 1.0, 1.0, 1.0f);
}


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow