5

For what it's worth, the glTF Tutorials contain a section on Skinning that shows how the raw vertex and joint weight data feed into a vertex shader to distort the mesh. If you do design your own format to hold this, you'll need tooling to export it from 3D content creation software, as well as software to read the new format into your application. Using an ...


5

First, to preface: the reason it's hard to find details about these hierarchical cluster culling systems because they are a still emerging field, at the very cutting edge of real-time rendering development. Only a handful of games/engines have successfully shipped something like this, and mostly not open source (UE5 being a recent exception). It is an area ...


4

Filtering refers to image processing operations that generate a new image by applying a filter kernel to an existing image. This is used for many purposes, but one of the most common is to resample images without aliasing. For example, when generating mipmaps for a color texture, you will resample it to smaller sizes. The mipmaps are filtered versions of the ...


4

Many game engines have texture streaming, which means that not all mip levels of each texture are loaded at all times. The game engine will track which textures are in view and how close up they are seen, and will dynamically load and unload mip levels in an attempt to provide enough detail for the current view, while staying within a fixed VRAM budget. This ...


3

Wouldn't the new triangles formed after tesselation lie on the same plane as the original triangle, thus have the same normal? No. The domain shader / tessellation evaluation shader can move the new vertices anywhere you like based on shader logic, so the generated surface need not be flat. Tessellation can be used to evaluate curved surfaces such as ...


3

The pdf with respect to solid angle (area on the sphere) is $D(h) \cos \theta \, \mathrm{d}\omega$, but then when you go to sample it in terms of spherical coordinates, you must include the $\sin \theta$ factor. $$ \mathrm{d}\omega = \sin \theta \, \mathrm{d}\theta \, \mathrm{d}\phi $$ If you imagine choosing sample points uniformly in $(\theta, \phi)$ space,...


3

You might want to check matplotlib-cpp. You'll find a "funny-looking xkcd-styled example" in the README. I also saw xkcd related entries on matplotlib's Python documentation. So, it should be available in Python too. However, I did not use these libraries myself. I just stumbled upon matplotlib-cpp while I was looking for a plotting library for C++....


3

as promised, here my answer to your question. As I can't follow your code completely (I spend most of my time implementing my code :D ) I can only explain to you what the last step is. So why do we do interpolation here at all? Well the article already describes well that this piece helps creating a smoother geometry. This works, because we take into ...


3

As you have now mentionned that your computer can actually keep up (at 150 fps no less), I suspect you have a case of temporal aliasing. The problem is that 150 is not a multiple of 60. Let's say we look at one tenth of a second. That's 15 frames generated by your computer but only 6 can be shown on your screen. The frames you will see will probably be ...


3

In general you can't safely read from neighboring pixels in the render target you're currently writing to. You can sample from them, but there's no guarantees about how other pixels are scheduled on the GPU, so it's a race condition—you might get the neighboring pixel value either before or after modification, and it might change frame to frame due to ...


3

You probably want to set sigma to be a fraction of the radius, rather than a fixed value. Sigma controls the actual shape of the filter, while radius just controls how far out the filter gets cut off (as Gaussians truly have infinite radius, so we have to cut them off somewhere to use them in practice). With sigma set to 0.5, you're making a filter that's ...


2

The "modern equivalent" of animated GIFs is... MPEG. Or really, any decent movie compression format. These techniques are designed to spend fewer bits on static areas and more bits on moving ones. And better still, they're designed to be dynamic, allowing motion in any are at any time, rather than only in fixed areas. So just make a short, looping ...


2

The answer to this question is: it depends. If the software is a black box that you have no control over then the best you will be able to do is measure wall clock run time on the host systems. That will give you general numbers in terms of wall clock time and is the most common way to gather this type of performance data. But will be affected by other ...


2

I see a couple of problems by scanning quickly over your code. You are using ray.origin as new origin when scattering the ray off the surface, you should however use the hit point as origin of the new ray. This might also explain why you see a kind of "screen aligned" shadow. The new ray direction is just the direction ray.origin to target. Is ...


2

This question is too general to be answered in a Q&A site like SE. It would be better to consult to a recent thesis, or a text book. Here are couple of suggestions that come to my mind: Chapter 11 of Möller, T. (2018) Real-time rendering. Fourth edition. Boca Raton: Taylor & Francis, CRC Press. Engel, W. F. (ed.) (2018) GPU pro 360 guide to lighting. ...


2

