수색…


소개

Instancing은 하나의 드로 콜에서 같은 오브젝트의 여러 복사본을 그릴 수있는 렌더링 기술입니다. 그것은 보통 입자, 단풍 또는 다량의 다른 유형의 객체를 렌더링하는 데 사용됩니다.

정점 속성 배열에 의한 인스턴스화

3.3

인스턴스화는 버텍스 쉐이더에 버텍스 애트리뷰트가 어떻게 제공되는지에 대한 수정을 통해 수행 될 수 있습니다. 이로써 속성 배열에 액세스하는 새로운 방법이 도입되어 일반 속성처럼 보이는 인스턴스 별 데이터를 제공 할 수 있습니다.

단일 인스턴스는 하나의 객체 또는 정점 그룹 (하나의 잔디 잎 등)을 나타냅니다. 인스턴스 배열과 관련된 속성은 인스턴스간에 만 진행됩니다. 일반 정점 속성과는 달리 정점마다 새로운 값을 얻지 못합니다.

속성 배열이 인스턴스화되도록 (듯이) 지정하려면, 다음의 호출을 사용합니다.

glVertexAttribDivisor(attributeIndex, 1);

이것은 정점 배열 객체 상태를 설정합니다. "1"은 각 인스턴스에 대해 속성이 고급임을의 L합니다. 0을 전달하면 속성의 인스턴스가 해제됩니다.

셰이더에서 인스턴스 속성은 다른 모든 정점 속성과 비슷합니다.

in vec3 your_instanced_attribute;

여러 인스턴스를 렌더링하려면, 당신은 하나 호출 할 수있는 Instanced 값의 형태 glDraw* 전화를. 예를 들어 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