Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 像素着色器中的精灵调色板交换_C++_Directx 11_Fragment Shader - Fatal编程技术网

C++ 像素着色器中的精灵调色板交换

C++ 像素着色器中的精灵调色板交换,c++,directx-11,fragment-shader,C++,Directx 11,Fragment Shader,我正在制作一款基于精灵的格斗游戏,开发已经到了一个关键点,我想在运行时实现图像的颜色交换(这样用户可以通过界面指定确切的颜色应该更改为什么,并且可以在瞬间完成,而不会被加载屏幕打断)。 我想在像素着色器中很容易实现。我试过了,通过设置值来改变另一种颜色,效果非常好。 对于下一步,我想让它从文本文件中读取数据(包含要更改的颜色的颜色代码,然后是要更改的颜色)。它有多个条目,存储在如下数组中: XMFLOAT3 palette[10][2]; 下面是着色器中相应的常量条目: float4 xPal

我正在制作一款基于精灵的格斗游戏,开发已经到了一个关键点,我想在运行时实现图像的颜色交换(这样用户可以通过界面指定确切的颜色应该更改为什么,并且可以在瞬间完成,而不会被加载屏幕打断)。 我想在像素着色器中很容易实现。我试过了,通过设置值来改变另一种颜色,效果非常好。 对于下一步,我想让它从文本文件中读取数据(包含要更改的颜色的颜色代码,然后是要更改的颜色)。它有多个条目,存储在如下数组中:

XMFLOAT3 palette[10][2];
下面是着色器中相应的常量条目:

float4 xPalette[10][2];
这意味着,它存储10种要更改的颜色和10种要更改的颜色。我通过一个恒定的缓冲区将其传递给像素着色器,但它不能按计划工作,因为只有阵列的最后一个条目被识别,其他所有条目都是零。我想这是因为在向GPU发送数据之前需要16位对齐?还有什么其他方法可以将这样的数据发送到像素着色器?
谢谢你通读这篇文章

您可以将交换作为纹理本身发送,最上面一行的纹理可能是您要替换的纹理,而[x][y+1]是您要将其更改为的颜色。(由于纹理坐标范围从0到1,您可能必须以整数形式传递要替换的颜色数,然后您可以使用(1/replaceCount*i)进行索引。我认为GLSL允许您使用sampler2D传递纹理。我想这与HLSL类似(但我写HLSL已经有几个月了:)


然后,您可以在着色器期间对顶行中的每个纹理进行采样/比较。

谢谢您的回复。我已经考虑过使用纹理贴图,开发人员可能很容易创建这样的纹理,但我不知道如何在运行时创建纹理(因为我也在尝试为颜色制作一个编辑器),所以我尝试了一种更灵活的方法(对我来说就是)。我猜这完全可行,所以是时候上网了。再次感谢你的回复!谢谢你,Howewer,我已经弄明白了,这又是16位对齐的问题(我没有注意到arrgh,发生了很多次)。我想,通过去极化,并将XMFLOAT3数组发送到像素着色器,将发送4个元素的浮点,最后一个元素归零(就像传递一个元素时一样)。Hovewer,因为我发送了它们的数组,这将搞乱整个,因为最后一个元素(我认为是零)被下一个条目中的第一个元素所取代,并破坏了整个结构。我通过打印屏幕和采样颜色注意到了这一点。