在顶点着色器中旋转实例
Rotate instance in vertex shader
我正在学习实例化缓冲区几何结构并尝试扩展 LambertMaterial 着色器以旋转每个实例。
#define LAMBERT
mat4 rotationX( in float angle ) {
return mat4( 1.0, 0, 0, 0,
0, cos(angle), -sin(angle), 0,
0, sin(angle), cos(angle), 0,
0, 0, 0, 1);
}
mat4 rotationY( in float angle ) {
return mat4( cos(angle), 0, sin(angle), 0,
0, 1.0, 0, 0,
-sin(angle), 0, cos(angle), 0,
0, 0, 0, 1);
}
mat4 rotationZ( in float angle ) {
return mat4( cos(angle), -sin(angle), 0, 0,
sin(angle), cos(angle), 0, 0,
0, 0, 1, 0,
0, 0, 0, 1);
}
// instanced
attribute vec3 instanceOffset;
attribute vec3 instanceColor;
attribute vec3 instanceRotation;
varying vec3 vLightFront;
varying vec3 vIndirectFront;
#ifdef DOUBLE_SIDED
varying vec3 vLightBack;
varying vec3 vIndirectBack;
#endif
#include <common>
#include <uv_pars_vertex>
#include <uv2_pars_vertex>
#include <envmap_pars_vertex>
#include <bsdfs>
#include <lights_pars_begin>
#include <color_pars_vertex>
#include <fog_pars_vertex>
#include <morphtarget_pars_vertex>
#include <skinning_pars_vertex>
#include <shadowmap_pars_vertex>
#include <logdepthbuf_pars_vertex>
#include <clipping_planes_pars_vertex>
void main() {
#include <uv_vertex>
#include <uv2_vertex>
#include <color_vertex>
// vertex colors instanced
#include <beginnormal_vertex>
#include <morphnormal_vertex>
#include <skinbase_vertex>
#include <skinnormal_vertex>
#include <defaultnormal_vertex>
#include <begin_vertex>
// position instanced
transformed += instanceOffset;
#include <morphtarget_vertex>
#include <skinning_vertex>
#include <project_vertex>
mvPosition = rotationX(250.0) * rotationY(90.0) * rotationZ(25.0) * vec4(position, 1.0);
#include <logdepthbuf_vertex>
#include <clipping_planes_vertex>
#include <worldpos_vertex>
#include <envmap_vertex>
#include <lights_lambert_vertex>
#include <shadowmap_vertex>
#include <fog_vertex>
}
`
在深入研究 google 之后,我使用了类似的方法,但它根本不会旋转它们。它们都是我输入的任何数字的相同位置。
不知道这是否是正确的转换。
我应该如何正确扩展着色器以添加旋转?
使用THREE.InstancedMesh时,您可以对所有内置材质使用实例化渲染并独立变换每个实例。查看以下演示此方法的示例:
https://threejs.org/examples/webgl_instancing_dynamic
想法是使用 InstancedMesh.setMatrixAt() 为动画循环中的每个实例设置局部变换。
如果您出于某种原因仍想使用 InstancedBufferGeometry
,可以使用以下示例作为代码模板:
https://threejs.org/examples/webgl_buffergeometry_instancing_lambert
它展示了如何使用实例化渲染来增强 MeshLambertMaterial
。
three.js R113
我正在学习实例化缓冲区几何结构并尝试扩展 LambertMaterial 着色器以旋转每个实例。
#define LAMBERT
mat4 rotationX( in float angle ) {
return mat4( 1.0, 0, 0, 0,
0, cos(angle), -sin(angle), 0,
0, sin(angle), cos(angle), 0,
0, 0, 0, 1);
}
mat4 rotationY( in float angle ) {
return mat4( cos(angle), 0, sin(angle), 0,
0, 1.0, 0, 0,
-sin(angle), 0, cos(angle), 0,
0, 0, 0, 1);
}
mat4 rotationZ( in float angle ) {
return mat4( cos(angle), -sin(angle), 0, 0,
sin(angle), cos(angle), 0, 0,
0, 0, 1, 0,
0, 0, 0, 1);
}
// instanced
attribute vec3 instanceOffset;
attribute vec3 instanceColor;
attribute vec3 instanceRotation;
varying vec3 vLightFront;
varying vec3 vIndirectFront;
#ifdef DOUBLE_SIDED
varying vec3 vLightBack;
varying vec3 vIndirectBack;
#endif
#include <common>
#include <uv_pars_vertex>
#include <uv2_pars_vertex>
#include <envmap_pars_vertex>
#include <bsdfs>
#include <lights_pars_begin>
#include <color_pars_vertex>
#include <fog_pars_vertex>
#include <morphtarget_pars_vertex>
#include <skinning_pars_vertex>
#include <shadowmap_pars_vertex>
#include <logdepthbuf_pars_vertex>
#include <clipping_planes_pars_vertex>
void main() {
#include <uv_vertex>
#include <uv2_vertex>
#include <color_vertex>
// vertex colors instanced
#include <beginnormal_vertex>
#include <morphnormal_vertex>
#include <skinbase_vertex>
#include <skinnormal_vertex>
#include <defaultnormal_vertex>
#include <begin_vertex>
// position instanced
transformed += instanceOffset;
#include <morphtarget_vertex>
#include <skinning_vertex>
#include <project_vertex>
mvPosition = rotationX(250.0) * rotationY(90.0) * rotationZ(25.0) * vec4(position, 1.0);
#include <logdepthbuf_vertex>
#include <clipping_planes_vertex>
#include <worldpos_vertex>
#include <envmap_vertex>
#include <lights_lambert_vertex>
#include <shadowmap_vertex>
#include <fog_vertex>
}
`
在深入研究 google 之后,我使用了类似的方法,但它根本不会旋转它们。它们都是我输入的任何数字的相同位置。
不知道这是否是正确的转换。 我应该如何正确扩展着色器以添加旋转?
使用THREE.InstancedMesh时,您可以对所有内置材质使用实例化渲染并独立变换每个实例。查看以下演示此方法的示例:
https://threejs.org/examples/webgl_instancing_dynamic
想法是使用 InstancedMesh.setMatrixAt() 为动画循环中的每个实例设置局部变换。
如果您出于某种原因仍想使用 InstancedBufferGeometry
,可以使用以下示例作为代码模板:
https://threejs.org/examples/webgl_buffergeometry_instancing_lambert
它展示了如何使用实例化渲染来增强 MeshLambertMaterial
。
three.js R113