수색…
소개
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