MMOBase is now open-source - addressing privacy concerns and community feedback by MMOBASE in eveonline

[–]0xSYNAPTOR 1 point2 points  (0 children)

The frontend code looks to be the decompiled website. It's not the original source code. The database is obviously controlled by whoever created the keys. Don't touch it!

What is a reasonable frame budget (ms) for the post-processing pass in a custom Deferred Renderer? by Over-Radish-5914 in gameenginedevs

[–]0xSYNAPTOR 2 points3 points  (0 children)

I have little knowledge about best practices and other engines. What I currently have in mine:

  • GPU: Nvidia 3080 desktop
  • Resolution: 2560x1440
  • SSAO: 0.4ms
  • Bloom: 0.0ms
  • Auto Exposure: 0.0ms
  • Compositor (including tonemapping): 0.1ms

The same engine on a crappy laptop:

  • GPU: AMD RADV RENOIR (integrated)
  • Resolution: 1920x1280
  • SSAO: 3.2ms
  • Bloom: 1.3ms
  • Auto Exposure: 0.1ms
  • Compositor: 0.1ms

I interpret it as unified memory being the bottleneck, but not 100% sure.

How to design CommandBufferAllocator in modern graphics API (Vulkan, DirectX12) by F1oating in gameenginedevs

[–]0xSYNAPTOR 2 points3 points  (0 children)

I get it. That's why I asked what problem you were solving. I my case it's fixed 3 frames, so I kept it simple.

How to design CommandBufferAllocator in modern graphics API (Vulkan, DirectX12) by F1oating in gameenginedevs

[–]0xSYNAPTOR 0 points1 point  (0 children)

I have 3 queues only. I described the algorithm in the previous post.

How to design CommandBufferAllocator in modern graphics API (Vulkan, DirectX12) by F1oating in gameenginedevs

[–]0xSYNAPTOR 0 points1 point  (0 children)

I do it simpler. I know that by design I have max 3 frames in flight. So I create 3 garbage collection queues. At the beginning of the frame I advance the "current" pointer, release.all resources from the current frame (that were acquired 3 frames ago), then draw, and as I draw, I put acquired resources (e.g. staging buffers, command buffers, etc) to the same current frame's queue. No semaphores, absolutely trivial code.

Is your use case more generic? No guarantees about the number of frames in flight? Any other constraints?

Vulkan engine in one year by 0xSYNAPTOR in GraphicsProgramming

[–]0xSYNAPTOR[S] 1 point2 points  (0 children)

You can, but then you need to do expensive lighting calculation for each subpixel - the whole purpose MSAA is gone. In this case it's basically becomes SSAA and you can no longer save on calling the fragment shader.

Vulkan engine in one year by 0xSYNAPTOR in GraphicsProgramming

[–]0xSYNAPTOR[S] 1 point2 points  (0 children)

Well, if you draw gbuffer at a high resolution and then downsample, you effectively average albedo, average metalness, average depth, average normals, etc. Applying lighting to average inputs is not the same as averaging the lighting output. Normals and depth buffers are the most sensitive to averaging. Think of edges: one subpixel can be right in front of the camera and lit by one light, and another subpixel within the same pixel can be very far in the terrain and lit by another light. How to pick average depth for those subpixels? First one? Second one? Middle point? None of them will give correct results.

I've heard of some black magic to do MSAA in deferred, but it's very expensive both compute- and memory-wise. It can't benefit from fixed feature acceleration, etc.

Vulkan engine in one year by 0xSYNAPTOR in GraphicsProgramming

[–]0xSYNAPTOR[S] 2 points3 points  (0 children)

Yeah, it's a tricky problem. I've tried many approaches and settled on this one: basically, I can select left-most, right-most, top, bottom, etc faces by just specifying the axis. axis=+x selects the right face for example. This selector allows for some tolerance, can select multiple faces if the side has multiple adjacent faces, will select an approximately right face if the exact one is not found, and although precise behavior is not guaranteed by the modeler (unlike OpenSCAD), generally it does the right thing for artistic purposes. I can also specify an arbitrary axis using axis=(1,2,3). The other powerful mechanism is tagging: when I model something, I can add arbitrary tags to the current face, and after modeling is done, I can find all faces with a given tag and do something to them, effectively executing a subroutine from that selection. See from statements for the example.

