在 opengl 和自己的库中传递向量(和其他结构)

发布于 2024-11-28 05:02:47 字数 800 浏览 1 评论 0原文

这是一种代码风格&设计问题,也许涉及权衡。这可能是显而易见的。

背景故事

从 C++ 迁移到 Java 时,我遇到了一个差异,我现在不知道如何处理。

在所有 opengl 调用中,您传递一个带有偏移量的数组和一个附加参数,告诉函数传递的数组是如何构造的。以 glDrawArrays 为例。

因此,在绘制时,最好将所有顶点放在一个数组中,即 FloatBuffer。 但是,我还需要这些顶点来进行物理计算。

问题

我是否应该为物理创建一个单独的缓冲区,并在每次更新时将其结果复制到 FloatBuffer 中,处理 Vec3f 和 Point3f 类,因为它们无法传递给 opengl 函数,因为它们可能是碎片化的( 或者可以吗?)。

或者我应该有一个单独的类来处理我的结构,该结构采用偏移量和数组。

public static void addVec3(float[] vec3in_a, int offset_a, float[] vec3in_b, int offset_b, float[] vec3out, int offset_out)

偏移量应该代表什么。它们应该考虑 vec3 大小并适当移动 (offset_a*=3),就像 Vec3 数组的行为一样,还是应该像普通浮点数组一样偏移。

谢谢你:)

This is a code style & design question, perhaps dealing with tradeoffs. It is probably obvious.

Backstory:

When migrating from C++ to Java I encountered a difference I am now not sure how to deal with.

In all opengl calls you pass an array with an offset and an aditional param wich tells the function how the passed array is structured. Take glDrawArrays for an example.

So when drawing, it would be best to have all my vertex in an array, a FloatBuffer.
However, I also need those vertex for my physics callculation.

The question:

Should I create a separate buffer for physics and copy its results to the FloatBuffer every update, dealing with a Vec3f and Point3f classes since they can not be passed to opengl functions because they might be fragmented (or can they?).

Or should I have a seperate class for dealing with my structures which takes the offset along with the array.

public static void addVec3(float[] vec3in_a, int offset_a, float[] vec3in_b, int offset_b, float[] vec3out, int offset_out)

And what should the offsets represent. Should they account for vec3 size and move apropriatly (offset_a*=3), like an array of Vec3 would behave, or should it just offset as a normal float array.

Thank you:)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

云之铃。 2024-12-05 05:02:47

你不能在GPU上进行物理计算吗? JOCL 或着色器将是一个可能的路线。通常,您会尝试阻止在 CPU 上进行所有顶点变换(在 java、C 等中)并将其每帧发送到 GPU。

如果你真的必须在java(CPU)中做到这一点,你可以调整你的数学类(Vec、Point等)以将数据存储在FloatBuffer中。但与原始浮点相比,这肯定会慢一些,因为对 FB 的读/写操作并非没有开销。

在不知道你实际在做什么的情况下,从 FB 复制 ->数学对象和返回甚至是可行的。如果不够快...稍后优化:)

can't you do the physics calculations on the GPU? JOCL or shaders would be a possible route. Usually you try to prevent to do all the vertex transformation on the CPU (in java, C, whatever) and sent it to the GPU every frame.

if you really have to do that in java (CPU) you could adapt your maths classes (Vec, Point etc) to store the data in a FloatBuffer. But this will be certainly slower compared to primitive floats since the read/write operation to a FB is not without overhead.

Without knowing what you are actually doing, a copy from FB -> math object and back could be even feasible. If it is not fast enough... optimize later :)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文