# Tag Info

12

A half-edge is an edge split along its length, and having a directional component, that is, a beginning vertex and an end vertex. Where two polygons share an edge, each polygon gets a single half-edge between the same two vertices, which will have opposite directions if the winding order is consistent. These half-edges will have references to one another as ...

11

Well I researched quite a lot after that and this paper helped a lot. "Space Subdivision algorithms" by Macdonald 1988. So just summing what I understood. Some of them are obvious reasons but after reading the paper make much more sense and I'll try to do the same here. 1) In BVH we are subdividing objects into smaller pieces. So for example a model of ...

9

Lots of things here. "When reading papers". What papers? If the topic of the paper is about something other than the spatial partitioning structure, it could be fair to use whatever knowing that the basic ideas will translate to other structures. Or not, hard to say. "For example for ray tracing an oct tree, near misses will cause you to iterate through a ...

7

The actual sending of data is the same. The PCIe bus is the same speed in both directions. However when programming there is a big difference namely that when you send you can immediately start doing something else (including queuing other operations using that new data) while the actual transfer is going on. But when receiving you need to synchronize on ...

7

As far as I can tell, the main advantage of half-edge is that traversal can be a bit simpler due to a guarantee of edges having a consistent orientation within each face. Consider the problem of iterating over all the vertices or edges of a given face, in counterclockwise order. In the half-edge structure, this can be done by starting with an arbitrary half-...

6

There's a third option you've neglected. Because of how graphics APIs work, typically you have to copy the data between the CPU and GPU anyway - even if you're on a mobile SoC where they share the same physical memory. This copy is the ideal time to take the hit of changing format, since you have to touch all of the memory anyway. So the copy in user memory, ...

5

Front-to-back traversal is the idea that when traversing a ray through the acceleration structure, we want to examine nodes that are in front, i.e. closer to the camera, before other nodes. If you only want the first intersection with a surface (as usual in ray tracing), then if you get an intersection in the front node you don't need to traverse any nodes ...

5

My 2 cents from writting the Chipmunk2D physics engine is that spatial hashing is great when you have a lot of objects that are all the same size. I had a demo 10 years ago that ran with 20k interacting particles on a Core 2 Duo in real time. The spatial hash worked great for that if you tuned it. I've since replaced the spatial hash with a binary AABB tree ...

3

It comes down to history. The original interfaces for drawing stuff on the screen were for text, not images. Since the people who designed those early computers spoke languages that are read left-to-right, top-to-bottom, it made sense for the first glyph to be the top-left one. This also works conveniently with how the image was transmitted to the display. ...

3

GLSL does not support C++ style namespaces. You might want to do some regex magic before parsing the shader, replacing '::' with '_' or something. You might want to have a preprocessor of sorts - or just forget about it entirely.

3

While the existing answer adress your question quite well, I'd like to add some general advice, even if you might already be aware of that. Rather than just wasting that fourth component on the GPU, you might as well use it for additional data. It might be an obvious suggestion, but a 4th unused 32-bit word can store a variety of useful data: 8-bit RGBA ...

3

Embedding human readable data is not supported. However you can put the data into a data uri to store the data inline in base64 format. "buffers": { "a-buffer-id": { "byteLength": 1024, "type": "arraybuffer", "uri"="data:application/octet-stream;base64,..." } },

3

Also check out the glTF models used in Cesium: https://github.com/AnalyticalGraphicsInc/cesium/tree/master/Apps/SampleData/models https://github.com/AnalyticalGraphicsInc/cesium/tree/master/Specs/Data/Models Patrick

2

Ok sometimes you have to ask a question to figure out the answer already. Example datasets are available in the same repository as linked in the question already. Here are some: supermurdoc.gltf duck.gltf etc. pp.

2

Technically any file format where you can dump the entire file into a VBO and then render from that will work for the .bin files. Unfortunately those formats are less well known than they should be. Then you only need to adjust the bufferview elements to reference the proper subset of the file

2

The full explanation of what I was doing wrong is: The depth parameter in the glTexSubimage3D refers to the depth of the data being sent. Since I am trying to send a single layer this depth should be 1 not 0 (the depth of an image/layer) (As explained by Nicol Bolas). The zoffset parameter in the same function refers to the offset in layers where the data ...

