I been working with openGL for a few months now just learning it all on my own. Now I've gotten to render position, texture coordinate models
I am trying to work with animated models which I'll do an animation skinning process on the graphics card.
By the way if someone wants to help me 1 on 1 let me know I wouldn't mind even more direct approach.
Here is my vertex format
struct VERTEX_ANIMATED
{
float3 position;
float3 normal;
float2 texCoord;
float weights[4];
unsigned boneIndices[4];
};
this is how I add my verts to the gpu buffer handle (any uninitialized variables in these functions are located in the ".h" )
bool CVertexBuffer::IncreaseVerts( const unsigned int uiNumVerts )
{
//create our increase by value
unsigned uiIncrement = (uiNumVerts / BUFFER_INCREASE_SIZE) * BUFFER_INCREASE_SIZE + BUFFER_INCREASE_SIZE;
m_uiNumVerts += uiIncrement;
//bind to our buffer
void* buffer1;
if (GLEW_ARB_vertex_shader)
{
glBindBufferARB( GL_ARRAY_BUFFER_ARB, m_uiVertBufferHandle );
//make sure our buffer exists
buffer1 = glMapBufferARB( GL_ARRAY_BUFFER_ARB, GL_READ_WRITE );
}
else
{
glBindBuffer( GL_ARRAY_BUFFER, m_uiVertBufferHandle );
//make sure our buffer exists
buffer1 = glMapBuffer( GL_ARRAY_BUFFER, GL_READ_WRITE );
}
if( buffer1 )
{
//collection of all our data
void* buffer2 = new char[ (m_uiNumVerts)*sizeof(VertexFormat) ];
memset( buffer2, 0, (m_uiNumVerts)*sizeof(VertexFormat) );
memcpy( buffer2, buffer1, (m_uiNumVerts - uiIncrement)*sizeof(VertexFormat) );
//create a new buffer
//unsigned uiNewHandle;
if (GLEW_ARB_vertex_shader)
{
//allocate our new storage space, and store our data in there
glBufferDataARB( GL_ARRAY_BUFFER_ARB, (m_uiNumVerts*sizeof(VertexFormat)), buffer2, GL_DYNAMIC_READ );
//lock our buffer
//void* buffer2 = glMapBuffer( GL_ARRAY_BUFFER_ARB, GL_READ_WRITE );
//unlock our buffer2
//if( glUnmapBufferARB( GL_ARRAY_BUFFER_ARB ) == GL_FALSE )
// return false;
//}
//reset what we are bound to
glBindBufferARB( GL_ARRAY_BUFFER_ARB, 0 );
}
else
{
//allocate our new storage space, and store our data in there
glBufferDataARB( GL_ARRAY_BUFFER_ARB, (m_uiNumVerts*sizeof(VertexFormat)), buffer2, GL_DYNAMIC_READ );
//reset what we are bound to
glBindBufferARB( GL_ARRAY_BUFFER_ARB, 0 );
}
//delete our buffer
free( buffer2 );
//Unmap our currently mapped buffer
glUnmapBuffer( GL_ARRAY_BUFFER );
return true;
}
unsigned int CVertexBuffer::AddVerts(const VERTEX_ANIMATED* pVerts, unsigned int iNumVerts)
{
//Save the location to copy to
unsigned int uiVertLocation = m_uiVertsUsed;
m_uiVertsUsed += iNumVerts;
if(m_uiVertsUsed > m_uiNumVerts)
{
IncreaseVerts(m_uiVertsUsed - m_uiNumVerts);
}
if(GLEW_ARB_vertex_program)
{
//bind the buffer we're gonna mess with
glBindBufferARB( GL_ARRAY_BUFFER_ARB, m_uiVertBufferHandle );
//get the pointer position where we can add verts
void* pPositionBuffer = glMapBufferARB( GL_ARRAY_BUFFER_ARB, GL_READ_WRITE );
//now copy into our memory spot
//which we need to move to the right position
memcpy( ((char*)pPositionBuffer) + ( uiVertLocation*sizeof(VertexFormat) ), pVerts, iNumVerts*sizeof(VertexFormat));
//now stop mapping
glUnmapBufferARB(GL_ARRAY_BUFFER_ARB);
}
else
{
//bind the buffer we're gonna mess with
glBindBuffer( GL_ARRAY_BUFFER, m_uiVertBufferHandle );
//get the pointer position where we can add verts
void* pPositionBuffer = glMapBuffer( GL_ARRAY_BUFFER, GL_READ_WRITE );
//now copy into our memory spot
//which we need to move to the right position
memcpy( ((char*)pPositionBuffer) + ( uiVertLocation*sizeof(VertexFormat) ), pVerts, iNumVerts*sizeof(VertexFormat));
//now stop mapping
glUnmapBuffer(GL_ARRAY_BUFFER);
}
return uiVertLocation;
}
I am assuming my error comes from how I am initializing my data or how I pass my data to the shader.
Here is a simple call to my shader program creation it takes in a vertex shader file name and a fragment shader file name then a variable for main variables that wish to be specified such as "position, normals, texCoords"
CreateProgram( "animTriangle.vp",
"animTriangle.fp",
5,
VERTEX_ATTRIB, "vVertexPos",
NORMAL_ATTRIB, "vVertexNormal",
TEXTURE_COORD_ATTRIB0, "vTexCoord",
COLOR_ATTRIB, "vBlendWeights",
COLOR2_ATTRIB, "vBoneIndices" );
in side this function I do a parameter parsing after have created and compiled the shader program
//make sure to use our program to setup our handles
glUseProgram( m_uiProgramHandle );
//start from this parameter
va_start( parseList, szFragmentShaderName );
//read in number of variables if any
uiNum = va_arg( parseList, unsigned );
//for loop through our attribute pairs
int enumType = 0;
for( unsigned x = 0; x < uiNum; ++x )
{
//specify our attribute locations
enumType = va_arg( parseList, int );
char* name = va_arg( parseList, char* );
glBindAttribLocation( m_uiProgramHandle, enumType, name );
}
//end our list parsing
va_end( parseList );
here is my variable list at the beginning of my vertex shader
in vec3 vVertexPos; // position
in vec3 vVertexNormal; // normal
in vec2 vTexCoord; // texture coordinate....
in vec4 vBlendWeights; // the weights pull of the related bone
in ivec4 vBoneIndices; // the indicators of which bones we are influenced by
here is my vertex stride
//set which vertices we will be using
glBindBuffer( GL_ARRAY_BUFFER, m_uiVertBufferHandle );
//enable these vertex attributes
glEnableVertexAttribArray( VERTEX_ATTRIB );
glEnableVertexAttribArray( NORMAL_ATTRIB );
glEnableVertexAttribArray( TEXTURE_COORD_ATTRIB0 );
glEnableVertexAttribArray( COLOR_ATTRIB );
glEnableVertexAttribArray( COLOR2_ATTRIB );
//specify our vertex attribute
glVertexAttribPointer( VERTEX_ATTRIB, 3, GL_FLOAT, GL_FALSE, sizeof( VERTEX_ANIMATED ), BUFFER_OFFSET(0) );
//specify our normal attribute
glVertexAttribPointer( NORMAL_ATTRIB, 3, GL_FLOAT, GL_FALSE, sizeof( VERTEX_ANIMATED ), BUFFER_OFFSET(12) );
//specify our texture attribute
glVertexAttribPointer( TEXTURE_COORD_ATTRIB0, 2, GL_FLOAT, GL_FALSE, sizeof( VERTEX_ANIMATED ), BUFFER_OFFSET(24) );
//specify our bone weight attribute location
glVertexAttribPointer( COLOR_ATTRIB, 4, GL_FLOAT, GL_FALSE, sizeof( VERTEX_ANIMATED ), BUFFER_OFFSET(32) );
//specify our bone indice attribute location
glVertexAttribPointer( COLOR2_ATTRIB, 4, GL_INT, GL_FALSE, sizeof( VERTEX_ANIMATED ), BUFFER_OFFSET(48) );
now I can load static models just fine. When I load my animated models I get like half the model or half the model with some chunks missing on that half. I have worked with DirectX before and I only ever came across that issue when the gpu was reading my buffers in correctly.
If you guys would like any more info let me know. I been on this weird issue for almost 2 weeks and would really like to learn my problem.
It looks like you may have forgotten to initialize NORMAL_ATTRIB
in your code. Your call to CreateProgram (...)
does not include an association of NORMAL_ATTRIB
with vVertexNormal
in your vertex shader.
If your vertex shader requires the vertex normal for animation purposes and you have not correctly hooked up this vertex pointer to the appropriate attribute slot, then the results will be undefined.
Likewise, the problem may also be due to NORMAL_ATTRIB
aliasing to another one of your attributes due to leaving it uninitialized. For instance, vertex attribute 0 is usually position, if you leave NORMAL_ATTRIB
uninitialized in this code you may be re-defining your vertex position pointer with the normal pointer.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With