Sök…


Introduktion

Instancing är en renderingsteknik som gör att vi kan rita flera kopior av samma objekt i ett samtal. Det används vanligtvis för att återge partiklar, bladverk eller stora mängder av andra typer av föremål.

Instancing by Vertex Attribute Arrays

3,3

Instansering kan göras via modifieringar av hur vertexattribut tillhandahålls till toppskärmaren. Detta introducerar ett nytt sätt att få åtkomst till attributuppsättningar, vilket gör att de kan tillhandahålla data per instans som ser ut som ett vanligt attribut.

En enstaka instans representerar ett objekt eller en grupp vertikaler (ett gräsblad etc.). Attribut förknippade med instanserade matriser går bara mellan instanser; till skillnad från vanliga vertexattribut får de inte ett nytt värde per vertex.

För att ange att en attributuppsättning är inställd använder du detta samtal:

glVertexAttribDivisor(attributeIndex, 1);

Detta ställer in toppstatusobjekttillstånd. "1" betyder att attributet är avancerat för varje instans. Att passera en 0 stängs av inställningen för attributet.

I raderaren ser det instansade attributet ut som alla andra toppunktattribut:

in vec3 your_instanced_attribute;

För att återge flera instanser kan du åberopa en av de Instanced formerna för värdet glDraw* . Till exempel kommer detta att rita 1000 instanser, där varje instans består av 3 vertikaler:

glDrawArraysInstanced(GL_TRIANGLES, 0, 3, 1000); 

Instanced Array Code

Ställa in VAO, VBO och attribut:

// 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);

Ringa samtal:

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

Vertex skuggare:

#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);
}

Fragment shader:

#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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow