Vasara Posted January 10, 2021 Share Posted January 10, 2021 (edited) Добрый день. Вычислительный шейдер не компилируется из за ошибки: (3060,2-51): warning X3206: implicit truncation of vector type hlsl 3060: s_rw_texture_RW_DYNAMIC_TEXTURE[int2(i,j)] = value; Шейдер совершенно пустой, никакого приведения типов для value в принципе не происходит. #include <core/shaders/common/compute.h> INIT_RW_TEXTURE_R32F(0,RW_DYNAMIC_TEXTURE) MAIN_COMPUTE_BEGIN(16,16,1) uint i = GROUP_ID.x * 16 + GROUP_THREAD_ID.x; uint j = GROUP_ID.y * 16 + GROUP_THREAD_ID.y; float4 value = TEXTURE_RW_LOAD_R32F(RW_DYNAMIC_TEXTURE,int2(i,j)); TEXTURE_RW_STORE_R32F(RW_DYNAMIC_TEXTURE,int2(i,j),value); END_COMPUTE С Уважением Константин. Edited January 12, 2021 by Vasara Link to comment
sweetluna Posted January 11, 2021 Share Posted January 11, 2021 Здраствуйте. INIT_RW_TEXTURE_R32F(0,RW_DYNAMIC_TEXTURE) Добавит текстуру с типом float. Следовательно в коде она так же будет возвращать float, а не float4. float value = TEXTURE_RW_LOAD_R32F(RW_DYNAMIC_TEXTURE,int2(i,j)); С уважением, Кирилл. 1 May RenderDoc/Nsight Graphics/Intel GPA bless you Link to comment
Vasara Posted January 11, 2021 Author Share Posted January 11, 2021 Т.е. насколько понимаю, будет будет создана текстура не float4(r, 0.0, 0.0, 0.0), а float(r)? А метод getImage() развернёт её обратно в (r, 0.0, 0.0, 0.0) изображение? С float(r) я пробовал взаимодействовать, не удалось никак повлиять на переменную. Например если я передаю 0.5f значения и суммирую их затем с 0.4f, ничего не меняется, в выходном изображении всё те же 0.5f. Link to comment
sweetluna Posted January 11, 2021 Share Posted January 11, 2021 // core/shaders/common/directx.h #define DECLARE_INIT_RW_TEXTURE(TYPE, FORMAT, NUM, NAME) \ TYPE<FORMAT> s_rw_texture_ ## NAME : register(u ## NUM); #define TEXTURE_ ## NAME ## _SLOT NUM \ #define INIT_RW_TEXTURE_R32F(NUM, NAME) DECLARE_INIT_RW_TEXTURE(RWTexture2D, float, NUM, NAME) В данном случае эта строчка INIT_RW_TEXTURE_R32F(0,RW_DYNAMIC_TEXTURE) раскроется в RWTexture2D<float> s_rw_texture_RW_DYNAMIC_TEXTURE : register(u0); #define TEXTURE_RW_DYNAMIC_TEXTURE_SLOT 0 float в треугольных скобках у RWTexture2D говорит о том, что данная текстура будет только с одним каналом. Следовательно везде где используется эта текстура, будет использован только красный канал (для Store и Load операций). Quote А метод getImage() развернёт её обратно в (r, 0.0, 0.0, 0.0) изображение? Функция get2D вернет пиксель (r, 0.0, 0.0, 0.0), да. Сама картинка будет содержать только один канал, если она была создана с типом R32F Quote Например если я передаю 0.5f значения и суммирую их затем с 0.4f, ничего не меняется, в выходном изображении всё те же 0.5f. Не совсем понял куда и откуда, что у вас передается, можно ваш код? May RenderDoc/Nsight Graphics/Intel GPA bless you Link to comment
Vasara Posted January 11, 2021 Author Share Posted January 11, 2021 (edited) Передаю текстуру 256x256 R32F, где все значения в R канале 0.5f. ptrHeightTexture = Texture::create(); ptrHeightTexture->load("landscape_grafic_assets/height_map_assets/temp/temp_data_image.dds", Texture::USAGE_READWRITE | Texture::USAGE_RENDER); ptrRenderTarget->bindUnorderedAccessTexture(0, ptrHeightTexture, 0); ptrRenderTarget->enableCompute(); ptrHeightMaterial->renderCompute(Render::PASS_POST, 16, 16); ptrRenderTarget->disable(); ptrRenderTarget->unbindUnorderedAccessTextures(); выполняю шейдер #include <core/shaders/common/compute.h> INIT_RW_TEXTURE_R32F(0,RW_DYNAMIC_TEXTURE) MAIN_COMPUTE_BEGIN(16,16,1) int i = GROUP_ID.x * 16 + GROUP_THREAD_ID.x; int j = GROUP_ID.y * 16 + GROUP_THREAD_ID.y; float value = TEXTURE_RW_LOAD_R32F(RW_DYNAMIC_TEXTURE,int2(i,j)); value = value + 0.4f; TEXTURE_RW_STORE_R32F(RW_DYNAMIC_TEXTURE,int2(i,j),value); END_COMPUTE возвращаю текстуру в изображение ptrHeightTexture->getImage(newImage); возвращается то же изображение, где все значения R канала 0.5f, а хочется получить 0.9f Даже ещё проще INIT_RW_TEXTURE_R32F(0,texture) MAIN_COMPUTE_BEGIN(16,16,1) int i = GROUP_ID.x * 16 + GROUP_THREAD_ID.x; int j = GROUP_ID.y * 16 + GROUP_THREAD_ID.y; TEXTURE_RW_STORE_R32F(texture,int2(i,j),1.0f); END_COMPUTE Edited January 11, 2021 by Vasara Link to comment
sweetluna Posted January 12, 2021 Share Posted January 12, 2021 Доброе утро. К сожалению по непонятной причине Texture::load не создавал UAV для текстуры, из-за чего результат никуда не записывался. Фикс будет. Пока можно обойти проблему таким путем: 1) Загрузить текстуру во временную 2) Создать 2D текстуру с такими же параметрами 3) Скопировать из временной в новую 4) Удалить временную текстуру ptrHeightTexture = Texture::create(); TexturePtr ptrHeightTextureTemp = Texture::create(); ptrHeightTextureTemp->load("_T/Texture1.dds", Texture::USAGE_RENDER); ptrHeightTexture->create2D(ptrHeightTextureTemp->getWidth(), ptrHeightTextureTemp->getHeight(), ptrHeightTextureTemp->getFormat(), Texture::USAGE_READWRITE | Texture::USAGE_RENDER); ptrHeightTexture->copy(ptrHeightTextureTemp); ptrHeightTextureTemp->destroy(); ptrHeightTextureTemp.clear(); В остальном мой код был таков: RenderTargetPtr ptrRenderTarget; ptrRenderTarget = Render::getTemporaryRenderTarget(); ptrRenderTarget->unbindColorTextures(); ptrRenderTarget->bindUnorderedAccessTexture(0, ptrHeightTexture, 0); ptrRenderTarget->enableCompute(); ptrHeightMaterial->renderCompute(Render::PASS_POST, 16, 16); ptrRenderTarget->disable(); ptrRenderTarget->unbindUnorderedAccessTextures(); ptrHeightTexture->getImage(image); Image::Pixel p = image->get2D(0, 0); Render::releaseTemporaryRenderTarget(ptrRenderTarget); Log::message("Result(0, 0): %f %f %f %f\n", p.f.r, p.f.g, p.f.b, p.f.a); 1 May RenderDoc/Nsight Graphics/Intel GPA bless you Link to comment
sweetluna Posted March 29, 2022 Share Posted March 29, 2022 В 2.15.1 эту проблему решили. Теперь при вызове Texture::load с флагом USAGE_READWRITE все должно работать 1 1 May RenderDoc/Nsight Graphics/Intel GPA bless you Link to comment
Recommended Posts