#Fwog and co.

1 messages · Page 10 of 1

shell inlet
#

I almost thought that opengl is not dead

golden schooner
#

hehe

long robin
#

fixed the gamma in the early pics and videos, changed the intro (no more cringeworthy slowpoke meme), and added a bunch of missing content, plus some probably minor changes

#

still need to finish the bloom section and add a table of contents

#

inshallah y'all will skim it and hopefully the new sections will catch your eye

heavy cipher
#

this image is giving me a taaneurysm

long robin
#

lel

#

I just pasted the whole thing into Word and immediately found something I forgor to finish KEKW

long robin
#

quite epic how they are captured in photo mode when literally nothing is moving

shell inlet
#

wait what

long robin
#

well except for the fact that it needs motion vectors for motion blur lel

shell inlet
#

but it has real motion blur why does it need motion vectors

long robin
#

only some things have real motion I guess

#

only vehicles seem to do the jittering thing from what I've seen

#

possibly some other things have it, but I haven't checked

heavy cipher
#

this image reenergizes my hatred for taa

#

stairway to heaven

shell inlet
#

even taa as in name ghosts like taaaaa

#

symbolic

long robin
#

clearly this guy needs to use the transparency and composition mask of FSR 2 for smoke

shell inlet
#

may just use fsr2

heavy cipher
#

tbh i dislike the mixed smooth-blocky aesthetic, but i think this is due to lack of mc indoctrination on my end

shell inlet
#

wait does it use it? I might have misread

long robin
#

nah I'm joking

#

it's a custom TAA impl

#

it ain't the cutting-edge of TAA tech

shell inlet
#

ok then why not use fsr2

long robin
#

it was released before fsr2 existed for one, and secondly there is no official opengl backend for fsr2 (though I have thought about making one myself)

shell inlet
#

I would, I'd hate to implement temporal aa and upscaler myself

#

oh ok makes sense

#

the opengl thing

long robin
#

if I make the fsr2 backend, I will try to convince dennis to use it

heavy cipher
shell inlet
#

what's a riiv

heavy cipher
#

its a joke on RIIR (rewrite it in rust)

long robin
#

the V stands for vuk u

heavy cipher
shell inlet
#

I'm going to use vuk btw

#

vulkan bad imo

#

or maybe C bad

#

and vulkan by extension because it couldn't

heavy cipher
shell inlet
#

what do you mean I'm already using discord

long robin
#

the vuk discor

golden schooner
#

link is in #related-servers

shell inlet
#

yeah idk what for though

golden schooner
#

martty's vuk server

heavy cipher
#

for the excellent discussion of the GP zeitgeist

long robin
shell inlet
#

maybe asking questions there but if it's so bad I couldn't figure it out on my own then I'll be using raw vulkan instead

#

it has examples which should be enough to get started

#

imagine asking questions online instead of reading docs and papers

#

oh wait that's the premise of this whole server

long robin
#

why read docs when you can have someone else read them for you

shell inlet
#

society if people could read docs and papers: <insert image of advanced civilization>

long robin
heavy cipher
#

society if we would have better form of meme generics than templates

long robin
#

vuk fanclub meetup

heavy cipher
#

lmao

shell inlet
#

this sounds like something a rust user would say

long robin
#

I remembered I could do that

heavy cipher
#

sorry jaker

long robin
#

nah I just thought it would be funny lol

#

keep discussing if you want

shell inlet
#

so yeah anyways vuk good I imagine

heavy cipher
#

i imagine that too

#

but its getting better and better

shell inlet
#

I have never used it but I believe that as long as I don't have to manually put barriers it's already a step towards modern age from stone age

long robin
#

OpenGL users be living in 2023

shell inlet
#

yeah someone had to invent vulkan and make us suffer

#

like when newton invented gravity

#

someone had to counterinvent vuk

long robin
#

Fwog is the antivuk

shell inlet
#

is it really though

#

do you go lower level?

long robin
#

All I'm missing is explicit sync

shell inlet
#

or like at least finer-grained

long robin
shell inlet
#

if only graphics APIs were designed around principles of surface easy to use API with fine-grained custom stuff added if something really obscure is needed like manual sync

long robin
#

but practically speaking, no

long robin
#

And nvrhi

shell inlet
#

yeah which is good

#

I am going to use vuk

heavy cipher
#

yeah, unfortunate that openGL doesn't have the hatch to get access to the fiddly bits

#

but it kinda kills the model

long robin
#

Some NV extensions are kinda like a shitty rusty hatch that doesn't open all the way

shell inlet
#

opengl fundamentally is stinky with its lack of structure like what vulkan does with structs and individual enums

#

and multithreading pain

heavy cipher
#

dennis flashbacks

long robin
#

Fwog hasn't solved the multithreading problem, and I dunno if I want to

#

Basically push calls to a buffer and then submit all at once on the main thread

#

Delayed error reporting 😢

heavy cipher
#

its a bit ironic that while the MT problem is solved in vulkan, you also don't really need it

#

except maybe for submitting on a different thread, but thats very coarse

#

okay, maybe for like uploading shit it still makes sense

shell inlet
#

I've heard that even if you have multiple queues gpu may still not be able to process them at the same time after submission

heavy cipher
#

i guess parallel recording can go into the bin if you use indirect

#

on both apis

heavy cipher
shell inlet
#

what are they for even

#

if you only effectively have one

long robin
#

16 queues of Allah

heavy cipher
#

attracting gamers with large numbers

shell inlet
#

but gamers don't even know what a graphics queue is

#

I mean I am a gamer but still

heavy cipher
#

but presumably they are able to understand 16 > 1, which is what matters for marketing

#

i am joking btw, not sure why they did it this way

#

in theory the spec says that implementations should not be locking willy-nilly

#

but that is what you'd call "guidelines"

long robin
heavy cipher
#

instructions were clear, willy is free froge

long robin
#

I wonder if there's a clever way to expose glTextureBarrier, or if I should just make a simple wrapper (with possibly better naming)

golden schooner
#

hehe

#

the answer to the question is the question itself, since you answered it already 🙂

golden schooner
#

took me a minute to find the fwog thread again : )

#

made me smile a little, and reminded me of previous type-safety-discussions

long robin
#

Fwog and co.

oak garden
long robin
#

@heavy cipher does vuk do anything to improve type-safety for images?

heavy cipher
#

no

long robin
#

I imagine it has crossed your mind too though

heavy cipher
#

yes

#

Tear wanted typed buffers for some time

#

but baking the format at compile time, not sure how useful that is

#

your code cares very little if you use RGBA or BGRA

#

but if you bake that into the type, you have to carry it everywhere

long robin
#

