2012-02-06 11 views
6

私は一様なバッファを使用しようとしていますが、想定どおりに動作しません。私は2つの均一なバッファを持っています、一つは照明であり、もう一つは材料です。問題は色が自分のものではなく、カメラを動かすたびに色が変わることです。この問題は、私が通常のユニフォームを使用したときには存在しませんでした。ここに私が意味するものを示す写真があります:When using uniform bufferswhen using normal uniformsOpenGLユニフォームバッファ?

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:私はすべての権利をしますが、ここで私は均一なバッファを作成する方法ですしているか分からない

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

これをデバッグするために何をしましたか?シェーダでどのような値を出力するかを試してみましたか?少なくとも色では、期待どおりにどの値が出てこないかを知ることができます。 –

+0

また、それらのバッファに値を入力するコードはどこにありますか? –

+0

@Gigi:これはCat 12.1では見たことがありません。それは私にとってはうまくいくと思われ、私はフラグメントシェーダで2ブロックを使用します。また、あなたはこれに関するバグレポートを提出していますか? –

答えて

2

私は同じ問題を抱えていましたが、AMD(NVIDIAではない)と同じ問題がありました。面白いのは、問題はビューマトリックスを変更するときにのみ起こったということでした。

私はビューマトリックスの変更に応じて繰り返し可能な問題を抱えていたため、根本的な原因(難しい試行錯誤を繰り返して)を追跡することができました。私のアプリケーションでビューを変更するとき、私は必要なものに応じていくつかのOpenGLリソースを動的に割り当て、解放します。このプロセスでは、バッファ0のglDeleteBuffers()の呼び出しがあります。バッファ0にglDeleteBuffersを呼び出さないように条件文を使用すると、問題は解決しません。

ドキュメントによれば、バッファ0は暗黙のうちにglDeleteBuffersによって無視されます。私の推測では、AMDドライバにはバグがあります。

1

glMapBuffer/glUnmapBufferを使用してバッファを更新してください。