Buscar..


Introducción

La creación de instancias es una técnica de representación que nos permite dibujar varias copias del mismo objeto en una llamada de sorteo. Generalmente se usa para hacer partículas, follaje o grandes cantidades de cualquier otro tipo de objetos.

Instancing by Vertex Attribute Arrays

3.3

La creación de instancias se puede realizar a través de modificaciones en la forma en que se proporcionan los atributos de vértice al sombreado de vértice. Esto introduce una nueva forma de acceder a las matrices de atributos, permitiéndoles proporcionar datos por instancia que parecen un atributo regular.

Una sola instancia representa un objeto o grupo de vértices (una hoja de hierba, etc.). Los atributos asociados con matrices de instancias solo avanzan entre las instancias; a diferencia de los atributos de vértice regular, no obtienen un nuevo valor por vértice.

Para especificar que una matriz de atributos es instanciada, use esta llamada:

glVertexAttribDivisor(attributeIndex, 1);

Esto establece el estado del objeto de matriz de vértice. El "1" significa que el atributo es avanzado para cada instancia. Al pasar un 0 se desactiva la creación de instancias para el atributo.

En el sombreador, el atributo instanciado se parece a cualquier otro atributo de vértice:

in vec3 your_instanced_attribute;

Para representar varias instancias, puede invocar una de las formas Instanced del valor de las llamadas glDraw* . Por ejemplo, esto dibujará 1000 instancias, y cada instancia constará de 3 vértices:

glDrawArraysInstanced(GL_TRIANGLES, 0, 3, 1000); 

Código de matriz instanciado

Configuración de VAOs, VBOs y los atributos:

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

Dibujar llamada:

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

Sombreador de vértices:

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

Sombreador de fragmentos:

#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
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow