Unity 3D中如何修改音频波形绘制线条的厚度?
Unity RawImage绘制音频波形增加线条厚度的解决办法
原代码的逻辑很直接:遍历每个音频采样点,将采样值(范围-1到1)映射为RawImage上的Y坐标,再按采样点数量均分RawImage宽度得到X坐标,每个采样点只绘制一个像素,所以线条是1像素粗。
要增加线条厚度,核心思路是每个采样点对应的X位置,在Y轴方向绘制一片连续的像素,而不是单个像素。具体实现如下:
- 先定义线条厚度变量,按需调整:
int waveformThickness = 3; // 线条厚度,可自行修改数值
- 修改绘制循环,针对每个采样点的中心Y位置,上下扩展绘制像素(同时处理边界,避免超出RawImage的像素范围):
// 绘制波形 for (int i = 0; i < size; i++) { // 计算当前采样点对应的X坐标 int xPos = (int)(width * i / size); // 将音频采样值(-1~1)归一化到0~1,再转换为RawImage的Y中心坐标 float normalizedSample = (samples[i] + 1f) / 2f; int yCenter = (int)(height * normalizedSample); // 计算垂直方向的绘制范围,防止超出图像边界 int startY = Mathf.Max(0, yCenter - waveformThickness / 2); int endY = Mathf.Min(height - 1, yCenter + waveformThickness / 2); // 遍历Y范围,绘制每个像素 for (int y = startY; y <= endY; y++) { rawimage.SetPixel(xPos, y, waveformColor); } } // 将像素数据上传到GPU rawimage.Apply();
如果想要更顺滑的波形,还可以优化:当多个采样点映射到同一个X坐标时,记录这些采样点的最大和最小Y值,填充两者之间的所有像素,再叠加厚度扩展,这样波形的垂直表现会更连贯。示例代码如下:
// 先按X坐标分组,记录每个X的最大和最小Y值 Dictionary<int, (int minY, int maxY)> xYRange = new Dictionary<int, (int, int)>(); for (int i = 0; i < size; i++) { int xPos = (int)(width * i / size); float normalizedSample = (samples[i] + 1f) / 2f; int y = (int)(height * normalizedSample); if (!xYRange.ContainsKey(xPos)) { xYRange[xPos] = (y, y); } else { var current = xYRange[xPos]; xYRange[xPos] = (Mathf.Min(current.minY, y), Mathf.Max(current.maxY, y)); } } // 加上线条厚度的扩展,绘制每个X对应的Y范围 foreach (var kvp in xYRange) { int x = kvp.Key; int originalMinY = kvp.Value.minY; int originalMaxY = kvp.Value.maxY; // 扩展厚度 int startY = Mathf.Max(0, originalMinY - waveformThickness / 2); int endY = Mathf.Min(height - 1, originalMaxY + waveformThickness / 2); for (int y = startY; y <= endY; y++) { rawimage.SetPixel(x, y, waveformColor); } } rawimage.Apply();
内容的提问来源于stack exchange,提问作者Michael D. Knight
相关产品推荐
相关产品推荐

