我正在我的Android手机中实现骨骼动画,这就是我的方法:
计算CPU端的所有骨骼转换矩阵
创建一个浮动纹理来存储这些矩阵(所以这是在每个帧的开头完成的).代码如下所示:
if(texID) {
glDeleteTextures(1, &texID);
texID = 0;
}
glGenTextures(1, &texID);
glBindTexture(GL_TEXTURE_2D, texID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_FLOAT, p);
Run Code Online (Sandbox Code Playgroud)在顶点着色器中,从此纹理中获取矩阵并应用于顶点位置
这种方法在使用POWERVR GPU的Motorola Milestone XT-701中运行良好.但是当我在Qualcomm snapdragon(SE Xperia X10i和Google Nexus one)上运行它时,有许多三角形消失(看起来是随机的),所以看起来模型是闪烁的.
我还尝试通过仅渲染一个动画模型来降低场景复杂度,并且闪烁变小但仍然存在.有谁知道我可能做错了什么?这是某种同步问题吗?
你可以在这里看到快照(前两张图片是正确的,后两张图片是错误的).我的grogram的APK文件可以在这里下载.(它不需要任何许可,所以不要担心)
这是我使用的顶点着色器:
struct light {
lowp vec4 position; // light position for a point/spot light or
// normalized dir. for a directional light
lowp vec4 ambient_color;
lowp vec4 diffuse_color; …Run Code Online (Sandbox Code Playgroud)