Looooong / UnityAsyncImageLoader

Asynchronous Image Loader for Unity
MIT License
201 stars 26 forks source link

OpenEXR loads as full white image instead of its content. Is it supported ATM? #10

Open peeweek opened 1 year ago

peeweek commented 1 year ago

I am a bit confused about how to load OpenEXR Images or if it is supported. Currently I used either LoadImage or CreateFromImage either with automatic loader settings or specific, but the returned data is all white.

Texture size seem correct.

Also, I'm wondering about reading these values as RGBAFloat or RGBAHalf. Is it supported?

Looooong commented 1 year ago

I have no experience with OpenEXR image. I suppose that since it is HDR image, its pixel value doesn't fit in the range [0, 1] which is used by RGBA32 texture, is that correct?

If that's the case, I can add support for RGBAFloat texture as well.

Can you post a sample EXR image and a JPEG/PNG counterpart of what it should look like?

peeweek commented 1 year ago

Yes absolutely. Most of the time, EXR contains 16 or 32 bit data (often imported as RGBAHalf or RGBAFloat), In unity it can also be imported as RGBA32 but everything above 1.0 is clamped. Also EXR tend to contain HDR linear data.

From what I experienced using the API I assumed that the data read would fallback to pure white float4(1.0,1.0,1.0,1.0) so it doesn´t break the import. I have put my eyes in the code but I couldn't really understand how FreeImage works :/

If you can have a look to make it import properly it would really be awesome! <3

Regarding the sample data, I publshed some years ago a bunch of flipbooks containing data both in TGA and EXR that you can use as example : https://blog.unity.com/technology/free-vfx-image-sequences-flipbooks

Also, there are many full linear HDR EXR available at https://polyhaven.com/hdris under CC0 license

Looooong commented 1 year ago

@peeweek I added support for EXR image in the latest release. Let me know if you have any issue with loading EXR image.

peeweek commented 1 year ago

Wow thanks ! It did work with my textures :) .

I had also a bunch of textures from https://github.com/AcademySoftwareFoundation/openexr-images but some of them did not load correctly. I am giving you the callstack but it seems it breaks from a burst job.

I am not sure whether these images are standard or contain quite Advanced EXR features that are borderline to be supported. I will do some exception handling for these images.

System.InvalidOperationException: Illegal instruction executed
This Exception was thrown from a job compiled with Burst, which has limited exception support.
0x00007ffc571d27d3 (e50d06487d315d3d1d42e3eef89a917) [unknown:0] Unity.Jobs.IJobParallelForExtensions.ParallelForJobStruct`1<AsyncImageLoader.TransferRGBFloatImageToRGBAFloatTextureJob>.Execute 
0x00007ffc571d2621 (e50d06487d315d3d1d42e3eef89a917) a4b79d6fc4e40dcd47f38264cdb951c4
0x00007ff60fd388e0 (Unity) ExecuteJob
0x00007ff60fd38c55 (Unity) ExecuteJobCopyData
0x00007ff60fd3995f (Unity) ForwardJobForEachToManaged
0x00007ff60fd34c0c (Unity) JobQueue::Exec
0x00007ff60fd34f3e (Unity) JobQueue::ExecuteJobFromHighPriorityStack
0x00007ff60fd35614 (Unity) JobQueue::ProcessJobs
0x00007ff60fd3782f (Unity) JobQueue::WorkLoop
0x00007ff60ff35ea7 (Unity) Thread::RunThreadWrapper
0x00007ffc88907614 (KERNEL32) BaseThreadInitThunk
0x00007ffc893626a1 (ntdll) RtlUserThreadStart
Looooong commented 1 year ago

Can you try turning off Burst and see if it still works? Also, send me the image that results in this error as well.

peeweek commented 1 year ago

I just tried disabling burst compilation with the same results. However, with compilation enabled and safety checks disabled, the issue is not present anymore.

image

Otherwise, the output image has correct size, color format but all zeroes as data.

image

Looooong commented 1 year ago

Please post me the EXR image, so I can test it out myself.

peeweek commented 1 year ago

SquaresSwirls.zip

Sure, here it is. If you want EXR test images you can grab more from here : https://github.com/AcademySoftwareFoundation/openexr-images/tree/master/TestImages (this image originates from this repo)