将 AudioClip 数据映射到 GetRawTextureData 中的数组像素?
Map AudioClip data to pixels of Array from GetRawTextureData?
GetRawTextureData()
returns 纹理中所有像素的线性(一维)数组。
AudioClips 在一维数组中包含交错的(左和右)数据,这样索引代表 x(或时间),每个值是 x/time 处左右信号的音量。偶数 = 左,奇数 = 右。
有没有一种简单的方法可以将其映射到从 GetRawTextureData()
返回的 NativeArray
我已经尝试过,只专注于显示左侧信号,但产生了奇怪的垂直结果:
void FillTextureOne (Texture2D wav_tex, float[] firstWave ) {
var texdata = wav_tex.GetRawTextureData<Color32>( );
for ( int i = 0; i < firstWave.Length ; i+=2 )
{
var positionnew = i/2 * 256 + ( firstWave[i] + 1 ) * 128 ;
texdata[( int )positionnew ] = black;
}
wav_tex.Apply( );
}
纹理大小为 256 x 256。 AudioClip 数据数组的长度为 512,其中存储的值范围为 -1 到 1,并且在加一后乘以 128,但尝试将它们的垂直范围介于 0 和 256 之间但失败了。
如果我理解您感到困惑的解决方案,这里有一个简短的解释,说明它为什么有效。要将 2D 数组正确映射到 1D 数组,您需要获取 2D 数组的 width
和 height
,然后使用它们的乘积来为您提供正确大小的 1D 数组。下一步是确保您的二维数组位于 row order or column order
中,这将决定您访问信息的方式。一旦弄清楚,有两个等式可以让您使用二维数组的宽度和高度而不是单一索引来访问二维数组格式的一维数组。为简单起见,我将再次使用您的索引器 x
和 y
以及 width
和 height
.
对于行顺序数组
yourOneDimensionalArray[width * x + y]
对于列顺序数组
yourOneDimensionalArray[height * y + x]
如果将一维数组分成相等的部分,则可以将其视为潜在的二维数组。根据矩阵的顺序,它会根据中断的大小或可以拆分的部分来定义行或列的长度。
更直观的解释:
1 2 3 4 5 6 7 8 9 is a 1D array of size 1x9
1 2 3
4 5 6 is a 2D array row order of size 3x3
7 8 9
1 4 7
2 5 8 is a 2D array column order of size 3x3
3 6 9
If we want to access the number 6 in these arrays, we would do as follows:
1DArray[5]
2DRowArray[1][2]
2DColumnArray[2][1]
From the previous equations, we can now take the indexes we have to see how they relate.
2DRowArray is row 1, column 2 or x = 1, y = 2 and our width is 3, so we take 1 * 3 + 2, which is 3 + 2 = 5 or our 1D index
Similarly, the 2DColumnArray is row 2, column 1 or x = 2, y = 1 and our height is 3, so we take 1 * 3 + 2, which is 3 + 2 = 5 or our 1D index.
我可以将这个可视化解决方案扩展到 256x256
网格,但我认为 3x3
也应该能很好地理解这个想法。如果您还有问题,请告诉我。
在实时应用程序中,同步命令(传输像素)会不必要地降低 CPU 和 GPU 之间的并行度。不幸的是,您没有提供有关您的目标设备和 os 的任何信息。如果您想获得最佳性能,您应该使用 compute shaders.
GetRawTextureData()
returns 纹理中所有像素的线性(一维)数组。
AudioClips 在一维数组中包含交错的(左和右)数据,这样索引代表 x(或时间),每个值是 x/time 处左右信号的音量。偶数 = 左,奇数 = 右。
有没有一种简单的方法可以将其映射到从 GetRawTextureData()
我已经尝试过,只专注于显示左侧信号,但产生了奇怪的垂直结果:
void FillTextureOne (Texture2D wav_tex, float[] firstWave ) {
var texdata = wav_tex.GetRawTextureData<Color32>( );
for ( int i = 0; i < firstWave.Length ; i+=2 )
{
var positionnew = i/2 * 256 + ( firstWave[i] + 1 ) * 128 ;
texdata[( int )positionnew ] = black;
}
wav_tex.Apply( );
}
纹理大小为 256 x 256。 AudioClip 数据数组的长度为 512,其中存储的值范围为 -1 到 1,并且在加一后乘以 128,但尝试将它们的垂直范围介于 0 和 256 之间但失败了。
如果我理解您感到困惑的解决方案,这里有一个简短的解释,说明它为什么有效。要将 2D 数组正确映射到 1D 数组,您需要获取 2D 数组的 width
和 height
,然后使用它们的乘积来为您提供正确大小的 1D 数组。下一步是确保您的二维数组位于 row order or column order
中,这将决定您访问信息的方式。一旦弄清楚,有两个等式可以让您使用二维数组的宽度和高度而不是单一索引来访问二维数组格式的一维数组。为简单起见,我将再次使用您的索引器 x
和 y
以及 width
和 height
.
对于行顺序数组
yourOneDimensionalArray[width * x + y]
对于列顺序数组
yourOneDimensionalArray[height * y + x]
如果将一维数组分成相等的部分,则可以将其视为潜在的二维数组。根据矩阵的顺序,它会根据中断的大小或可以拆分的部分来定义行或列的长度。
更直观的解释:
1 2 3 4 5 6 7 8 9 is a 1D array of size 1x9
1 2 3
4 5 6 is a 2D array row order of size 3x3
7 8 9
1 4 7
2 5 8 is a 2D array column order of size 3x3
3 6 9
If we want to access the number 6 in these arrays, we would do as follows:
1DArray[5]
2DRowArray[1][2]
2DColumnArray[2][1]
From the previous equations, we can now take the indexes we have to see how they relate.
2DRowArray is row 1, column 2 or x = 1, y = 2 and our width is 3, so we take 1 * 3 + 2, which is 3 + 2 = 5 or our 1D index
Similarly, the 2DColumnArray is row 2, column 1 or x = 2, y = 1 and our height is 3, so we take 1 * 3 + 2, which is 3 + 2 = 5 or our 1D index.
我可以将这个可视化解决方案扩展到 256x256
网格,但我认为 3x3
也应该能很好地理解这个想法。如果您还有问题,请告诉我。
在实时应用程序中,同步命令(传输像素)会不必要地降低 CPU 和 GPU 之间的并行度。不幸的是,您没有提供有关您的目标设备和 os 的任何信息。如果您想获得最佳性能,您应该使用 compute shaders.