java - 在两个不同的 vbo 之间进行插值时,网格面会迷失方向

标签 java opengl-es glsl shader interpolation

所以,我使用 java 和 opengl es,并使用 obj(波前)解析器显示一个网格。我有一个从 blender 导出的网格,到目前为止我能够将其显示到 Android 手机显示屏上。我现在尝试使用关键帧动画对网格进行动画处理,因为骨骼动画更难实现。我的网格有两个 vbo,位于两个不同的位置。我不确定着色器中是否存在关键帧动画事实上的标准方法,但我找不到它,所以我想出了一个公式可以帮助我在给定时间在这两个 vbo 之间进行插值。公式如下

float ratio = ((passedTime/AnimationDuration))

在顶点着色器中:

GLPosition = ratio * (this is difference->)(endVBOVertex - StartVBOVertex)) + startVBOVertex.

因此,如果 AnimationDuration 为 8 秒,passedTime 为 4 秒,则比率将等于 0.5 。然后将该比率乘以起始 vbo 和结束 vbo 中的顶点之间的差值。然后将该值添加到 startVbo 顶点,以便可以计算每个顶点的正确位置。因此如果ratio = 0,则将0乘以差值等于0,然后添加到原始vbo顶点起点。留给我们一开始的网格姿势。如果ratio = 1,则将其乘以差值,然后添加到起始 vbo 顶点位置,从而得到网格位于最终位置的最终 vbo。当比率为 0 或 1 时,网格看起来很好。但是,(这就是问题)在 0 和 1 之间,网格的某些面会旋转,从而在网格中留下孔。比率 = 0.50 时最差,部分面旋转 45 度左右;留下一个网格的矩形面,其中有一个菱形和 4 个透视三角形。当我接近 0 或 1 时,这些受影响的面会旋转回正确的位置,从而使整个网格正确。在这两个 vbo 之间进行插值时,网格的位置看起来也不错;这意味着总体而言,网格可以以正确的姿势看到,但有些面正在旋转并以一种奇怪的方式受到影响(当比例在 0-1 之间时),这让我可以看到网格。

{如果您已经看到这里,我非常感谢您的宝贵时间,如果我有任何不清楚的地方,我深表歉意。我还要提前非常感谢您提供的所有建议。

我启用了深度测试,我知道我正在正确分配所有制服和属性,因为我最终无法以比例 = 0 || 的正确姿势获得网格1. Vbo 具有相同数量的顶点。

这是我的顶点着色器:

uniform mat4 u_Matrix;//uniform for our matrix

attribute vec4 a_Position;//Original vertex position

attribute vec2 a_TextureCoordinates;

varying vec2 v_TextureCoordinates;

attribute vec4 b_Position;//Next vertex position to interpolate too

attribute vec2 b_TextureCoordinates;


uniform float ratio;

// (currentTime - StartTime)/animationDuration
//so If the animation lasts 8 seconds and 4 seconds have passed ratio
//will equal .5 and half the difference it takes for the first vbo to reach the second vbo will be added.

void main() {  
      v_TextureCoordinates = (a_TextureCoordinates + ((b_TextureCoordinates - a_TextureCoordinates) * ratio));
      gl_Position = u_Matrix * (a_Position + ((b_Position - a_Position) * ratio));
}

这是我的片段着色器:

precision mediump float;

uniform sampler2D u_TextureUnit;


varying vec2 v_TextureCoordinates;


void main() {
      gl_FragColor = texture2D(u_TextureUnit,v_TextureCoordinates);
}

Close Up of Head

Ratio at 50%

最佳答案

您基本上是在网格数据上执行标准 lerp(线性插值),这可以使用 mix() 函数来完成。

v_TextureCoordinates = mix(a_Position, b_Position, ratio);
gl_Position = mix(a_TextureCoordinates, b_TextureCoordinates, ratio);

在我看来,着色器中的一切都很好。我有点担心你正在插值 UV 纹理坐标???对于角色动画来说,这是一种非常不寻常的方法吗?通常,动画时纹理坐标不会改变。

顶点混合的一个大问题是,如果姿势明显不同,您会得到一些非常奇怪的变形。我猜你的文物可能是因为这个? (动画层次结构通常更受欢迎的原因之一)

关于java - 在两个不同的 vbo 之间进行插值时,网格面会迷失方向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55929632/

相关文章:

java - 如何找出确切的年轻/老一代在内存中的位置?

java - 检查 Java 中通配符泛型对象的类型

opengl-es - 如何在不受 glColor 影响的情况下渲染纹理?

math - glsl 和不同值的透视校正

ios - iPhone 6 Plus 上的 GLSL atan 给出了错误的结果

java - Java 中的多个 SQL 语句(使用 ?allowMultiQueries=true)

java - 加速 Java 正则表达式

android - 如何使用 OpenGL ES 2 从相机获取灰度预览

android - SDL 下 Android OpenGL ES 渲染中不确定的不需要的额外三角形

c++ - GLSL 纹理映射,最大纹理数