मैं वर्दी बफर का उपयोग करने की कोशिश कर रहा हूं लेकिन यह माना जाता है कि यह काम नहीं करता है। मेरे पास दो वर्दी बफर हैं, एक प्रकाश है और दूसरा सामग्री के लिए है। समस्या यह है कि रंग वह नहीं होते हैं जो उन्हें माना जाता है और जब भी मैं कैमरे को ले जाता हूं तो वे बदल जाते हैं। जब मैं सामान्य वर्दी का इस्तेमाल करता था तो यह समस्या मौजूद नहीं थी। यह दिखाने के लिए यहां चित्र हैं कि मेरा क्या मतलब है: When using uniform buffers और when using normal uniforms!ओपनजीएल वर्दी बफर?
यह मेरा टुकड़ा शेडर है:
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);
संपादित करें:
#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);
}
मुझे यकीन है कि मैं सब कुछ किया है सही, लेकिन यहाँ मैं कैसे वर्दी बफ़र्स बनाने है नहीं कर रहा हूँ यहाँ कैसे मैं भर है बफर:
// 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);
आपने इसे डीबग करने के लिए क्या किया है? क्या आपने शेडर में क्या मूल्य प्राप्त किए हैं (केवल उन्हें टुकड़े शेडर आउटपुट के रूप में लिखकर) प्रिंट करने का प्रयास किया है? कम से कम रंगों के साथ, आप यह देखने में सक्षम होना चाहिए कि आप कौन से मूल्यों की अपेक्षा नहीं कर रहे हैं। –
साथ ही, वह कोड कहां है जिसका उपयोग आप उन बफर को मानों के साथ भरने के लिए करते हैं? –
@ गीगी: मैंने इसे बिल्ली 12.1 पर नहीं देखा है। ऐसा लगता है कि मेरे लिए ठीक काम करता है, और मैं अपने टुकड़े टुकड़े में 2 ब्लॉक का उपयोग करता हूं। इसके अलावा, क्या आपने इस पर बग रिपोर्ट दायर की है? –