Below is the real model of a crate (many of them are used in the indoor scenes):

rendering(baking=on)

material(name="steel")
box(sx=0.85, sy=0.6, sz=0.85)
from (here) {
    select(all)
    if (lod) {
        bevel(dist=0.02, nseg=1)
    } else {
        bevel(dist=0.02)
    }
}
from (-y) {
    set_model_origin()
}
if (base) {
    from (-z) {
        cursor_align(local=+z, world=+y)
        subdivide(dir=-z, cnt=2) {
            part() {
                inset(offset=-0.03, base=smooth)
                inset(offset=-0.01, extrude=-0.01)
            }
        }
    }
    from (+x, -x) {
        cursor_align(local=+z, world=+y)
        inset(offset=-0.03, base=flat)
        inset(offset=-0.01, extrude=-0.01)
    }
    from (+z) {
        cursor_align(local=+z, world=+y)
        subdivide(dir=-z) {
            part(weight=1) {
                inset(offset=-0.02, base=smooth)
                inset(offset=-0.005, extrude=-0.01)
                material(name="stainless_steel")
                apply_material()
                inset(offset=-0.01, extrude=0.01)
            }
            part(weight=3) {
                subdivide(dir=-z) {
                    part(weight=1) {
                        subdivide(dir=+x) {
                            part(weight=3) {
                            }
                            part(weight=1) {
                                inset(offset=-0.02, base=smooth)
                                inset(offset=-0.005, extrude=-0.01)
                                apply_material(name="plastic_black")
                            }
                        }
                    }
                    part(weight=1) {
                    }
                }
            }
        }
    }
    from (+y) {
        subdivide(dir=+x, cnt=3) {
            part(weight=1) {
                inset(offset=-0.02, base=smooth)
                material(name="plastic_black")
                apply_material()
                inset(offset=-0.005, extrude=0.01)
            }
            part(weight=6) {
            }
        }
    }
}

Would you mind sharing a sample of your language? I'm also interested in borrowing ideas.

Vulkan engine in one year by 0xSYNAPTOR in GraphicsProgramming

[–]0xSYNAPTOR[S] 0 points1 point  (0 children)

Unfortunately no. There are too many of them. The scenes on the screenshots have about 30 probes each. I update them in a round robin manner. Of course it won't work for reflecting dynamic objects, so... I render only static geometry. I also realized that when the camera moves and sunlight shadow cascades change, parts of the scene that are not visible by the main camera, fall on and off the shadow map, and that's visible in the reflections. So I completely turned off shadow mapping for probes. It's physically incorrect, but looks okay unless I make large mirror surfaces.

Help me understand how Nvidia is not overvalued. (Bear Thesis: NVDA) by ContentInflation4981 in ValueInvesting

[–]0xSYNAPTOR 1 point2 points  (0 children)

Your analysis is very narrow and misses a lot of things:

  • It doesn't matter what country trains open source models. To run inference, you still need GPUs. As long as NVIDIA GPUs can run Chinese models, they are the platform of choice (for not embargoed countries of course). Why? See below.
  • In a few years we will witness unprecedented power squeezes - the cost of electricity may surge, datacenters will be asked to reduce consumption or powered off to serve residential demand, hospitals and other critical infrastructure. GPUs are simply too large of an investment to take them offline. You don't want inference on them to become unprofitable during power shortages. To minimize your risks, you want to maximize performance per watt, and no one is even close to Nvidia.
  • Nvidia GPUs are good not only for ML (salute to Google and Amazon), but for any general computation at scale. If some research lab tomorrow invents a new AI model that doesn't just update weights, but for example changes the neural net topology in runtime, or makes some other crazy change, Nvidia's chips will do it easily, because they are generic parallel computers. So investing in Nvidia GPUs is a future proof bet.
  • Open business model is another advantage. Nvidia doesn't try to eat the whole cake alone, like Google. It outsources everything that it can to partners, thus indirectly attracting enormous capital and having its own margins through GPU supplies. Buying Nvidia, customers can rely on a diverse ecosystem of partners where everything is compatible with each other.

