2012-02-06 38 views
6

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 bufferswhen 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); 
+0

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. –

+0

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? –

+0

@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? –

Trả lời

2

Tôi gặp vấn đề tương tự, nhưng chỉ với AMD (không phải NVIDIA). Điều buồn cười là vấn đề chỉ xảy ra khi thay đổi ma trận khung nhìn.

Vì tôi đã gặp sự cố lặp lại tùy thuộc vào thay đổi ma trận chế độ xem, tôi có thể theo dõi nguyên nhân gốc rễ (thực hiện thử và lỗi khó khăn). Khi thay đổi chế độ xem trong ứng dụng của tôi, tôi phân bổ và giải phóng một số tài nguyên OpenGL tùy thuộc vào những gì cần thiết. Trong quá trình này, có một cuộc gọi đến glDeleteBuffers() cho bộ đệm 0. Nếu tôi sử dụng một câu lệnh có điều kiện để không gọi glDeleteBuffers cho buffer 0, thì vấn đề sẽ biến mất.

Theo tài liệu, bộ đệm 0 sẽ bị bỏ qua âm thầm bởi glDeleteBuffers. Tôi đoán là có một lỗi trong trình điều khiển AMD.

1

Cố gắng cập nhật bộ đệm bằng cách sử dụng glMapBuffer/glUnmapBuffer.

Các vấn đề liên quan