[SOLVED] Ошибка "X3206: implicit truncation of vector type" в вычислительном шейдере.


photo

Recommended Posts

Добрый день.

Вычислительный шейдер не компилируется из за ошибки:

(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 by Vasara
Link to post

Здраствуйте.

INIT_RW_TEXTURE_R32F(0,RW_DYNAMIC_TEXTURE)

Добавит текстуру с типом float.
Следовательно в коде она так же будет возвращать float, а не float4.

float value = TEXTURE_RW_LOAD_R32F(RW_DYNAMIC_TEXTURE,int2(i,j));


С уважением, Кирилл.

  • Thanks 1
Link to post
  • Vasara changed the title to Ошибка "X3206: implicit truncation of vector type" в вычислительном шейдере.

Т.е. насколько понимаю, будет будет создана текстура не 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 post
// 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.

Не совсем понял куда и откуда, что у вас передается, можно ваш код?

Link to post

Передаю текстуру 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 by Vasara
Link to post

Доброе утро.

К сожалению по непонятной причине 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);

 

  • Thanks 1
Link to post
  • Vasara changed the title to [SOLVED] Ошибка "X3206: implicit truncation of vector type" в вычислительном шейдере.