vertex của tôi là,Issue với 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;
}
Mã Tôi đang sử dụng để vượt qua giá trị là:
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);
Dưới đây là những gì tôi đang mong đợi được, để vượt qua 16 byte cho mỗi bộ đồng phục vec4. Tôi nhận được lỗi GL_INVALID_VALUE cho offset = 16, size = 16. Tôi bị nhầm lẫn với giá trị offset. Spec nói rằng nó tương ứng với "buffer_object".
Cảm ơn rất nhiều câu trả lời! Tôi không biết về GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT. Tôi đã truy vấn Block Uniform của mình với kích thước (32 byte), nhưng tôi nghĩ bằng cách chỉ định 16 byte, tôi có thể cung cấp dữ liệu cho thành phần thứ hai "vec4" của Uniform Block, mà tôi đoán là sai. Tôi nghĩ rằng tôi nên xử lý thành phần thứ hai "vec4" như một bộ đồng phục cá nhân. Chỉ cần thêm thông tin, nếu bố cục không phải là std140 thì bù đắp phải là bội số của GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT. Do đó, bộ đệm liên kết cũng phải là bội số của kích thước GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT. – maverick9888
Tiếp theo - Do đó, bộ đệm liên kết cũng phải là bội số của kích thước GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT với điều kiện chúng ta đang sử dụng một đối tượng đệm duy nhất để cung cấp dữ liệu cho nhiều khối đồng nhất. – maverick9888
"* nếu bố cục không phải là std140 thì bù đắp phải là bội số của GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT. *" Không; bù đắp * luôn * phải là bội số của điều đó. Bố cục 'std140' chỉ có nghĩa là bạn không phải truy vấn kích thước bộ đệm hoặc độ lệch của bất kỳ đồng phục riêng lẻ nào, bởi vì bạn có thể tính chúng trực tiếp. Bộ đệm có thể là bất kỳ kích thước nào bạn muốn, nhưng khi bạn liên kết một phạm vi, thì độ lệch phải là bội số của căn chỉnh đó. –