2012-02-06 14 views
6

मैं वर्दी बफर का उपयोग करने की कोशिश कर रहा हूं लेकिन यह माना जाता है कि यह काम नहीं करता है। मेरे पास दो वर्दी बफर हैं, एक प्रकाश है और दूसरा सामग्री के लिए है। समस्या यह है कि रंग वह नहीं होते हैं जो उन्हें माना जाता है और जब भी मैं कैमरे को ले जाता हूं तो वे बदल जाते हैं। जब मैं सामान्य वर्दी का इस्तेमाल करता था तो यह समस्या मौजूद नहीं थी। यह दिखाने के लिए यहां चित्र हैं कि मेरा क्या मतलब है: When using uniform buffers और when using normal uniforms!ओपनजीएल वर्दी बफर?

यह मेरा टुकड़ा शेडर है:

glGenBuffers(1, &light_buffer); 
glGenBuffers(1, &material_buffer); 

glBindBuffer(GL_UNIFORM_BUFFER, light_buffer); 
glBufferData(GL_UNIFORM_BUFFER, sizeof(LightBlock), nullptr, GL_DYNAMIC_DRAW); 

glBindBuffer(GL_UNIFORM_BUFFER, material_buffer); 
glBufferData(GL_UNIFORM_BUFFER, sizeof(MaterialBlock), nullptr, GL_DYNAMIC_DRAW); 

GLuint program = Shaders.GetProgram(); 

light_index = glGetUniformBlockIndex(program, "LightBlock"); 
material_index = glGetUniformBlockIndex(program, "MaterialBlock"); 

glUniformBlockBinding(program, light_index, 0); 
glUniformBlockBinding(program, material_index, 1); 

glBindBufferBase(GL_UNIFORM_BUFFER, 0, light_buffer); 
glBindBufferBase(GL_UNIFORM_BUFFER, 1, material_buffer); 

संपादित करें:

#version 400 // Fragment Shader 
uniform layout(std140); 

in vec3 EyePosition; 
in vec3 EyeNormal; 
in vec2 TexCoord; 

out vec4 FragColor; 

uniform sampler2D Texture; 

uniform LightBlock 
{ 
    vec4 Position; 
    vec4 Intensity; 
} Light; 

uniform MaterialBlock 
{ 
    vec4 Ambient; 
    vec4 Diffuse; 
} Material; 

vec4 PointLight(in int i, in vec3 ECPosition, in vec3 ECNormal) 
{ 
    vec3 n = normalize(ECNormal); 
    vec3 s = normalize(Light.Position.xyz - ECPosition); 

    return Light.Intensity * (Material.Ambient + Material.Diffuse * max(dot(s, n), 0.0)); 
} 

void main() 
{ 
    FragColor = texture(Texture, TexCoord); 
    FragColor *= PointLight(0, EyePosition, EyeNormal); 
} 

मुझे यकीन है कि मैं सब कुछ किया है सही, लेकिन यहाँ मैं कैसे वर्दी बफ़र्स बनाने है नहीं कर रहा हूँ यहाँ कैसे मैं भर है बफर:

// Global structures 
struct LightBlock 
{ 
    Vector4 Position; // Vector4 is a vector class I made 
    Vector4 Intensity; 
}; 

struct MaterialBlock 
{ 
    Vector4 Ambient; 
    Vector4 Diffuse; 
}; 

// This is called for every object rendered 
LightBlock Light; 
Light.Position = Vector3(0.0f, 5.0f, 5.0f) * Camera.GetCameraMatrix(); 
Light.Intensity = Vector4(1.0f); 

glBindBuffer(GL_UNIFORM_BUFFER, light_buffer); 
glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(LightBlock), &Light); 

MaterialBlock Material; 
Material.Diffuse = Vector4(1.0f); 
Material.Ambient = Material.Diffuse * Vector4(0.3f); 

glBindBuffer(GL_UNIFORM_BUFFER, material_buffer); 
glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(MaterialBlock), &Material); 
+0

आपने इसे डीबग करने के लिए क्या किया है? क्या आपने शेडर में क्या मूल्य प्राप्त किए हैं (केवल उन्हें टुकड़े शेडर आउटपुट के रूप में लिखकर) प्रिंट करने का प्रयास किया है? कम से कम रंगों के साथ, आप यह देखने में सक्षम होना चाहिए कि आप कौन से मूल्यों की अपेक्षा नहीं कर रहे हैं। –

+0

साथ ही, वह कोड कहां है जिसका उपयोग आप उन बफर को मानों के साथ भरने के लिए करते हैं? –

+0

@ गीगी: मैंने इसे बिल्ली 12.1 पर नहीं देखा है। ऐसा लगता है कि मेरे लिए ठीक काम करता है, और मैं अपने टुकड़े टुकड़े में 2 ब्लॉक का उपयोग करता हूं। इसके अलावा, क्या आपने इस पर बग रिपोर्ट दायर की है? –

उत्तर

2

मुझे एक ही समस्या थी, लेकिन केवल एएमडी (एनवीआईडीआईए नहीं) के साथ। मजाकिया बात यह थी कि दृश्य मैट्रिक्स को बदलते समय समस्या ही हुई।

चूंकि दृश्य दृश्य मैट्रिक्स के परिवर्तन के आधार पर मुझे दोहराने योग्य समस्या थी, इसलिए मैं मूल कारण (कठिन परीक्षण और त्रुटि कर रहा हूं) का पता लगाने में सक्षम था। मेरे आवेदन में दृश्य को बदलते समय, मैं आवश्यकतानुसार कुछ ओपनजीएल संसाधन आवंटित और मुक्त करता हूं। इस प्रक्रिया में, बफर 0 के लिए glDeleteBuffers() पर एक कॉल है। यदि मैं एक सशर्त कथन का उपयोग करता हूं ताकि बफर 0 के लिए glDeleteBuffers को कॉल न करें, तो समस्या दूर हो जाती है।

दस्तावेज़ीकरण के अनुसार, glDeleteBuffers द्वारा बफर 0 को चुपचाप अनदेखा कर दिया जाएगा। मेरा अनुमान है कि एएमडी ड्राइवरों में एक बग है।

1

glMapBuffer/glUnmapBuffer का उपयोग करके बफर को अपडेट करने का प्रयास करें।

संबंधित मुद्दे