【发布时间】:2014-09-21 15:57:15
【问题描述】:
我有一个非常简单的“hello world”webgl 应用程序(臭名昭著的三角形),我决定要更改每个帧的每个顶点的颜色以显示冷色,所以我在我的渲染方法中使用了这个
if (tick % 5 == 0) {
data[3] = rand.nextDouble();
data[4] = rand.nextDouble();
data[5] = rand.nextDouble();
data[3 + 6] = rand.nextDouble();
data[4 + 6] = rand.nextDouble();
data[5 + 6] = rand.nextDouble();
data[3 + 12] = rand.nextDouble();
data[4 + 12] = rand.nextDouble();
data[5 + 12] = rand.nextDouble();
}
其中 data 是一个 Float32List,其中包含 3 个顶点的 6 个浮点数。
我目前在上面的代码块之后这样做
gl.bindBuffer(GL.ARRAY_BUFFER, vertexBuffer);
gl.bufferDataTyped(GL.ARRAY_BUFFER, data, GL.DYNAMIC_DRAW);
它完成了这项工作,但不知何故我觉得这不是我问题的正确答案,并且可能会对性能产生影响。
【问题讨论】:
-
嗯,它对你的三角形很好。对于更复杂的基元,您可能需要使用片段着色器。编辑:你说的是你的“问题”,你的问题是什么?
-
这很可能是一个简单的渲染引擎,用于只有精灵的游戏(每个精灵 4 个顶点)。我可以想象我的精灵的 xyz 坐标会经常变化,屏幕上可能会同时出现很多精灵
-
现在我明白了,不,你不想每帧更新你的顶点缓冲区来转换你的几何图形。平移、旋转和缩放等变换通常是通过向着色器提交一个 4x4 矩阵并在顶点着色器内部进行顶点变换来完成的。
-
所以对于我的精灵,我应该有 4 个顶点和 6 个索引(正方形/矩形)并将我的精灵变换(位置、旋转等)应用于传递给着色器的统一 Matrix4 ?
-
是的,除此之外,您将只有 一个 顶点缓冲区(平面)并多次渲染它,绑定不同的矩阵和精灵纹理。