Jump to content

UUSL чтение\запись в нестандартные текстуры: RGBA16F и. т.д.


photo

Recommended Posts

Добрый день.

Очень нужны методы  для чтения записи.

#include <core/shaders/common/compute.h>

INIT_W_TEXTURE_INT(0, RW_BLOB_TEST, r8ui, uint)

MAIN_COMPUTE_BEGIN(4,4,1)

	int i = GROUP_ID.x * 1 + GROUP_THREAD_ID.x;
	int j = GROUP_ID.y * 1 + GROUP_THREAD_ID.y;
	
	TEXTURE_W_STORE(RW_BLOB_TEST,int2(i,j),10);


END_COMPUTE

 

#pragma once
#include <UnigineStreams.h>
#include <UnigineMaterials.h>
#include <UnigineImage.h>
using namespace Unigine;

class MyBlob
{
public:
	MyBlob();
	MyBlob(const MyBlob&);
	~MyBlob();
	
private:
	BlobPtr ptrBlob;
	unsigned long int size = 0;

	MaterialPtr ptrTestMaterial;
	TexturePtr ptrTestDataTexture;
	RenderTargetPtr ptrRenderTarget;

	void init();
	void saveData();
	void clear();

public:
	void runTest();
};

 

void MyBlob::init()
{
	size = sizeof(unsigned char) * 16;
	ptrBlob = Blob::create(size);
	Log::message("Blob size = %d\n", ptrBlob->getSize());

	unsigned char data = 2;
	for (size_t i = 0; i < 16; i++)
	{
		ptrBlob->set(i, (unsigned char)data);
		data += 2;
	}

	Log::message("Blob data in = ");
	for (size_t i = 0; i < 16; i++)
	{
		Log::message("%d\t", ptrBlob->get(i));
	}

	ptrTestMaterial = Materials::findMaterial("test_material");

	ptrTestDataTexture = Texture::create();
	ptrTestDataTexture->create2D(4, 4, Texture::FORMAT_R8, Texture::USAGE_READWRITE | Texture::USAGE_RENDER);
	ptrTestDataTexture->setBlob(ptrBlob);

	ptrRenderTarget = RenderTarget::create();
}

void MyBlob::saveData()
{
	ImagePtr tempImage = Image::create();
	tempImage->create2D(4, 4, Image::FORMAT_R8);
	ptrTestDataTexture->getImage(tempImage);
	tempImage->save("images_temp/sourceR8.dds");
	tempImage->clear();
}

void MyBlob::clear()
{
	ptrBlob->clear();

	ptrTestMaterial.clear();

	ptrTestDataTexture->destroy();
	ptrTestDataTexture->clear();

	ptrRenderTarget.clear();
}

void MyBlob::runTest()
{
	init();

	ptrRenderTarget->bindUnorderedAccessTexture(0, ptrTestDataTexture, 0);
	ptrRenderTarget->enableCompute();
	ptrTestMaterial->renderCompute(Render::PASS_POST, 1, 1);
	ptrRenderTarget->disable();
	ptrRenderTarget->unbindUnorderedAccessTextures();

	saveData();
	
	clear();
}

Вариант к сожалению не взлетел. Гонять 3 пустых канала вместо R8, в нескольких потоках очень дорого. про 4 R32F против одного RGBA16F вообще без комментариев.

Очень надеюсь на реализацию _RW_LOAD_\_RW_STORE_ методов.

С Уважением Константин.

Link to comment

Добрый день.

В Directx 11 для read/write гарантированно доступны только r32f, r32u и r32s. (https://docs.microsoft.com/en-us/windows/win32/direct3d12/typed-unordered-access-view-loads ). RGBA8 у нас реализован уже через распаковку/запаковку в uint32.

Обычно проблема решается тем, что используется две текстуры: одна для чтения, которая биндится как обычная текстура; другая для записи, которая биндится как write-only и может быть любого формата. После выполнения прохода они меняются местами

Link to comment

Лично моё мнение, стоит выровняться с версией 11.3. Меньше костылей, больше довольных пользователей.

Link to comment

К сожалению, много людей еще сидят на Windows 7 с DirectX 11.0/1 и мы не можем просто так повысить минспек до Windows 10.

Безусловоно, больше форматов пойдут всем на пользу, и они будут добавлены позже.

Спасибо.

How to submit a good bug report
---
FTP server for test scenes and user uploads:

Link to comment

В 11.3 поддержка других форматов также опциональна, согласно документации

UPD

Хотя нет, неправильно прочитал. Список "The following formats are supported as a set on D3D12 or D3D11.3 hardware, so if any one is supported, all are supported" похоже обязательный

Link to comment

Понимаю вашу дилемму. Игровой мир очень требователен. А вычисления на гпу позволяют обойти многие старые узкие места. Буду ждать расширения функционала.

  • Thanks 1
Link to comment

Есть ли возможность поменять версию шейдера с 4.0 на 5.1. Настройки проекта ни как не влияют, похоже версия гдето захардкожена. Изза специфики вычислений не могу перевести на другие типы текстур, не остаётся ни каких других вариантов как временно пересесть на HLSL.

Link to comment
×
×
  • Create New...