【发布时间】:2016-03-25 16:11:25
【问题描述】:
我需要一些帮助,想出正确的算法来用数据填充顶点浮点缓冲区数组......
由于在我的设置中每个顶点都有 9 个属性(XYZ、UV、RGBA),并且我使用四边形进行绘制,因此每个面总共有 36 个索引。我正在绘制立方体,因此总共有 216 个(9 * 4 * 6)个索引的 6 个面。而不是通过以下方式迭代缓冲区来填充它:
public void AddVertex(int x, int y, int z, float u, float v, Color4 color)
{
if (vCount >= vertex_data.Length)
return;
else
{
vertex_data[vCount++] = x;
vertex_data[vCount++] = y;
vertex_data[vCount++] = z;
vertex_data[vCount++] = u;
vertex_data[vCount++] = v;
vertex_data[vCount++] = color.R;
vertex_data[vCount++] = color.G;
vertex_data[vCount++] = color.B;
vertex_data[vCount++] = color.A;
}
}
我想使用偏移量来直接定位缓冲区中要在 GPU 上更新的位置(通过使用 BufferSubData)。但是,问题是将立方体 (XYZ) 的相对位置值转换为缓冲区数组中的位置,以便我可以更新它的值。
这就是我迭代立方体的方式,以及我试图获得正确位置的方式......
for (int x = 0; x < Chunk.DEFAULT_SIZE; x++)
{
for (int y = 0; y < Chunk.DEFAULT_SIZE; y++)
{
for (int z = 0; z < Chunk.DEFAULT_SIZE; z++)
{
<...>
offset = (x + size * (y + size * z)) * 216;
SetVertex(offset, face_i.X + absX, face_i.Y + absY, face_i.Z + -absZ, u, v, color);
//SetVertex (...) would be called 3 more times, and "offset" would be supplemented by 0,9,18, and 27 (totalling 36 indices).
<...>
}
}
}
我什至尝试移动 XYZ 值:
int offset = 216 * (x<<10) + 216 * (y<<5) + 216*z;
这仅在某些情况下有效。我会以错误的方式解决这个问题吗?上面代码的结果只创建了立方体的底面,但它确实以所有正确的间隔创建它们。
【问题讨论】:
-
不应该将这段代码中的
216:offset = (x + size * (y + size * z)) * 216;替换为当前索引计数吗?即,当x=y=z=0时,216号码不应该是0吗?还有SetVertex(offset, face_i.X + absX), face_i.Y + absY), face_i.Z + -absZ), u, v, color);中的所有括号是什么,有一个左括号和四个右括号。 -
哎呀,我在简化它时错过了错字。谢谢 - 现在更正。
-
是的,通常是 offset + i 。我是 9 * (x
-
我想我误解了你的第二个代码块。
x、y和z在您的第二个代码块中代表什么?如果它们是您所说的立方体的位置,那么如果Chunk.DEFAULT_SIZE是1,那么您的代码应该绘制一个立方体,对吗?在这种情况下,您需要调用SetVertex36 次,而不是代码注释所说的 4 次(6 个面,每个面有 4 个顶点 =SetVertex调用了 36 次)。这可以解释为什么你只得到一张脸。 -
呃,我的意思是 24 次,6*4=24,不过我相信你明白了。忽略我原来的评论,我认为 x,y,z 是每个顶点,但是如果它是每个立方体,那么 216 数字是有意义的。目前您只绘制了 1/6 的立方体,并且只定义了 9*4=36 个顶点,而不是 216 个(直到您添加其他 5 个面)。
标签: c# arrays opengl 3d buffer