Actually it's not that new of an idea -- it goes back to at least 1996. I strongly suggest reading Microsoft Research's Foveated 3D Graphics. (click 'View publication' and read the full pdf) In a nutshell, human visual acuity is different near the center of vision compared to the peripheral. The middle of the eye is packed more tightly with cone receptors ...


2

The easiest way to deal with this would be to provide thickness for the edges in the continuous setting. That is, make your edges out of solid capsules/cylinders, then you would not have this issue. Technically, this is is neither a supersampling nor a filtering technique, but rather a reformulation of the problem in the continuous setting. Another ...


2

You can approximate the view of a hypercentric camera with an ordinary 3D perspective camera if you are able to manipulate the projection matrix, and/or reverse the direction of the depth test. In a hypercentric perspective the camera rays converge at a point in front of the camera. This is just the same as a regular perspective camera but with the direction ...


1

I'm not sure of the current state of the art, but this style of drawing windows with rounded corners originated in the NeWS graphical environment for Unix workstations. And it was accompanied by an additional nonstandard operator arcto into Sun's customized PostScript dialect which was then adopted into PostScript Level 2. x1 y1 x2 y2 r arcto xt1 yt1 xt2 yt2 ...


1

Speaking from my own experience... There is no one answer to the question of "how is this UI interface element drawn". Under windows you can get them as freebies where the OS gives you a helping hand but windows tends to be very inflexible with its ready made UI element and tends to boil down to "styles". But windows also provides its own ...


1

If it’s on the wrong side of the normal, you don’t have to throw it away—negating it will give you a vector that’s in the visible hemisphere. Answering your comment, to get a vector that’s within some angle θ of the normal, this should work (GLSL): vec3 direction(vec3 normal, vec2 randomValues, float maxTheta) { // pick an orthogonal tangent vector using ...


1

Theoraticaly this can work, but I am not sure if it would be very efficient. Modern GPU's are tailored for doing low level graphics operations and the drivers that manage them are also tailored for efficiently overseeing these operations to render your scene. Now you can ask all the hardware questions related to using Raspberry Pi, how to access its cpu etc ...


1

Humans don't really see anything beyond 20-25 fps. Even less is often sufficient; animation at 12 frames a second work quite well too. So when you watch TV, the fps of your image is 25-30, and yet you don't generally accuse of them being not smooth. Why do games require more? Well, because they are fast paced. There is generally a slight benefit from going ...


1

The rendering engine that rendered this image is using a technique called deferred rendering, which first writes scene information (as seen from the camera) to seperate buffers (such as position, normal, and albedo buffers) and then calculates lighting for the image based off this information. It is important that we have position and normal buffers on top ...


1

According to the source (https://github.com/assimp/assimp/blob/b7df376836e36c4b6998ce95d97626e30f61c2f0/code/AssetLib/Obj/ObjFileImporter.cpp#L594) only illum values of 0, 1, 2 are supported: // convert illumination model int sm = 0; switch (pCurrentMaterial->illumination_model) { case 0: sm = aiShadingMode_NoShading; break;...


1

If you look closely at the edge of the sphere, in the first image it is sharp, and in the second image it's blurry, blending into the background color. This suggests to me that it's not the texture, but the ray distribution on the image plane that's the issue. The second image might be distributing rays over a larger area per pixel, for instance by using a ...


1

It sounds like you yet have to adjust the importance function of the Markov Chain according to the way you assign paths to each of the two estimators, path tracing and ERPT. If you think about it in the framework of MIS, you have two estimators with binary weights (according to your threshold). Now, the simplest (but inefficient) option to combine them would ...


1

How can we render the scene around the light by rendering it onto a sphere? Well, answer me this: how do you render a scene around a like by rendering a "screen quad"? We're ultimately talking about deferred rendering, and what is being done is rendering the lighting pass. During the lighting pass, you read data from the gbuffers that tell you ...


1

I'm assuming that you don't know how many objects there will be or have any way to index them until the image processing operations are completed, i.e. you have some final pass that determines for each pixel "do I want to put an object here, or no". OpenGL ES 2.0 is pretty limiting. There may be no better way to do this than what you described: ...


1

I managed to fix it. It was indeed related to repeating random sequences. The problem was the following. curandState* randState is an array of curandStates, and most calls to curand_* require a pointer of a curandState. I was sending the randState, the array, to curand_* functions and not for example, a pointer of one of its members. Now most of my images ...


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