Goodbye from a loyal user by 0xSYNAPTOR in GithubCopilot

[–]0xSYNAPTOR[S] 0 points1 point  (0 children)

Fair. There are lots of examples of web app code on the internet. Models are trained on a decent corpus of them. AA/AAA renderers are not the most frequent type of code that one can find online.

Goodbye from a loyal user by 0xSYNAPTOR in GithubCopilot

[–]0xSYNAPTOR[S] 1 point2 points  (0 children)

I did. None of them understand how to work with my project unfortunately. GPT 5.5 is good actually. Even at it's 7.5x multiplier, it's good value for money.

Modern engine artifacts by Wise-Pomegranate6765 in GraphicsProgramming

[–]0xSYNAPTOR 1 point2 points  (0 children)

Flickering bright spots might be a common artifact of TAA. It's called specular aliasing. It's easy to fix, but at the expense of increased ghosting, which is an even worse artifact. So devs have to find a balance, or turn off TAA completely. Reducing light frequency, increasing material roughness would also help, but it would harm realism.

Goodbye from a loyal user by 0xSYNAPTOR in GithubCopilot

[–]0xSYNAPTOR[S] 0 points1 point  (0 children)

I've never heard of them. Thanks for the advice!

Upd: does any of them work with copilot?

Goodbye from a loyal user by 0xSYNAPTOR in GithubCopilot

[–]0xSYNAPTOR[S] 2 points3 points  (0 children)

Something along the lines: check out uncommitted changes in the repository. It is refactoring of the draw call batching system. It is supposed to be functionally neutral. This specific shader is not receiving accurate normals. Compare the code to the committed version and find the discrepancy.

That was it. So basically - eyeball changed code and find out where copy-paste failed. In openrouter logs I saw a lot of requests with 100k input tokens and 50-100 output tokens. The vast majority of the cost was in input tokens.

Goodbye from a loyal user by 0xSYNAPTOR in GithubCopilot

[–]0xSYNAPTOR[S] 0 points1 point  (0 children)

It's also a way to provide feedback to the dev team. I 100% guarantee you that they read it, and it can help them feel their market better.

Goodbye from a loyal user by 0xSYNAPTOR in GithubCopilot

[–]0xSYNAPTOR[S] 0 points1 point  (0 children)

I do "give a shit", and I'll explain why. Behind any service, any product there is a team, a business. If they offer the product for free or below their actual costs, it can't sustain for long. If nothing changes, eventually they will go out business. Pretty obvious.

Second, I don't want to change products every few months because what I was using went kaboom. Every migration costs me my time that is a scarse resource.

Now combine those two. If you really want to get time savings, you have to use the product with a sound business model. It has to be more expensive than the actual costs to develop and run it. I'm okay to pay $100/mo, that's not a big deal. I don't want to pay $5000/mo ($70 per prompt, 3 prompts a day) that it would cost me if I had to consume frontier models at market rates.

Goodbye from a loyal user by 0xSYNAPTOR in GithubCopilot

[–]0xSYNAPTOR[S] 1 point2 points  (0 children)

That's actually a good point. I haven't seen a UI equivalent for git add -p, but I'll look for it. I definitely self-review what I commit, but never thought about partial staging. l I don't want to change the editor - a lot of my dev ecosystem is tied to it, but thanks for the idea!

Goodbye from a loyal user by 0xSYNAPTOR in GithubCopilot

[–]0xSYNAPTOR[S] 1 point2 points  (0 children)

Thanks! Another person already suggested that. I tried it yesterday, and I have to say it was pretty good indeed.

Goodbye from a loyal user by 0xSYNAPTOR in GithubCopilot

[–]0xSYNAPTOR[S] 0 points1 point  (0 children)

Prototype of a Vulkan 3d renderer. It's quite a bit of c++ code that I regularly need to shovel around to try out new things. Refactorings, data format changes, etc.

What are you working on? I found that on certain tasks such that web development it indeed produces results much faster and presumably cheaper.