2

glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, 894, 894, 0, color_format, GL_UNSIGNED_BYTE, data); You're transmitting 3D data. But you told OpenGL that the 3D block of data has a depth of 0. So the number of pixels you're transmitting is... 0. I have no idea why OpenGL doesn't provide an error when passing 0 for any of the sizing components (since that ...

2

The memory layout of a (2D) array texture is pretty similar to a 3D texture, with the individual image layers stored one after the other in a big 3D-array of pixels. So that's also how you set them. You either load each individual image into a big GLubyte array one after the other and set it with glTex(Sub)Image3D or you load each image into its own GLubyte ...

2

One possibility would be to create a bit array with 1 bit per half-edge. When you start iterating, initialize them all to 1, then clear the bits of each half-edge and its partner as you iterate. The iteration can be done using __builtin_clz (GCC, clang) or _BitScanReverse (MSVC) [edit: or std::countl_zero in C++20!] to efficiently extract the next 1-bit ...

2

You need to learn and understand STEP data exchange format (ISO 10303-21) which is the fundamental exchange format which the IFC schema is built on top of. This is no easy feat though, especially when comparing to a file format such as OBJ. OBJ files are designed to define geometry (and other information via associated MTL) and so are optimised for this ...

1

This more or less a long comment than an answer. Some other options that come to mind are the following: A little old school, but you can create an interface with one of the texture objects. You can query different mipmap levels for your needs inside the shader. Textures are one of the better cached objects in OpenGL. You can defer the lightening process ...

1

If anyone ever runs into this. There is a mathematical property of the half edge, that makes it such that any proper half edge can be expressed as an even permutation of vertices. This sounds abstract but the gist of it is very simple. Since there is an even number of HE by definition, you can store your half edges such that if $n$ is even then $n + 1$ is ...

1

It depends on what you’re doing. If any given thread of your shader is working with data from multiple nearby pixels, like by sampling from fractional between-pixel locations or doing some calculation involving a pixel’s immediate neighbors, then you should probably use a texture: the GPU can do some caching and even load multiple values in a single ...

1

Is it possible to change the buffer data uploaed directly without uploading the whole data again? "Again"? You didn't upload "the whole data" the first time: glBufferSubData(GL_ARRAY_BUFFER, 0, vertex_data_size, data); That only affects the first vertex_data_size bytes of the buffer. And your second one only affects the data on the byte range [...

1

Yes, scene graphs can be non-tree graphs. Your question is a little vague, but assuming you're talking about something like the scene graph in rendering a frame of video, for say a feature film, then yes, there are often references between objects. For example, in a compositing application, you might have a piece of footage with an effect applied. The effect ...

1

The conversion from option A is likely faster than you think. See, for example, Intel's version which claims to do the round trip at 1.5 cycles per vector with AVX. There are also some operations which don't require the conversion at all. For example, if you want to compute a bounding box, you can do it directly with the packed data in chunks of 4 vectors ...

1

Rather than making one spatial subdivision structure do double duty in representing both the voxels and the triangles, I would suggest creating a separate BVH for the mesh. You can find many articles and papers about BVH-building algorithms on the web. It's likely to be a more efficiently queryable representation of the mesh than the octree would be. Given ...

1

I've finally managed to write the buffers myself using JavaScript. The result is a base64 encoded String, like: data:application/octet-stream;base64,AAACAAIABAAEAAAAAAABAAEABAB7g689dnGbPb1SFj1Q/Hg/vsF3P7hAAj3Qs3k/bcVuPw== If you paste this Data URI into the browser, you can download a binary blob which is exactly what the glTF files can use. The 52 bytes ...

1

It's not possible to store the plain text array buffers in gltf, however, here is the code I use to generate buffers in JavaScript: let vtx = [ 0.0857, 0.0759, 0.0367, 0.9726, 0.9678, 0.0318, 0.9754, 0.9327 ]; let idx = [ 0, 2, 2, 4, 4, 0, 0, 1, 1, 4 ]; let buf = new ArrayBuffer(52); let dat = new DataView(buf, 0, 52); for (var i = 0; i ...

Only top voted, non community-wiki answers of a minimum length are eligible