【发布时间】:2019-04-12 19:09:39
【问题描述】:
我需要一个实例化网格以使所有实例都面向相机。
uniform vec2 size;
uniform vec3 center;
vec3 billboard(vec3 v, mat4 view) {
vec3 up = vec3(view[0][1], view[1][1], view[2][1]);
vec3 right = vec3(view[0][0], view[1][0], view[2][0]);
vec3 pos = center + right * v.x * size.x + up * v.y * size.y;
return pos;
}
void main() {
vec3 worldPos = billboard(position, viewMatrix);
gl_Position = projectionMatrix * modelViewMatrix * vec4(worldPos, 1.0);
}
这是我目前渲染一个广告牌的代码。这不显示任何内容。在最后一行的 vec4 构造函数中传递“位置”会按预期呈现形状,所以我知道计算有问题。
我一直在尝试遵循本教程:http://www.opengl-tutorial.org/intermediate-tutorials/billboards-particles/billboards/ 1,特别是解决方案 #2,但是,我没有太多运气弄清楚这一点。
这里的答案看起来也很有希望,但我什么都做不了。 THREE.JS GLSL sprite always front to camera1
这个问题的解决方案:THREE.js - Billboard Vertex Shader 是正确的,但对于我的用例来说并不准确。
我的理解是,中心位置需要在任何转换到几何体或网格后发送,以便在世界空间中进行正确计算。
Three.js 在顶点着色器中传递相机位置。我在想可以根据相机位置和广告牌中心位置之间的减法对每个顶点应用一些变换。这会影响性能吗?
最后,因为这将被实例化,使用 Sprite 对象或网格并将 LookAt 设置为每帧的相机位置不是一个选项。
感谢您的帮助!
【问题讨论】:
标签: javascript three.js