मेरे शिखर शेडर है,अंक 3.1
uniform Block1{ vec4 offset_x1; vec4 offset_x2;}block1;
out float value;
in vec4 position;
void main()
{
value = block1.offset_x1.x + block1.offset_x2.x;
gl_Position = position;
}
कोड मैं मान पास करने का उपयोग कर रहा है:
GLfloat color_values[8];// contains valid values
glGenBuffers(1,&buffer_object);
glBindBuffer(GL_UNIFORM_BUFFER,buffer_object);
glBufferData(GL_UNIFORM_BUFFER,sizeof(color_values),color_values,GL_STATIC_DRAW);
glUniformBlockBinding(psId,blockIndex,0);
glBindBufferRange(GL_UNIFORM_BUFFER,0,buffer_object,0,16);
glBindBufferRange(GL_UNIFORM_BUFFER,0,buffer_object,16,16);
यहाँ है कि मैं क्या कर रहा है, 16 बाइट्स पारित करने के लिए उम्मीद कर रहा हूँ प्रत्येक vec4 वर्दी के लिए। मुझे ऑफ़सेट = 16 के लिए GL_INVALID_VALUE त्रुटि मिलती है, आकार = 16. मैं ऑफ़सेट मान से उलझन में हूं। स्पेक का कहना है कि यह "buffer_object" के अनुरूप है।
उत्तर के लिए बहुत बहुत धन्यवाद! मुझे GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT के बारे में पता नहीं था। मैंने पहले से ही अपने आकार (32 बाइट्स) के लिए अपने वर्दी ब्लॉक से पूछताछ की थी, लेकिन मैंने 16 बाइट्स निर्दिष्ट करके सोचा था कि मैं वर्दी ब्लॉक के दूसरे "वीसी 4" घटक के लिए डेटा की आपूर्ति कर सकता हूं, जो मुझे लगता है कि गलत है। मुझे लगता है कि मुझे दूसरे वर्दी के रूप में दूसरे "vec4" घटक का इलाज करना चाहिए। बस जानकारी जोड़ने के लिए, यदि लेआउट std140 नहीं है तो ऑफसेट को GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT का एक बहु होना चाहिए। नतीजतन बाउंड बफर को आकार में GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT का एक से अधिक होना चाहिए। – maverick9888
Cont। - नतीजतन बाउंड बफर को आकार में GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT का एक से अधिक होना चाहिए बशर्ते हम एकाधिक वर्दी ब्लॉक में डेटा की आपूर्ति के लिए एक बफर ऑब्जेक्ट का उपयोग कर रहे हों। – maverick9888
"* यदि लेआउट std140 नहीं है तो ऑफसेट को GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT का एक बहु होना चाहिए। *" नहीं; ऑफ़सेट * हमेशा * उसमें से एक होना चाहिए। 'std140' लेआउट का मतलब है कि आपको बफर के आकार या किसी भी व्यक्तिगत वर्दी के ऑफसेट से पूछताछ नहीं करना है, क्योंकि आप उन्हें सीधे गणना कर सकते हैं। बफर जो भी आकार आप चाहते हैं, लेकिन जब आप किसी सीमा को बांधते हैं, ऑफसेट उस संरेखण का एक बहु होना चाहिए। –