Opengl GLSL的GPU蒙皮问题

Opengl GLSL的GPU蒙皮问题,opengl,glsl,shader,gpu,Opengl,Glsl,Shader,Gpu,我已经和openGL一起工作了几个月了,现在只是自己学习而已。现在我已经开始渲染位置、纹理坐标模型 我正在尝试使用动画模型,我将在图形卡上执行动画蒙皮过程 顺便说一句,如果有人想帮助我,让我知道我不介意更直接的方法 这是我的顶点格式 struct VERTEX_ANIMATED { float3 position; float3 normal; float2 texCoord; float weights[4]; unsigned boneIndices[

我已经和openGL一起工作了几个月了,现在只是自己学习而已。现在我已经开始渲染位置、纹理坐标模型

我正在尝试使用动画模型,我将在图形卡上执行动画蒙皮过程

顺便说一句,如果有人想帮助我,让我知道我不介意更直接的方法

这是我的顶点格式

struct VERTEX_ANIMATED
{
    float3 position;
    float3 normal;
    float2 texCoord;
    float weights[4];
    unsigned boneIndices[4];
};
这就是我如何将顶点添加到gpu缓冲区句柄(这些函数中任何未初始化的变量都位于“.h”中)

我假设我的错误来自初始化数据的方式或将数据传递给着色器的方式

这里是对我的着色器程序创建的一个简单调用,它接受顶点着色器文件名和片段着色器文件名,然后是希望指定的主要变量的变量,如“位置、法线、texCoords”

在这个函数中,我在创建和编译着色器程序后进行参数解析

 //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 );
这是我的顶点步幅

 //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) );
现在我可以加载静态模型了。当我加载我的动画模型时,我会得到一半的模型,或者一半的模型上缺少一些块。我以前使用过DirectX,只有当gpu正确读取我的缓冲区时,我才遇到这个问题


如果你们想要更多的信息,请告诉我。我在这个奇怪的问题上讨论了将近两周,真的很想了解我的问题。

看起来您可能忘记在代码中初始化
NORMAL\u ATTRIB
。对
CreateProgram(…)
的调用不包括顶点着色器中
NORMAL\u ATTRIB
vVertexNormal
的关联

如果顶点着色器需要用于动画目的的顶点法线,而您尚未将此顶点指针正确连接到相应的属性窗,则结果将是未定义的


同样,问题也可能是由于
NORMAL\u ATTRIB
由于未初始化而对另一个属性产生别名。例如,顶点属性0通常是位置,如果在此代码中保持未初始化的
NORMAL\u ATTRIB
,则可能会用普通指针重新定义顶点位置指针。

我的总体问题在于我的draw调用。我指定的是要绘制的基本三角形的数量,而不是索引的数量,这只是我的“三角形计数*3”


这可以解释为什么一些模型会出现,但会被分块。

如何将骨骼矩阵传递给着色器?在着色器中,它看起来像这样/uniform mat4 mAnimPose[40];/在.cpp中,这是我如何传递它/glUniformMatrix4fv(glGetUniformLocation(pCurShader->GetShaderProgramHandle(),“mAnimPose”)、pCurBones.size()、GL_FALSE、(float*)(&pCurBones[0]);/但目前在着色器中,我不使用它们来测试模型的其余部分,因此我基本上将顶点设置为仅与matrice工作的模型视图投影矩阵相乘,因为这是我在静态模型着色器中使用的顶点。或者,我不擅长此堆栈溢出注释代码语法X_XAlright,我想那不是问题所在。你记得增加你的顶点属性的步幅/大小来解释权重/指数吗?这不允许我添加那么多lol我已经在底部的正常问题中添加了lol我做了这一步,但我的问题是我的骨骼属性不合适我想这可能是我的顶点步幅。你介意看一下这个一对一的吗@Andon M.Coleman?因为我的骨骼在动画中很好,但我似乎无法使蒙皮正确附着
 //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 );
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
 //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) );