mio vertex shader è,Problema con glBindBufferRange() OpenGL 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;
}
Il codice che sto usando per passare i valori è:
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);
Ecco quello che mi aspetto è, a passare 16 byte per ogni uniforme vec4. Ottengo GL_INVALID_VALUE errore per offset = 16, dimensione = 16. Sono confuso con il valore di offset. Spec afferma che è corrispondente a "buffer_object".
Grazie mille per la risposta! Non ero a conoscenza di GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT. Avevo già interrogato il mio Uniform Block per le sue dimensioni (32 byte), ma ho pensato specificando 16 byte che potevo fornire i dati per il secondo componente "vec4" di Uniform Block, che presumo sia sbagliato. Penso che dovrei trattare il secondo componente "vec4" come un'uniforme individuale. Solo per aggiungere informazioni, se il layout non è std140 allora l'offset deve essere un multiplo di GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT. Di conseguenza, anche il buffer associato deve essere un multiplo di GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT nella dimensione. – maverick9888
cont. - Di conseguenza, anche il buffer associato deve essere un multiplo di GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT di dimensioni, a condizione che si utilizzi un singolo oggetto buffer per fornire dati a più blocchi uniformi. – maverick9888
"* se il layout non è std140, l'offset deve essere un multiplo di GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT. *" No; l'offset * sempre * deve essere un multiplo di quello. Il layout 'std140' significa semplicemente che non devi interrogare la dimensione del buffer o l'offset delle singole uniformi, perché puoi calcolarle direttamente. Il buffer può essere di qualsiasi dimensione, ma quando si associa un intervallo, l'offset deve essere un multiplo di tale allineamento. –