今天学习第5个example,ModelTestVk也顺便看了,都是三维模型,然后可以实现不同的皮肤渲染,以及可以实现骨骼动画。
效果
学习项
- 三维与动画,需要如何修改模型,代码如何设计?
答:设计的第一个关键就是使用动态描述符,可以参考我之前的blogvulkan绘制多物体--Apple的学习笔记,设计的第二个关键就是使用了ubo对象进行了描述符绑定。这样就可以将同一个固定数据通过描述符修改出不同的变化。
在 Uniforms 的帮助下对渲染的几何图形执行一些 3D 转换。 Uniform 是着色器中可访问的只读数据块,它们的值对于整个绘制调用而言是恒定不变的。
Uniform 由描述符和描述符池进行管理。 描述符有助于将资源与着色器连接起来。 但它可能会经常变化;因此,分配是通过预先分配的描述符缓冲区(称为描述符池 descriptor pool)来执行的。
相关周期update中的代码如下
// Compute right leg bones (Both UpperLeg_R and LowerLeg_R)
nv::translation(M, position_UpperLeg_R[0], position_UpperLeg_R[1], position_UpperLeg_R[2]);
M *= nv::rotationX(temp, (float)sin(2.0f * t + 3.14f) * 20.0f * TO_RADIANS);
M *= nv::translation(temp, -position_UpperLeg_R[0], -position_UpperLeg_R[1], -position_UpperLeg_R[2]);
ubo.mBones[UpperLeg_R] = M;
M *= nv::translation(temp, position_LowerLeg_R[0], position_LowerLeg_R[1], position_LowerLeg_R[2]);
M *= nv::rotationX(temp, (1.0f + (float)sin(2.0f * t + 3.14f)) * 50.0f * TO_RADIANS);
M *= nv::translation(temp, -position_LowerLeg_R[0], -position_LowerLeg_R[1], -position_LowerLeg_R[2]);
ubo.mBones[LowerLeg_R] = M;
- 选项中RenderMode有3中选择,如何实现?
答:我看了代码,没找到。后来才发现原来是在glsl中。
// Compute the vertex color.
color.w = 1.0;
if(RenderMode.y == RenderColor)
{
// Compute a simple diffuse lit vertex color with two lights
color.xyz = vec3(0.4, 0.0, 0.0) * dot(skinnedNormal, LightDir0.xyz) + vec3(0.4, 0.2, 0.2);
color.xyz += vec3(0.4, 0.0, 0.0) * dot(skinnedNormal, LightDir1.xyz);
}
else if(RenderMode.y == RenderNormal)
{
// Output the skinned normal as the color
color.xyz = 0.5 * skinnedNormal + vec3(0.5, 0.5, 0.5);
}
- camera及light怎么设计的变化?
代码中具体算法我先忽略,因为我对数据源不清楚,然后相关api也不清楚。但是camera原理是将输入数据通过camera的api转换为期望显示的图像数据,然后提交到显示器。
而light包括环境光,慢反射,镜面反射光等,他们可以理解为color通道融合的数据变换。
疑问
后续继续关注
- 如何从模型中知道哪些是手部数据,哪些是脚部数据?
我现在对glsl不太懂,需要系统的进行入门学习。 - 材质数据的格式,ubo的格式是固定的吗?
我对数据源如何制作及格式还不清楚,需要后续系统学习下。
参考网址
https://blog.csdn.net/u011087238/article/details/99996827
总结
这样来看,我对vulkan的流程及使用已经入门了,但是对于数据源的格式,以及如何操纵进行变换还不了解,是时候把这部分内部列为优先学习项了。