yeah format baking sounds eh, but baking the "class" of the texture (color, depth, stencil) sounds useful

heavy cipher
#

yes

#

that might be useful

#

but still needs to be executed well

long robin
#

another one is baking the number of components, but that also carries some of the suckiness from the first idea

heavy cipher
#

i don't mind you going onto the minefield first froge

long robin
#

what sort of issues do you foresee?

#

it sounds relatively straightforward to me

heavy cipher
#

where would you use the type info?

#

is it just variable type safety

oak garden
#

How is fwog doing lately

heavy cipher
#

or do you want the api to work on it?

long robin
#

and the API will use these types, e.g., for render pass info

long robin
oak garden
long robin
#

mostly just polishing the API at this point and fixing bugs

oak garden
#

Yeah makes sense

long robin
#

nothing major left to do

oak garden
#

Except write docs and lure in users 🙃

long robin
#

Oh yeah, docs

#

I need to figure out how to do that

oak garden
#

doxygen is nice

long robin
#

The last time I had to generate docs was in college, and we used doxygen

oak garden
#

Still works like a charm tbh

golden schooner
#

its useful wen constructing an efbo i guess

#

when you want to add a color texture as GL_DEPTH_SHRIMPLE

#

where the type safety officer should interject

#

or in glBindXXXUnit situations mayhaps (at least in debug)

long robin
long robin
golden schooner
#

to be part of create_texture_info then?

long robin
#

Yeah

golden schooner
#

makes sense

long robin
#

But then I'd still want the generic "texture" interface in case something doesn't care

#

Which means I'd need something more to make these types work

#

Like a variant

golden schooner
#

what would a case like that be, where something doesnt matter

long robin
#

Hmm gimme sum types

golden schooner
#

ImGui::Image() doesnt count

long robin
#

But yeah can't think of much else

long robin
#

Still, it's a useful feature for that

golden schooner
#

there are no variants or situations where it doesnt matter what type of exture it is

#

if the fbo is somehow linked to a fragment shader output, that would be neat

#

as part of debug-validation-isms

#

slithglyery different topic tho

oak garden
#

TypelessTexture?

#

or Texture<void> lol

golden schooner
#

dont give him ideas

heavy cipher
long robin
oak garden
#

Right yeah

golden schooner
#

hmmmmmmm

#

but then the texturecreateinfo is useless

long robin
#

I'd have to make multiple create info structs, one for each "specialization"

golden schooner
#

if you use inheritance, then you can also just use a factory, and just make it multiple factory methods, rather than extending the createinfo

long robin
#

Then the specialized structs would be translated to the generic one

#

I wouldn't extend the create info exactly

#

It would be separate create infos in order to enforce type safety

#

depth stencil create info, color create info..

golden schooner
#

hmm

long robin
#

I'm still not convinced that this will be super useful

golden schooner
#

validation layer is probalby a good thing in general

oak garden
#

opengl-validation-layer 🥲

golden schooner
#

at some point we should pick that one up again, was a good start 🙂

long robin
#

it's a big pita though

golden schooner
#

ye

oak garden
#

Yeah kinda :p

long robin
#

another issue I see happening with my inheritance approach is the potential need to convert from generic textures (the base class) to its derived classes. I guess that could be a move constructor with a runtime check

oak garden
#

Could be some sort of .cast() on the generic one

long robin
#

not a bad idea

#

I wonder how that would work without a dynamic cast though

#

Er, ignore that

golden schooner
#

the whole engine is not really made with oopisms in mind why start now 🙂

long robin
#

It would basically be a static cast, except textures can't be copied, and reinterpret cast would be fat UB

golden schooner
#

oopsi-isms more likely lol

oak garden
#

cast() would consume the generic one into a typed one

golden schooner
#

nah just transport the type via the create struct, bindxxxunit/fbo creation have access to it then

#

hmm

#

or use the format already? which you specify anyway when creating a txture?

long robin
#

Just more documented in the API I guess

oak garden
#

Yeah

long robin
#

Feels kinda icky that a non move constructor function would invalidate the object though

oak garden
#

Yeah it's not a common pattern in C++ I suppose

long robin
#

uh std::move(myTexture).cast()

oak garden
#

Cast could be a free function probably

#

To make it less awkward

long robin
#

this smells like a comism

heavy cipher
#

to be on the same page i have no idea what is being discussed but it doesn't seem good

long robin
#

very icky, no good, etc.

final cove
#

.cast() seems like a massive antipattern

#

you know you can override the cast operator

