ParticlePeter
12-21-2011, 07:31 AM
Hi,
I don't manage to get UBOs to work. I think I set up everything properly as I don't get any GL Errors. In my update code I can query the value(s) of the uniform buffer, but my Shader does not react to this value(s). I am trying this with just one float, one VertexArrayObject and one program for debugging purpose, but I also failed with float[4] uniform and vec4 respectively ( just in case I am not getting std140 right ).
What do I miss ?
Vertex Shader:
#version 330 core
// Uniforms
layout( std140 ) uniform Common {
float Time ;
} ;
// Input Attribs
in vec3 inVertex ;
// Main
void main( void ) {
vec3 pos = inVertex ;
pos.x += sin( Time ) ;
gl_Position = vec4( pos , 1.0 ) ;
}
Setup:
// Time is a class member
glGenBuffers( 1 , & uboName );
glBindBuffer( GL_UNIFORM_BUFFER , uboName ) ;
glBufferData( GL_UNIFORM_BUFFER , sizeof( Time ) , NULL , GL_DYNAMIC_DRAW ) ;
// programName is a class member storing the compiled program id
GLint uboBlockIndex = glGetUniformBlockIndex( programName , "Common" ) ;
glUniformBlockBinding( programName , uboBlockIndex , uboName ) ;
glBindBufferRange( GL_UNIFORM_BUFFER , uboBlockIndex , uboName , 0 , sizeof( Time ) ) ;
glBindBuffer( GL_UNIFORM_BUFFER , 0 ) ;
Update:
Time = updateTime() ;
glBindBuffer( GL_UNIFORM_BUFFER , uboName ) ;
glBufferSubData( GL_UNIFORM_BUFFER , 0 , sizeof( Time ) , & Time ) ;
// Testing the Buffer Data
GLfloat progTime ;
glGetBufferSubData( GL_UNIFORM_BUFFER , 0 , sizeof( progTime ) , & progTime ) ;
glBindBuffer( GL_UNIFORM_BUFFER , 0 ) ;
std::cout << "Time in Shader : " << progTime << std::endl ; // Works
I don't manage to get UBOs to work. I think I set up everything properly as I don't get any GL Errors. In my update code I can query the value(s) of the uniform buffer, but my Shader does not react to this value(s). I am trying this with just one float, one VertexArrayObject and one program for debugging purpose, but I also failed with float[4] uniform and vec4 respectively ( just in case I am not getting std140 right ).
What do I miss ?
Vertex Shader:
#version 330 core
// Uniforms
layout( std140 ) uniform Common {
float Time ;
} ;
// Input Attribs
in vec3 inVertex ;
// Main
void main( void ) {
vec3 pos = inVertex ;
pos.x += sin( Time ) ;
gl_Position = vec4( pos , 1.0 ) ;
}
Setup:
// Time is a class member
glGenBuffers( 1 , & uboName );
glBindBuffer( GL_UNIFORM_BUFFER , uboName ) ;
glBufferData( GL_UNIFORM_BUFFER , sizeof( Time ) , NULL , GL_DYNAMIC_DRAW ) ;
// programName is a class member storing the compiled program id
GLint uboBlockIndex = glGetUniformBlockIndex( programName , "Common" ) ;
glUniformBlockBinding( programName , uboBlockIndex , uboName ) ;
glBindBufferRange( GL_UNIFORM_BUFFER , uboBlockIndex , uboName , 0 , sizeof( Time ) ) ;
glBindBuffer( GL_UNIFORM_BUFFER , 0 ) ;
Update:
Time = updateTime() ;
glBindBuffer( GL_UNIFORM_BUFFER , uboName ) ;
glBufferSubData( GL_UNIFORM_BUFFER , 0 , sizeof( Time ) , & Time ) ;
// Testing the Buffer Data
GLfloat progTime ;
glGetBufferSubData( GL_UNIFORM_BUFFER , 0 , sizeof( progTime ) , & progTime ) ;
glBindBuffer( GL_UNIFORM_BUFFER , 0 ) ;
std::cout << "Time in Shader : " << progTime << std::endl ; // Works