How does the "Import Buffer as Texture 2D" node work?

The title explains it. This is the node:
image

I can’t figure out how it works. I am using it to try and save and load a render target, but I just don’t know how this node works. As in: how do I structure the input buffer array?

Having used other rendering APIs in the past, such as SFML, I assumed it was RGBA RGBA RGBA… for as many pixels as there are, but apparently that just gives out an empty image. (invalid object reference)

i think the buffer is a byte array for what is " file like" data.
in other words similar to a binary jpeg.

check the comment on " compress image" and " decompress image" https://github.com/EpicGames/UnrealEngine/blob/a3cb3d8fdec1fc32f071ae7d22250f33f80b21c4/Engine/Source/Runtime/Engine/Public/ImageUtils.h#L130

i dont see an export equivalent for the import buffer as texture 2d
i think you might get more luck using “ExportTexture2D” and " ImportFileAsTexture2D" (both manipulates a file directly and uses a filename).

The problem with using a file is that I would like to have all save data in one single file. I will have a look at the source code, otherwise, I have a slower, alternative method… But it’s quite slow…

Solved. What I am trying to do is save a render target to a save file and load it back in. The render target uses 8 bit RGB (24 bits per pixel) and will always be square. To save, I just use the “Read Render Target” node: it’s slow but it works. I save the output using a SaveGame object.

To load it back in, I created a C++ function which looks as follows:
.h:

[...]
	UFUNCTION(BlueprintCallable, Category = "Rendering")
	static TArray<uint8> getBufferFromColorArray(TArray<FColor> arr);
[...]

.cpp:

#define add(num) working.Add(num)
#define addInt(num, size) working.Append(intToBytes(num, size))
TArray<uint8> UCPP_BPFuncLib::getBufferFromColorArray(TArray<FColor> arr)
{
	int size = sqrt(arr.Num());

	TArray<uint8> working;
	//header
	add(66);
	add(77);
	//size
	add(0);
	add(0);
	add(0);
	add(0);
	//app info
	add(0);
	add(0);
	add(0);
	add(0);
	//start address
	add(54);
	add(0);
	add(0);
	add(0);

	//BITMAPINFOHEADER
	//size of header
	add(40);
	add(0);
	add(0);
	add(0);
	//image size
	addInt(size, 4);
	addInt(size, 4);
	//color planes
	addInt(1, 2);
	//color depth
	addInt(24, 2);
	//compression
	addInt(0, 4);
	//dummy int
	addInt(0, 4);
	//resolution
	addInt(0, 4);
	addInt(0, 4);
	//colors in color pallette
	addInt(0, 4);
	//important colors
	addInt(0, 4);
	//image buffer
	size = arr.Num();
	for (int i = 0; i < size; i++) {
		add(arr[i].B);
		add(arr[i].G);
		add(arr[i].R);
	}
	//set real file size
	size = working.Num();
	auto tmp = intToBytes(size, size);
	for (int i = 0; i < 4; i++) {
		working[i + 2] = tmp[i];
	}
	return working;
}

This pretty much just turns the FColor buffer saved into a uint8 (byte) buffer array which can be used in the “Import Buffer as Texture 2D” node.

I then use this image as a parameter of a UI material (“Tex”) as such:


(The reason why the V component in the texture coordinate is flipped is due to how bitmaps are saved. Otherwise the image gets flipped.)
I then copy the material to the render target and it’s done!

4 Likes

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.