Vasara Posted January 28, 2021 Share Posted January 28, 2021 Добрый день. Очень нужны методы для чтения записи. #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
andrey-kozlov Posted January 29, 2021 Share Posted January 29, 2021 Добрый день. В 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
Vasara Posted January 29, 2021 Author Share Posted January 29, 2021 Лично моё мнение, стоит выровняться с версией 11.3. Меньше костылей, больше довольных пользователей. Link to comment
silent Posted January 29, 2021 Share Posted January 29, 2021 К сожалению, много людей еще сидят на Windows 7 с DirectX 11.0/1 и мы не можем просто так повысить минспек до Windows 10. Безусловоно, больше форматов пойдут всем на пользу, и они будут добавлены позже. Спасибо. How to submit a good bug report --- FTP server for test scenes and user uploads: ftp://files.unigine.com user: upload password: 6xYkd6vLYWjpW6SN Link to comment
andrey-kozlov Posted January 29, 2021 Share Posted January 29, 2021 В 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
Vasara Posted January 29, 2021 Author Share Posted January 29, 2021 Понимаю вашу дилемму. Игровой мир очень требователен. А вычисления на гпу позволяют обойти многие старые узкие места. Буду ждать расширения функционала. 1 Link to comment
Vasara Posted January 29, 2021 Author Share Posted January 29, 2021 Есть ли возможность поменять версию шейдера с 4.0 на 5.1. Настройки проекта ни как не влияют, похоже версия гдето захардкожена. Изза специфики вычислений не могу перевести на другие типы текстур, не остаётся ни каких других вариантов как временно пересесть на HLSL. Link to comment
silent Posted January 30, 2021 Share Posted January 30, 2021 Vasara Движок использует Shader Model 5.0 (не 4.0). 5.1 добавить нельзя, т.к. эта модель появилась в DirectX 12. How to submit a good bug report --- FTP server for test scenes and user uploads: ftp://files.unigine.com user: upload password: 6xYkd6vLYWjpW6SN Link to comment
Recommended Posts