我正在尝试在Compute Shader中将Texture2D与RWTexture2D混合。我需要逐个通道完成
由于我看到Android不支持RWTexture2D<float4>
纹理,因此我使用了自己的RGBA32结构,该结构由4个浮点数组成。当我尝试在Unity Editor中对两个纹理的通道求和或插值时,一切正常。在Android上会发生错误(Kernel at Index(0) is invalid
)。
ARBG32 finalColor;
float finalColor.r = colorA.r + colorB.r
如果我将代码更改为finalColor.r = colorB.r
,则可以在Android上正常运行。
是否可以像这样添加或内插频道?还是我需要按位操作或将它们拆包以合并两个通道?
我以为我没有这么做,因为编辑器中的代码可以正常工作。
更新-------
其他信息:我想做的是在运行时使用“渲染纹理”创建遮罩,该遮罩在创建后将用于在地形上混合一些纹理。该蒙版的每个通道(RGBA)将被绘制一些形状(画笔),并用于在材质上混合不同的纹理。这将导致地形由地面,草地和积雪区域组成。
我正在Compute Shader中执行所有操作,因为我不需要将此附加到材质上,我还需要从一些缓冲区中获取信息。
我现在的主要目标是进行这项工作,以后会进行优化。 画笔是灰度的。 因此,除了AddIntensity()函数之外,该项目中的所有内容都在工作。该代码可在Unity编辑器上很好地工作,但不能在Android上工作。 如果我这样做:
mainTexColor.r = brushColor.r;
它可以在Android上运行,但我需要的是每次在该像素中使用画笔绘制时都增加强度。 实际上,我尝试在颜色通道中执行的每个操作都可以在Editor上正常运行,但不能在Android上正常运行。 我是图形编程的新手,但是我知道Unity编辑器可以在OpenGL上的Vulkan和Android上运行。
例如:我发现float4在Android上不起作用。
我希望这可以帮助您更好地理解我的问题。
// Textures
RWTexture2D<ARBG32> ResultMask;
Texture2D<ARBG32> Brush;
//Color class
class ARBG32
{
float r;
float g;
float b;
float a;
};
//Function to add a brush value to a channel
ARBG32 AddIntensity(ARBG32 mainTexColor, ARBG32 brushColor, int channel)
{
if(channel == 0)
mainTexColor.r += brushColor.r;
else if (channel == 1)
mainTexColor.g += brushColor.r;
else if (channel == 2)
mainTexColor.b += brushColor.r;
else
mainTexColor.a += brushColor.r;
return mainTexColor;
}