खोज…


परिचय

इंस्टेंडिंग एक रेंडरिंग तकनीक है जो हमें एक ही कॉल में एक ही ऑब्जेक्ट की कई प्रतियाँ खींचने की अनुमति देती है। यह आमतौर पर कणों, पत्ते या किसी अन्य प्रकार की बड़ी मात्रा में रेंडर करने के लिए उपयोग किया जाता है।

वर्टेक्स एट्रीब्यूट एरर्स द्वारा प्रस्तुत करना

3.3

संशोधन के माध्यम से किया जा सकता है कि कैसे वर्टेक्स शायर को वर्टेक्स विशेषताएँ प्रदान की जाती हैं। यह विशेषता सरणियों तक पहुंचने का एक नया तरीका पेश करता है, जिससे उन्हें प्रति-आवृत्ति डेटा प्रदान करने की अनुमति मिलती है जो एक नियमित विशेषता की तरह दिखता है।

एक एकल उदाहरण एक वस्तु या समूह का प्रतिनिधित्व करता है (एक घास का पत्ता आदि)। केवल उदाहरणों के बीच अग्रिम सरणियों से जुड़े गुण; नियमित रूप से शीर्ष गुण के विपरीत, उन्हें एक नया मान प्रति-शीर्ष नहीं मिलता है।

यह निर्दिष्ट करने के लिए कि एक विशेषता सरणी इंस्टेंट है, इस कॉल का उपयोग करें:

glVertexAttribDivisor(attributeIndex, 1);

यह वर्टेक्स एरे ऑब्जेक्ट ऑब्जेक्ट सेट करता है। "1" का अर्थ है कि विशेषता प्रत्येक उदाहरण के लिए उन्नत है। 0 पास करना विशेषता के लिए इंस्टेंस को बंद करता है।

Shader में, इंस्टेंट विशेषता किसी भी अन्य शीर्ष विशेषता की तरह दिखती है:

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