#
operator DestType() {
  ...
}```
rugged notch
#

You could use a &&

#
DestType cast() && {}
#

But ye should probably be the cast operator

#

Can you specify rvalueness on a cast operator :0

final cove
#

looks like yes

#

completely forgot about &&

daring surge
#

i was reading it as if (func() && {})

#

disturbed

rugged notch
#

Yee

long robin
#

man, math has me fucc'd up yo

  • "a 2-sphere is an ordinary 2-dimensional sphere in 3-dimensional Euclidean space, and is the boundary of an ordinary ball (3-ball)." https://en.wikipedia.org/wiki/N-sphere
  • "A sphere (from Ancient Greek σφαῖρα (sphaîra) 'globe, ball')[1] is a geometrical object that is a three-dimensional analogue to a two-dimensional circle." https://en.wikipedia.org/wiki/Sphere
#

not to be conchfused with n-balls

  • "A 2-ball, a disk, is the interior of a circle (1-sphere)."
  • "A 3-ball, an ordinary ball, is the interior of a sphere (2-sphere)."
#

the real ball torture was in trying to figure out how to simply generate a random direction vector in a cone

oak garden
long robin
#

mfw my old renderer that uses c++20 modules no longer compiles (I get an epic ICE)

long robin
shell inlet
#

no the one above it

long robin
#

that's actually the top result for me KEKW

shell inlet
#

can't be

#

how so

long robin
#

idk tbh

#

lol .69 seconds

oak garden
#

hey thats my university

#

ive had classes from that professor, hes a good dude

#

wtf i didnt know this

#

i gotta ask him next time i see him

long robin
#

the gastrointestinal compendium is quite based

oak garden
long robin
#

hmm is it possible to introspect the workgroup size of a compute shader

heavy cipher
#

void GetProgramiv( uint program, enum pname,
int *params );

  • If pname is COMPUTE_WORK_GROUP_SIZE, an array of three integers containing the local work group size of the compute program (see chapter 19), as specified
    by its input layout qualifier(s), is returned
long robin
#

ah I was looking at GetShaderiv 🦐

heavy cipher
#

ref pages
links the wiki
:screm:

long robin
#

wik peges

#

they're the same to me given the quality of information they provide lel

heavy cipher
#

eh wiki is much better

#

actually provides value over the spec

#

whereas the ref pages is just the spec that someone copied while peeking during the exam

long robin
#

fair 'nu'f'

heavy cipher
#

'

long robin
#

sometimes the wiki has questionable info, but as a learning resource it do be pretty good

heavy cipher
#

ye, sometimes it do be like that

long robin
#

what's going on in the second-to-last line here? it's like it's rotating the basis of the normal vector or something, but I don't have an intuition (all of it was lost after my final linear algebra exam) (code from learnopengl)

vec3 ImportanceSampleGGX(vec2 Xi, vec3 N, float roughness)
{
    float a = roughness*roughness;
    
    float phi = 2.0 * PI * Xi.x;
    float cosTheta = sqrt((1.0 - Xi.y) / (1.0 + (a*a - 1.0) * Xi.y));
    float sinTheta = sqrt(1.0 - cosTheta*cosTheta);
    
    // from spherical coordinates to cartesian coordinates
    vec3 H;
    H.x = cos(phi) * sinTheta;
    H.y = sin(phi) * sinTheta;
    H.z = cosTheta;
    
    // from tangent-space vector to world-space sample vector
    vec3 up        = abs(N.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0);
    vec3 tangent   = normalize(cross(up, N));
    vec3 bitangent = cross(N, tangent);
    
    vec3 sampleVec = tangent * H.x + bitangent * H.y + N * H.z;
    return normalize(sampleVec);
}  
heavy cipher
#

just coordinate space conversion?

long robin
#

I'm only used to seeing it expressed as a matrix-vector mul so I feel 3head looking at this

oak garden
#

isnt this just TBN * H

long robin
#

hold on I'm writing this one out

heavy cipher
#

3-head, or ordinary head

long robin
#

let me make something presentable

#

wait nvm I'm a moron

shell inlet
#

it's a matrix and vector multiplication

#

I'd compose tbn into a mat3 instead tho

long robin
#

is this literally just a more obfuscated matrix-vec mul

shell inlet
#

yea

oak garden
#

yeah, if im not mistaken this is just mat3(T, B, N) * H

long robin
#

I wrote it out and they are the same in terms of final result

#

I assume they are the same number of ops (I'll let someone else confirm xd)

oak garden
#

definitely after optimization

long robin
#

that conchfusing piece of code has been bugging me for a long time

oak garden
#

learnopengl shader code be weird sometimes

long robin
#

but now I'm even more annoyed that it's something shrimple expressed in a different way

long robin
#

found some pretty big brain code that I wrote in an SSR shader a while back

    vec3 worldPosition = WorldPosFromDepth(texture(s_depthTex, projected.xy).x, u_viewportSize, u_invViewProjMat);
    float viewDepth = (u_viewMat * vec4(worldPosition, 1.0)).z;
heavy cipher
#

if you paid for all those gpu cores, you better use em

shell inlet
#

texture(s_depthTex, projected.xy).x?

long robin
#

oh that code is sus too

#

should be textureLod since it's in a divergent loop

shell inlet
#

no I mean it's what you can do to get view depth

#

asking if that's the funny part

#

that you get view depth from reconstructed world pos using view depth

#

but also wait isn't it lacking perspective division

#

that's clip space z

heavy cipher
#

the joke is bouncing between spaces like a football on methamphetamines

long robin
shell inlet
#

window space depth? whassat

long robin
#

hyperbolic depf

heavy cipher
long robin
#

I'm not taking any chances

shell inlet
#

hyperbolic depth what's that

long robin
#

the value that's stored in the depth buffer

heavy cipher
#

is the thing from dragon ball Z

shell inlet
#

ndc space z then?

long robin
#

opengl has different window space and ndc space depth by default which is cancer

shell inlet
#

v/v.w: clip->ndc

long robin
#

window space: [0, 1]
ndc space: [-1, 1]

#

non-dumb APIs have [0, 1] ndc depth

shell inlet
#

first time I'm seeing window space term

#

[0; 1] is like uv space

#

I'd assume window space meaning viewport space or something

#

where it's in pixels

long robin
#

also called screen space

#

actually that's a lie

heavy cipher
#

opengl is chadonkulous api because ndc depth is configurable

shell inlet
#

is it not in d3d?

#

idk last time I used d3d was d3d9

long robin
#

I love copying my old GL code and it not working in my current project because the ndc depth range is different

heavy cipher
#

i don't think it is configurable either in d3d or vk

long robin
#

vk has an extension

shell inlet
#

not in vk that'd be weird

#

it's a knob simulator

#

can even use negative viewport

long robin
#

VK_EXT_depth_clip_control lets you use the GL convention

heavy cipher
#

ah you are right

long robin
viral haven
#

Jaker, is this way of deferring initialization considered 'good practice' or is this a temporary workaround?cpp // Since pipelines have complicated construction, we use a std::optional here to // delay its initialization so it can be constructed in the body of the function. std::optional<Fwog::GraphicsPipeline> pipeline; Seems pretty interesting, and by doing this I dont need to use std::unique_ptr in a few places just because I needn deferred initialization

shell inlet
#

you mean you didn't know about optional?

viral haven
#

I knew about it, but only use it in places where the data type it wraps is optional

#

Like the mapped buffer pointer for a constant buffer, when the buffer abstraction is same for all types of buffer

#

I'll switch my code to use it, much better than having these random unique pointers that wrap objects that dont need to be heap allocated and in turn hold some pointers internally

dire badge
#

optional allows the memory to be pre-allocated

#

using unique_ptr would mean allocating from heap

#

for that reason I am myself transitioning from unique_ptr to optional where possible

#

optional<> member memory is part of the struct/class it is part of

shell inlet
#

it's a tagged union that's pretty much all there is to it

dire badge
#

on the other hand, unique_ptr<> works with forward declared types

#

optional<> needs the type to be defined

long robin
#

But that means I'd need another function to make the pipeline 😩

#

I think using std::optional is not a bad way of doing deferred init still, if it is needed

shell inlet
#

or what is the issue?

long robin
#

the problem is entirely me being lazy

shell inlet
#

skill issue!?

long robin
shell inlet
#

/s

long robin
#

maybe I should change it for hello triangle so I don't teach bad habits immediately

shell inlet
#

people(1) come at you with a raised eyebrow already so perhaps

#

but tbh maybe it's cause people come to look at examples with too high expectations

#

you have the mvp tag after all

golden schooner
#

hehe i rember trying to convince jaker of temporal coupling

#

back in july last year

long robin
#

temporal coping

golden schooner
#

🔬

long robin
#

@heavy cipher remember when you teased me for that sus "avoids UB" comment that my program has? well now I can blame someone else KEKW

shell inlet
#

what was UB?

#

no atomics?

long robin
#

apparently the race to write the constant value 1 to the buffer

#

without an atomic op ye

shell inlet
#

that does look like ub

#

well it's not ub for nvidia, when published by nvidia, cuz they're in charge of the behaviour

#

would be evil if picked up as is and broken on other vendors' hardware

long robin
#

maybe they can just bundle the correctness into some implicitly-enabled shader extension like GL_NV_gpu_shader69

shell inlet
#

ngl the "no atomics required" comment sounds like tongue in cheek bruh who cares about other hardware

long robin
#

I'm pretty sure it worked on AMD when I tested but idk

#

I don't see how this could fail on any hardware tbh, even if it is technically UB

shell inlet
#

I might be looking too deep into it

long robin
#

I don't think it's a very big deal overall

#

it does make my language lawyer senses tingle though

golden schooner
#

ub = unique box? 😛

#

ngl, that emoji was a great addition

oak garden
#

it is

golden schooner
#

thank you pixel 🙂

long robin
#

ok I just realized that you can put immediately-invoked lambda expressions basically anywhere

      auto descColor = Fwog::VertexInputBindingDescription{
        .location = []() { return 1; }(),
        .binding = 1,
        .format = Fwog::Format::R8G8B8_UNORM,
        .offset = 0,
      };
shell inlet
#

even in templates

#

in C++20

oak garden
#

low effort meme

shell inlet
#
Foo<decltype([]()->void { })> foo;
oak garden
#

You can use that for custom hash functions but its a bit cursed

shell inlet
#

C++ is entirely cursed

#

what's your point

oak garden
#
std::unordered_map<std::string, int, decltype([](std::string const& s) { return s.size(); })> map;
#

true

long robin
#

my autoformatter did not like it, but it checks out

oak garden
#

Ah yes, () > ()

long robin
#

👁️>👁️

golden schooner
#

please write things out

#

rather than cram shit into stuff 🙂

long robin
#

making a lambda that returns the constant 1 feels fancy though

shell inlet
#

no difference for release build after optimizations either

#

but still not a welcome practice tbh

golden schooner
#

can you not use the constant in place then?

#

or was that for example's sake?

long robin
#

I like to put things like this in my code to keep readers on their toes

golden schooner
#

hehe

long robin
#

re the conchfusing std::optional thing in hello triangle: it is now fixed (read: gone)

shell inlet
#

👏

long robin
#

I like how only the GL 2 ref pages have the warning

golden schooner
#

heh

#

that also reminds me of another project i wanted to do

#

i wanted to make all the glXXX links available as hyperlinks

#

and link missing ones in the See Also section

long robin
#

seems like GL lacks an equivalent to arrayPitch and depthPitch in VkSubresourceLayout

#

so I guess they all use the value for UNPACK_ALIGNMENT

long robin
#

wtf it took until GL 4.3 to be able to read the stencil plane of a depth+stencil texture

long robin
#

only problem is that it revealed a leak I have in my fbo cache nervous

#

fun fact: you know how your cursor "sticks" to the edge of your screen when you're resizing a window? that behavior persists if the app crashes while you're resizing the window

long robin
#

lel my cache wasn't calling glDeleteFramebuffers on old entries. it was just removing the item from the map

oak garden
#

If only it was a RAII handle kek

heavy cipher
#

or RAIII

long robin
#

resource acquisition is leaking (RAIl)

long robin
#

ye probably

#

btw the fps goes up to infinity when resizing the window :^)

#

it saturates more quickly than reinhard which is nice

long robin
#

maybe it's bespoke

#

when I google "exponential tone mapper" I get some formula that does not look like the one I just showed (which is what teardown uses btw)

shell inlet
long robin
#

reinhard looks washed out/desaturated in my objective opinion

shell inlet
#

use luminance based version

#

it preserves chroma

#

I've sent you one, you said it had moar color

#

^

#

extended reinhard with arbitrary white point may also be made to work on luminance

long robin
#

let's see how teardown looks with reinhard 2

shell inlet
#

this is reihnard 3 then ig

#

this is luma+whitepoint(aka extended rain hard) version

long robin
#

bespoke vs reinhard1 vs reinhard2

#

idk what value to select for the white point in reinhard3 so I didn't test that

shell inlet
#

not enough intensity to test desaturation imo

long robin
#

yeah the only bright thing in this scene is the lämp

shell inlet
#

but I can see that the luma rh looks way too saturated

long robin
#

ye I was surprised

shell inlet
#

and original rh is dim as usual

#

cause 0-1 maps to 0-1/2

long robin
#

yeah it seems like teardown is barely hdr

#

the sun isn't that bright either iirc

shell inlet
#

compression test on sine wave

long robin
#

looks nice

shell inlet
#

here for lulz I put the tanh which is a standard audio limiter in DSP

#

used in audio that is

long robin
#

TIL

shell inlet
#

it compresses even less than the bespoked

long robin
#

hmm it seems like it's getting compressed more quickly

shell inlet
#

and therefore the rate of desaturation should be smaller as well, I think

#

but more bright parts on the image too

#

I think it's possible to extend the luma based operator and add controlled desaturation if you still want it

#

as a separate curve

#

luma based one just doesn't desaturate whatsoever because chroma is left out of the equation

#

btw white point in extended reinhard is usually max luminance on the image

#

but if you want to leave some more white parts on the image with extreme luminance differences (like some dark room with sunlight coming in) you can use some heuristic to clamp it so that you don't compress it all and be left with a dark room as a result

#

usually determine the upper bound of luminance based on screen coverage

long robin
#

yeah maybe using some upper %ile luminance instead of just the max

shell inlet
#

yeah building a histogram out of binned screen tiles is a good starting point

#

but can be approximated with different means of whole screen

#

by using two means from power(generalized) mean

long robin
#

I wonder how well a temporally-accumulated monte carlo sampling scheme would work for this

#

probably terribly, but it'd be funny

shell inlet
#

e.g. geometric mean for lower bound (used for autoexposure) and cubic or quadratic mean for upper bound for the white point

long robin
#

what is g? your test "image"?

golden schooner
long robin
#

hehe that's the one already in the game frogapprove

shell inlet
#

the "image" is f

#

those means are all mostly special cases of power mean btw

#

also I've said it once before but min and max functions are also, in fact, special cases of power mean

#

for when power is negative and positive infinity

shell inlet
#

@long robin can you try this out with white = 2 to see if it preserves whites? I think it should

long robin
#

In Teardown?

shell inlet
#

yeah

long robin
#

!remindme 15 hours aaaaa

maiden peakBOT
#

Alright Jaker, I'll remind you about aaaaa in 15 hours. ID: 54062978

shell inlet
#

but I mean if there's a different way for you it'll work, but you have the others from teardown already to compare against

long robin
#

aight gimme a sec

shell inlet
#

hmm not a big difference

#

what if you try 1

#

it really is not very HDR game

long robin
shell inlet
#

success

long robin
#

ok I think I see why it's not very HDR

shell inlet
#

autoexposure?

long robin
#

it seems like the image is clamped to 1 before bloom

shell inlet
#

well it can be clamped after tonemapping but not before

#

so it's a bug

long robin
#

kinda weird b/c the diffuse light behind the wall is >4

shell inlet
#

also I went over different tonemapping sources and found one on shadertoy that resembles the one in teardown

#

it's called rombindahouse tonemapper

#

it's similar because it uses exp

#

but it's not exactly just exp

#
vec3 RomBinDaHouseToneMapping(vec3 color)
{
    color = exp( -1.0 / ( 2.72*color + 0.15 ) );
    return color;
}
long robin
#

RomBinDaHouseToneMapping
that name has to be a shitpost

shell inlet
#

the pow is gamma thing

#

it's named after the creator I think

long robin
#

Rom B.?

shell inlet
long robin
#

I wonder where the B comes from

#

maybe it stands for based

shell inlet
#

I hate that shader btw

#

some tonemappers have srgb conversion in them and some don't

#

and ones based on extended reinhard called white preserving

#

but it's just the version with white point beyond which the image is clamped

golden schooner
shell inlet
#

or maybe don't

#

it's kinda heavy on maths, not as much of a quick read as I initially thought

long robin
#

I wish I knew what a spherical gaussian is

long robin
#

I think maybe instead of doing VXGI next, I'll just skip straight to DDGI

#

VXGI has some weird stuff like needing geometry shaders or having to render the world 3 times

#

plus it needs float vector atomics or you have to use some fixed-point yuckiness

#

that being said, I need a whole RT setup for DDGI okey

#

could be my excuse to start using vulkan so I can get those ez BVH gainz

shell inlet
#

and make a new vk wrapper?

shell inlet
#

it has a very self explanatory name

long robin
#

gaussian on the surface of a sphere 😳

daring surge
shell inlet
#

lmao

long robin
#

notices bulge 😳

shell inlet
#

when you draw it like that it looks silly

shell inlet
#

I prefer the colormap version

#

but the displacement version is better if you have a big range of values on a sphere

long robin
#

I wonder if amending a commit in VS with no message will apply --no-edit

#

context: I messed up a commit (not pushed yet) and want to fix it, but without changing the message

#

ah, it autofills the previous commit message when you check the amend button

#

nice

#

finally, society has advanced to the point where we can write
Fwog::Cmd::BindUniformBuffer(0, reprojectionUniformBuffer);
instead of
Fwog::Cmd::BindUniformBuffer(0, reprojectionUniformBuffer, 0, reprojectionUniformBuffer.Size());

shell inlet
#

default argument magic?

long robin
#

yeah I just introduced a constant called WHOLE_BUFFER (which totally isn't a copy of VK_WHOLE_SIZE) and then added default args

shell inlet
#

I've also done that, I approve

#

but why not FWOG_WHOLE_SIZE

long robin
#

it's a constexpr variable

shell inlet
#

is it somehow a scoped constant

#

namespaced

long robin
#

yeah

shell inlet
#

makes sense then

long robin
#

but you just made me realize it was in a slightly wrong namespace

shell inlet
#

I forget that vk is C at the base level

#

and has no ++ features

long robin
#

sad

shell inlet
#

can't make C folk sad either

#

even if their choice of language is not universally the best

golden schooner
#

what about the cluster volumeisms?

shell inlet
#

it becomes funnier every time deccer reminds you about cluster volumeisms

golden schooner
#

: D

#

the knife pic is really spot on

brisk narwhal
#

time for the daily vulkan shilling

brisk narwhal
#

what are those clustered volumeisms anyway

long robin
#

deccer wants me to implement clustered rendering because I said I'd do it at one point

brisk narwhal
#

the thing where you cull point lights?

#

fair enough lol

long robin
#

efficiently culling spot lights is hell though

golden schooner
#

reminds me of your volumetric exshrimple 🙂

brisk narwhal
digital lion
#

fyi i tried out the thing I mentioned in #opengl - just fetching the entire triangle in the vertex shader (even if that means a bunch of redundant loads) and it turned out to be slightly faster than geometry shader

#

so first excuse doesnt count

shell inlet
#

how much DDGI is actually more memory efficient than VXGI is the question I am wondering about

#

from my understanding DDGI is a probe based solution on steroids

#

which also brings about the question of how you utilize it in a big open world environment

#

not only you have all these accel structs hanging out in memory you also have dense probe arrays there too

#

VXGI at least perhaps can be made to work with clipmaps

#

even though I'm skeptical about how good it would perform visual quality wise

long robin
#

You can make DDGI or any other probe method work with clipmaps

#

In one demo, they had a few MBs of probes covering a 1km^2 scene and it looked pretty good

#

One of the main things going for DDGI is that you can practically reuse any existing probe data structure that your engine has, but then upgrade it with the DDGI stuff (vsm per probe and ray tracing)

digital lion
#

can it handle specular reflections

long robin
#

uh I think Morgan McGuire talked about specular reflections at the beginning of his DDGI talk

#

Since you have actual RT, you can use another method like tracing at a low res and blurring based on surface roughness

#

So DDGI doesn't handle specular itself, but specular can be easily handled some other way

digital lion
long robin
#

Lol balls

#

There is a nice gdc talk about it

#

DDGI I mean, not balls

final cove
#

make sure to read the relevant academic papers on morgan mcguire's balls

long robin
daring surge
#

where's the animation section ||/s KEKW ||

#

very cool though, i thought about posting this in my work's slack graphics channel but then i realized that may somehow trace back to this discord/me

#

(imagine this in meme format):
letting people online know my real identity :drake_yes:
letting people irl know my online identity :drake_no:

heavy cipher
#

or rock KEKW

#

when are you posting it fr

long robin
#

one sec, gaming

long robin
heavy cipher
#

well

#

you don't have a twitter now do ya

long robin
#

no

#

but one of y'all can post it there on my behalf

shell inlet
#

ok

#

looks like a dead subreddit

#

maybe post it on gamedev

long robin
#

it gets a few posts a day

#

r/gamedev is trash but maybe it's worth it for da updoots

#

and actually active community

shell inlet
#

yeah but it's also 15% odds of not being deleted and banned

#

their moderators are mentally ill

long robin
#

they have a no self-promotion rule iirc

#

which imo this doesn't fall under because I'm not shilling my own product

#

I'll crosspost to VoxelGameDev too

#

gotta get the word out

rugged notch
#

well damn, thanks for the mention

#

it's not like I literally didn't do anything KEKW

#

the court jester build

long robin
#

I think I just looked at the people who talked about it in some way from the last time I posted it

#

kinda hard to keep track of shoutouts so I just made sure y'all were in there frogeheart

shell inlet
#

wait you actually shouted out a guy called void lmao

long robin
#

how else am I supposed to mention you KEKW

shell inlet
#

why am I there to begin with

long robin
#

cuz you were here

shell inlet
#

okay it's not like people would look at it and know it was me anyways

#

btw was live presentation given before the other breakdown

#

subtle way to say you were first

long robin
#

yeah, it was KEKW

shell inlet
#

teardown uses threshold bloom the bad kind of bloom

long robin
#

but at least it doesn't do a single gaussian filter like learnopengl bloom nervous

shell inlet
#

the learnopengl is truly a message to the creator

#

rather than description of the resource

#

k that was rude

long robin
#

r00d

shell inlet
#

I will reuse the joke in a different context some time later

golden schooner
#

you have mvp, i fink its worthy to be placed in #graphics-news

heavy cipher
#

post also on /r/tifu "TIFU by starting work on a blog post 2 weeks late"

heavy cipher
#

your post was already featured on Sunday in the Graphics Programming weekly, what is this sorcery

shell inlet
#

what is this gp weekly

long robin
#

I look at that every week, but I thought you had to submit articles to the author 😄

heavy cipher
#

(also congrats of course 🙂 )

long robin
rugged notch
#

you think the average r/gamedev user will even understand what you're talking about?

#

O ye of too much faith

long robin
#

yeah the other frame breakdowns that I've seen posted there got a small amount of attention

#

I wasn't expecting much tbh, judging by the subreddit's contents

heavy cipher
#

/r/opengl perhamps

long robin
#

90% of posts are from absolute beginners, and not all of the remaining 10% are technically inclined

shell inlet
#

what if r/TeardownGame/

long robin
heavy cipher
#

you can also consider /r/programming

long robin
#

mayhaps

#

I think I'll just post it in the teardown sub and stop spamming this finally

heavy cipher
#

just spam it a bit more

long robin
#

just a spoonful of posts

long robin
#

The users obviously like the game, but I wonder if they care for what my post has to offer

heavy cipher
#

maybe you could make a mod where you can destroy individual opengl calls

final cove
#

r/opengl and r/programming sound like places where people go to ask why their glVertex2f doesn't work

long robin
#

imo

  • r/opengl isn't ideal because it has a) lots of noobs and b) the fact that teardown uses opengl is the only relevant thing (I don't show any actual GL calls in the entire breakdown)
  • r/programming isn't ideal because there is barely any actual code in the article, and the topic isn't about programming itself, but idk
heavy cipher
#

imagine the amount of interactions you'll get from people pointing out you posted in the wrong place

long robin
#

maybe I should've posted in r/programminghorror then

heavy cipher
#

r/programming is just an aggregator for programming related topics

long robin
#

hmm you are right

#

however, I'm out of posting credits for the month, so someone else will have to do it on my behalf if they really want to

final cove
#

is that a legit thing, I haven't touched reddit in years

long robin
#

I'm cappin', I just don't feel like posting it more

shell inlet
#

if elon buys reddit it might become a thing

long robin
#

-1000 elonbucks

shell inlet
#

elonbucks lol

heavy cipher
#

upvotes renamed to elong

golden schooner
#

the problem is you just posted a link

#

rather than introducing the thing with a paragraph 😛

#

but i couldnt care less about reddit, so, disregard what i said

final cove
long robin
#

hehe I thought about writing a little paragraph to introduce it to each community, but idc

final cove
#

cover letter vibes

long robin
#

much easier to just post a link and let people form their own thoughts

golden schooner
#

nah cover letter vibes is a different thing

long robin
#

the vibe I get is that it's effort and isn't worth it

golden schooner
#

fair

long robin
#

I'm not trying to minmax karma, but rather post to communities that might find the thingy interesting 😄

golden schooner
#

its all good : )

long robin
#

some fucked up ray traced shadow maps bruh

#

not really getting that contact hardening atm

shell inlet
#

what the hell

#

where did ray tracing come from

long robin
#

I'm ray tracing inside of a shadow map, like SSR

#

so it's not using any of the stuff that makes real ray tracing hard

shell inlet
#

ah, disappointing

#

it's the UE5 thing right

heavy cipher
long robin
#

I'm trying to copy it, but I think I'm missing the crucial "virtual shadow maps" component of it, which seems extremely complicated to implement

#

well I'm seeing how crucial it really is

#

so far, my implementation of SMRT is about 30 loc

dire badge
#

And why not real ray tracing?

long robin
#

because I'm not trying to implement that

dire badge
#

I am curious why you are not trying?

long robin
#

I'm explicitly trying to implement something like UE5's SMRT to see how it is

shell inlet
#

perhaps more work on the host than in the shaders

#

rt is cooler than whatever hack ue5 has tho

long robin
#

might try RT when™️ I switch to vulkan

#

that way all the boring parts are done automatically

shell inlet
#

even software rt shadows should work fine on as low as gtx1050

long robin
#

replaced with a bunch of other boring vulkan stuff I have to do KEKW

shell inlet
#

in fact shadows is the possibly fastest type of ray, given that you terminate on any hit (as opposed to closest)

long robin
#

the fastest ray is the one not cast smart

shell inlet
#

the best rendering technique is the not implemented one smart

long robin
#

it's an odd game, to be sure

shell inlet
#

the best graphics are not rendered on our computers 🧠

long robin
#

deep

shell inlet
#

btw the reason I'm skeptical about the UE5 technique is that it looks overly complicated

#

can't quite put it into words

#

like a hack on a hack or something

#

those kinds of algorithms always become a pita in unpredictable ways

#

my rule of thumb is that the less knobs the algorithm has the better it is

long robin
#

I think the main problem my impl will have is not having a high enough shadow map resolution

#

virtual shadow maps basically lets UE increase the shadow map resolution by a huge amount with the same perf

#

the shadow map is still only a heightmap, which they seem to somewhat deal with by limiting the max shadow angle

#

UE's impl doesn't seem to exhibit bad artifacts, and it works basically as you would expect

dire badge
#

I've almost totally stopped trying to do "better" shadows with rasterization. Why bother, in a few years raytracing will be the solution anyway

shell inlet
#

looking forward to nvidia either reducing rasterization capabilities, or buying a case with the size of an average kitchen refrigerator

long robin
#

the question is when are shadow maps going to be slower

heavy cipher
#

you can do hybrid

#

and then you can set your ray budget as a perf togg

long robin
#

the shrimple solution is always to implement both things and blend them in a clever way

heavy cipher
#

you mean the unshrimple solution

shell inlet
#

the clever solution

#

because in a clever way

long robin
#

double plus unshrimple

long robin
#

perfect for me

long robin
#

a potentially interesting idea for fwog is to have it run and make gl calls on another thread

#

would be sort of a massive butt pain making the infrastructure to defer calls and whatnot, just to potentially move the driver overhead to a thread

heavy cipher
#

would you really want to do that instead of vk?

#

(not meming this time, pinky swear)

long robin
#

honestly it's probably less effort than moving to vk

#

but vk still offers a million other things that makes it nice

#

and it's not like I'm drowning in driver overhead rn. I just thought of it because it was brought up in #opengl

heavy cipher
#

#opengl

long robin
#

I look at that channel to feel something, anything at all. Ya feel?

golden schooner
#

did i not suggest such an endeavor some time ago already

long robin
#

yu did

#

multiple times I bet

golden schooner
#

you bet

#

the picture above is funny

long robin
#

bet

golden schooner
#

streaming verticles and textures via freds should be intermeresting

oak garden
#

Thats very doable because you can shrimply write to a mapped buffer

golden schooner
#

yep, but the infrastructure around it is what makes the thing interesting

long robin
#

@golden schooner I see you are utilizing the handy inverted rainbow emoji from the voxel server 😄

long robin
#

btw a discussion with dethraid made me realize that I forgor to load textures as srgb in the fwog examples 💀

golden schooner
#

: )

#

i load them as srgb in enginekit since we last schpoke abou it

#

3 or 4 weeks ago

#

you should also port that mc clone to fwog 🙂

long robin
#

before and after

#

now I gotta crank the sunlight up

golden schooner
#

needs some AO

long robin
#

now I need a tonemapper because I cranked the sunlight

#

the colors feel so saturated now 😄 (with reinhard_luminance)

#

wow this scene has actual color

#

I feel like a colorblind person seeing color for the first time in this 😄

golden schooner
#

xD

#

i must admit this one looks the best out of the ones ive seen so far

#

"colorful" indeed

long robin
#

also I think I had a revelation

#

storing srgb albedo in your gbuffer is probably a good thing

#

teardown didn't need to have an RGBA16_UNORM albedo buffer, but instead RGBA8_SRGB

golden schooner
#

are you adding that thought to your publication?

long robin
#

perhaps

golden schooner
#

speaking of updating

#

are you going to PR your enet cleanups upstream?

long robin
#

I don't have any plans to do so

golden schooner
#

why not

long robin
#

laziness

#

eh whatever I can do it now

golden schooner
#

schleppiness doesnt count

#

😄

long robin
#

my fork has some "jaker" comments in it so I can quickly search for my changes 😄

#

in case something broke

#

it also moves the include to a different folder because that's how I like it

#

therefore idk if it's ideal to submit as a PR

golden schooner
#

that one should just be a CMakeLists.txt ism

#

you could PR just the actual fixes without the folder changes?

long robin
#

the fixes are kinda meh

golden schooner
#

i thought WIN32_LEAN_AND_MEAN defines all the NOXXXs

#

there is also a VC_XXX_LEAN_XXX thing

#

hmm the last commit probably makes the most sense

#

but i see why you dont feel its worth the hassle

long robin
#

but it looks funny when you have that big list of defines

golden schooner
#

its more exschleppicite

long robin
#

back to the original topic: teardown is failing to use srgb images anywhere, so it has to 1) do pow(color, 2.2) on materials to convert to linear, and 2) use an extra-wide albedo buffer to account for storing gbuffer albedo in linear

#

anyways, I wonder if gltf textures declare their usage

#

or if I have to create srgb views of color textures after they are uploaded and I can see that they are being used for color

golden schooner
#

good question

#

gltfspec should have an answer

long robin
#

doesn't seem to have anything of the sort

#

my spec is better 😄

golden schooner
#

could it be in sampler?

long robin
#

looks like it's only implicitly specified in the material

#

so once I see that an image is used for color, I can make an srgb view of it and throw the texture away

#

The base color texture MUST contain 8-bit values encoded with the sRGB opto-electronic transfer function so RGB values MUST be decoded to real linear values before they are used for any computations. To achieve correct filtering, the transfer function SHOULD be decoded before performing linear interpolation.

#

this spec is nice because it doesn't have a memory model section

golden schooner
#

hmm

long robin
#

I did a temporary hack to fix srgb

#

since my ex🦐les only support albedo texture, I just load all textures as srgb

golden schooner
#

you could invest another 2 minutes and make it proper

#

during material load time you pretty much know what texture is what... albedo/normal/ARM

#

and then do the thing you did there

long robin
#

fine, I'll do it properly 😄

golden schooner
#

then i can finally go dodo in peace 🙂

long robin
#

gn my prince

golden schooner
long robin
#

making a new member function of texture for creating a view of it with a different format 👀

[[nodiscard]] TextureView CreateFormatView(Format newFormat) const;
golden schooner
#

hmmm

#

name is a little bogus

#

CreateFormattedView or CreateView{For/With}Format

long robin
#

Formatted sounds weird, so I'll do WithFormat

long robin
#

you won't like these other ones

    [[nodiscard]] TextureView CreateMipView(uint32_t level) const;
    [[nodiscard]] TextureView CreateLayerView(uint32_t layer) const;
golden schooner
#

oh god

#

CreateViewForMipLevel

#

CreateViewForLayer

#

ideally CreateTextureViewFor..Ism..

long robin
#

hrmmm

#

I don't like For

shell inlet
#

CreateView(ViewCreateInfo info)

#

get vulkand

long robin
#

erm actually

explicit TextureView(const TextureViewCreateInfo& viewInfo, const Texture& texture, std::string_view name = "");
golden schooner
#

i like void's interjection more than CreateMipView/LayerView

shell inlet
#

you are already vulkan all along

golden schooner
#

CreateLayeredView/CreateMippedView

long robin
#

sometimes I question how certain emojis get put into unicode

golden schooner
#

jaker i understand you are american, struggling with your language is a natural thing

long robin
#

I've seen CreateMipView in other code and it was instantly obvious to me what it meant

#

it creates a view of a mip

#

a mip view

golden schooner
#

the others should be listenyoupieceofshit ed too

#

but ye

#

those are all meffeds of Texture, neh?

shell inlet
#

so you're making shortcut methods basically

golden schooner
#

oui

#

if you add For then it reads like a sentence

long robin
#

because the CreateInfo struct is quite verbose

shell inlet
#

good design

long robin
#

I would use Of instead of For if I wanted it to read like a sentence

golden schooner
#

CreateView(CreateViewForMipInfo info)

long robin
#

CreateViewOfMip

golden schooner
#

oof

#

hmm

long robin
#

"for" doesn't make sense here

#

in my indomitable opinion

shell inlet
#

alternatively you could make a class that would spit out structs with defaults based on enum

#

but if there are fields that are automatically filled in based on the object's state then that solution falls off

golden schooner
#

naming things are hard

#

and i will support any decision you take, naturally

#

but you will not hear the end of it 😄

long robin
#

naturally

golden schooner
#

found this guy when i typed :two:

long robin
#

I can't tell if that fella is supposed to animate at a variable rate

#

probably just a classic gif rendering bug

golden schooner
#

methinks its on purpose

long robin
#

some of the gifs that loop at full speed get pretty messed up

golden schooner
#

first time i hear that

long robin
#

clep sometimes sends a : hype : gif that has broken looping

golden schooner
#

you can set a frametime between individual frames in jiffs

long robin
#

maybe it's because my monitor is 60hz and gifs can only do 50hz

golden schooner
#

i will keep an eye on it

long robin
#

oh gif can actually go up to 100hz

golden schooner
#

srgbisms

heavy cipher
#

i mean

#

why a single mip

#

why a single layer

long robin
#

single mip is useful for bloomisms

golden schooner
#

single layer is useful for debuggling arrays

long robin
#

mayhaps I can make that be the base layer/mip

heavy cipher
#

not trusting the user with two values is a bit silly

golden schooner
#

can you actually create a textureview for more than 1isms in gl?

long robin
#

ye

golden schooner
#

besides calling CreateViewXXX more than 1ce 🙂

heavy cipher
#

that doesn't make no sense

long robin
golden schooner
#

ah i thought it was the actual level or mip in glTV, my B

long robin
#

@heavy cipher these are just convenience functions, the constructor for TextureView lets you specify everything

heavy cipher
#

can you make a textureview from a textureview

long robin
#

yeah

heavy cipher
#

good

#

tbh i don't think these functions add a lot

long robin
#

like many small utility functions, the user could just define em themselves

#

but I find them handy from time to time, so I'm putting them in so I don't have a bunch of redundant definitions for this stuff lying around

heavy cipher
#

I'd probably make the name more shouty then, CreateSingleMipView or smth

long robin
#

@golden schooner this "2-minute change" to properly load materials is turning out to be an entire overhaul

#

I also learned about std::ranges::move recently, which is pretty cool

heavy cipher
#

classic

golden schooner
long robin
#

oh yeah, now it runs and everything looks exactly the same as before

#

the factor has been ree'd

golden schooner
#

at least the code base reeds (read reads) better now 🙂

heavy cipher
#

what did u change?

long robin
#

previously, I just had a big array of textures and each material would hold an index (or indices) into that

#

now, each material holds its own texture view(s)

#

the problem was that the usage of a texture wasn't known until a material referenced it

#

but now, materials hold their own sRGB view(s) of color textures

heavy cipher
#

neat

long robin
#

basically it is the classic separation of storage vs usage

heavy cipher
#

classico

#

do you still allow using naked textures?

long robin
#

yeah

#

at one point I used only texture views, but it was painful

#

I "had" to store both textures and their views, or create views on demand

#

both of which feel like writing extra code for no gain

heavy cipher
#

the great srgb disaster of 2023

long robin
#

frrrrrrrrrrr

shell inlet
#

it never ended

long robin
#

srgb and its consequences

digital lion
#

fwog is going places

shell inlet
#

#ad

shell inlet
#

@long robin what if we tonemap in okhsl space

#

wanna try it

#

?

#

if I get you the code

#

it's a perceptually uniform hsl

#

so no hue shifts when lerp two colors

long robin
#

Never heard of okhsl, but it sounds similar to things I have heard of

shell inlet
#

ok honestly tinkered with it and couldn't make it noticeably better than luma reinhard 🫤

#

unhype

#

there might be some slight advantage that it doesn't shift hue though

#

but I'd need a real HDR image to test everything which shadertoy doesn't have

#

so all in all more effort than I can afford to put currently

daring surge
#

you should add a bunch of Create____ functions, but randomize the name of them between Create_, Make_, Generate_, Build_, Construct_

long robin
shell inlet
long robin
#

you can do fake (or real) lighting math in the shader

shell inlet
#

I can also test on the color gradient by mapping hue and lightness to uv

long robin
#

lol

Loading took 22.153 ms
Node: 对象409
Node: 对象393
Node: 对象392
Node: 对象391
Node: 对象388
Node: 对象389
Node: 对象390
Node: 对象387
Node: 对象027
Node: Plane062
Node: 图形001
Node: Rectangle001
Node: Plane031
Node: 对象353
Node: 组019
Node: 组020
Node: 组018
Node: 组015
Node: 对象311
Node: 组013
Node: 对象352
Loaded glTF: H:/Repositories/glTF-Sample-Models/downloaded schtuff/shadow_test.glb
#

I wonder if this is a bug in tinygltf or if these strings are not ascii encoded

#

I guess it's not actually a wstring KEKW

#

I have decided that I don't care about this

heavy cipher
#

string but for webgpu

oak garden
#

Some of them pake sense or partial sense

long robin
#

glTF JSON data SHOULD be written with UTF-8 encoding without BOM. This requirement is not applied when a glTF implementation does not control string encoding. glTF implementations SHOULD adhere to RFC 8259, Section 8.1. with regards to treating BOM presence.

#

perhaps I was reading them correctly all along

oak garden
long robin
#

ez pz

#

modern technology feels like cheating

oak garden
#

!! attention citizen 注意公民 this mesh 这个网格 has been confiscated by the CCP 被中共没收 !! Do not render this incorrectly 不要错误地渲染它 Or 1000 social credits will be deducted from your account 否则将从您的帐户中扣除 1000 社会信用

long robin
#

you can actually tell which parts of the mesh are an aftermarket addition

golden schooner
#

CCP is eve online, what kind of model do you load there jaker?

long robin
#

It's the shadow test scene that someone gave me in #general

#

I posted a pic or two of it in here some days ago

#

It's the little gray market stall thingy

golden schooner
#

ah

#

i started to yeet wonky models from my local asset store

#

ther were a bit of chinese characterisms involved too

#

kaput materials

#

or not even what was shown in the preview

final cove
#

are you loading an MMD model or something?

#

oh nvm you said what you're loading

rugged notch
#

rendering with chinese characteristics

long robin
long robin
#

I hate debugging ray marchers fr

#

I had a bug where I was passing in the opposite of the direction to the light and it sometimes looked correct, but now I have this (inverted shadow)