मैं एकसमान ब्लॉक स्थापित करने की कोशिश कर रहा हूं और glUniformBlockBinding() और glBindBufferRange() के बारे में बहुत भ्रमित हो गया हूं। सोचो: glBindProgramPipeline() glUniformBlockBinding() के साथ। मैं ओपनजीएल 4.5 कोर प्रोफाइल सुविधाओं का उपयोग कर रहा हूं।

एक उदाहरण के रूप में पोस्ट प्रोसेसिंग के लिए तीन शेडर चरण, एक शीर्ष और दो टुकड़े हैं:

//Vertex shader A:
#version 450 core
layout(std140) uniform Camera {
    mat4 Projection;
    mat4 Modelview;
};
const vec2 TexCoords[] = {
    { 0.f, 0.f },
    { 1.f, 0.f },
    { 1.f, 1.f },
    { 0.f, 1.f }};
out VertexData {
    smooth vec2 TexCoord;
} vs;
void main() {
    float xw = 400.0, yh = 300.0;
    vec2 vertices[] = {
        { -xw, -yh },
        { xw, -yh },
        { xw, yh },
        { -xw, yh }};
    vec4 vpos = vec4(vertices[gl_VertexID % 4], 0.0, 1.0);
    gl_Position = Projection * Modelview * vpos;
    vs.TexCoord = TexCoords[gl_VertexID % 4];
}

// Post processing Fragment shader skeleton:
#version 450 core
in VertexData {
    smooth vec2 TexCoord;
} fs;
layout(location=0) out vec4 FragData[2];
uniform sampler2D Texture[2];
layout(std140) uniform Effect {
    int FragIndex;
    int MaxWeights;
    float Weights[64];
    vec2 BlurXY;
};
void main() {
    FragData[FragIndex] = texture(Texture[1 - FragIndex], fs.TexCoord);
}

मैं केवल एक यूबीओ बफर का उपयोग करके समान ब्लॉक के ऊपर कैसे सेटअप करूं?

1
JATothrim 13 अप्रैल 2020, 07:31

1 उत्तर

सबसे बढ़िया उत्तर

आप नहीं कर सकते। या कम से कम, उस तरह से नहीं जैसा आपका मतलब है।

आप वास्तव में एक ही बफर ऑब्जेक्ट में इन तीन शेडर्स के लिए सभी समान डेटा डाल सकते हैं। आपको यह सुनिश्चित करना होगा कि प्रत्येक ब्लॉक के डेटा की शुरुआत के लिए संरेखण कार्यान्वयन-परिभाषित से मेल खाता है यूबीओ के लिए निर्दिष्ट संरेखण आवश्यकताएं (GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT के माध्यम से पूछताछ की गई), लेकिन उससे आगे, आप ठीक हैं।

हालांकि, प्रत्येक शेडर के उपयोग के बीच glBindBufferRange को कॉल करने से बचने का कोई तरीका नहीं है। भले ही आप सभी ब्लॉक के लिए एक ही इंडेक्स पर ब्लॉक बाइंडिंग इंडेक्स सेट करें। भले ही आप हर बार एक ही बफर को बाध्य कर रहे हों। इसका कारण यह है कि आपको बफ़र से भिन्न श्रेणी का चयन करना होगा, क्योंकि सभी ब्लॉक अलग-अलग हैं और अलग-अलग डेटा संग्रहीत कर रहे हैं।

3
marc_s 13 अप्रैल 2020, 10:06