Tôi đang cố gắng sử dụng bộ đệm đồng bộ nhưng không hoạt động như dự kiến. Tôi có hai bộ đệm đồng đều, một là ánh sáng và cái còn lại là vật liệu. Vấn đề là màu sắc không phải là những gì chúng được cho là và chúng thay đổi mỗi khi tôi di chuyển máy ảnh. Vấn đề này không tồn tại khi tôi sử dụng đồng phục bình thường. Dưới đây là hình ảnh để hiển thị ý tôi là: When using uniform buffers và when using normal uniforms!Bộ đệm đồng phục OpenGL?
Đây là shader mảnh của tôi:
#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);
}
Tôi không chắc tôi đã làm tất cả mọi thứ đúng, nhưng đây là cách tôi tạo ra bộ đệm đồng phục:
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);
EDIT: Đây là cách tôi lấp đầy bộ đệm:
// 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);
Bạn đã làm gì để gỡ lỗi này? Bạn đã thử in ra những giá trị nào bạn nhận được trong trình đổ bóng (chỉ đơn giản là viết chúng dưới dạng đầu ra của bộ đổ bóng)? Ít nhất với các màu sắc, bạn sẽ có thể thấy giá trị nào không xuất hiện như bạn mong đợi. –
Ngoài ra, mã của bạn sử dụng để điền vào các bộ đệm với các giá trị ở đâu? –
@Gigi: Tôi chưa thấy điều này trên Cat 12.1. Nó có vẻ tốt cho tôi, và tôi sử dụng 2 khối trong shader fragment của tôi. Ngoài ra, bạn đã nộp báo cáo lỗi về điều này chưa? –