テクスチャにデータを書き込んだはずなのに反映されていない...といったケースでさしあたり心当たりがあるのは、Applyを実行し忘れているとかでしょうかね?
見たところ少なくとも後者のCaptureScreenshot
案のコードにはApply
がないように見えます。saveText.SetPixels(colors);
の後にsaveText.Apply();
を入れてみると変化はあるでしょうか。
前者の直接保存案がうまくいかなかった件については、こちらはもっと詳しくコードをご提示いただく必要がありそうです。ご参考になさった「【Unity】シェーダーを利用して音声波形を描く - setchi’s blog」によると、WaveformRenderer
のtexture
自体は音声データを赤色の強度で表した高さ1ピクセルのテクスチャのようですから、それを最終的な緑色の線の画像にするにはどこかで記事中のシェーダーを使ったレンダリングを行う必要があるかと思います。ご質問者さんがどのようになさっているかお示しいただければ手がかりになるかもしれません。
RawImageから画像データを作る例
生成された波形データテクスチャをRawImage
上にレンダリングして波形図にすることを前提とすると、そのRawImage
のマテリアルを使って波形データテクスチャを同様にオフスクリーンレンダリングする手があるんじゃないかと思いました。
ご参考までに、たとえば下記のようなスクリプトをプロジェクト内に入れておけばRawImage
からPNGデータを作れるんじゃないでしょうかね?
C#
1using UnityEngine;
2using UnityEngine.UI;
3
4public static class RawImageExtensions
5{
6 /// <summary>
7 /// RawImageをキャプチャーし、PNGフォーマットにエンコードします。出力されるデータの幅、高さはRawImageのsizeDeltaを使用します。
8 /// </summary>
9 /// <param name="rawImage">キャプチャー対象のRawImage。</param>
10 /// <param name="ignoreAlpha">透明度を無視し、RGBのみのデータとして出力するか。</param>
11 /// <returns>エンコードされたPNGバイト配列。</returns>
12 public static byte[] EncodeToPNG(this RawImage rawImage, bool ignoreAlpha = false)
13 {
14 // 引数なしで実行した場合は、rawImageのsizeDeltaを出力テクスチャサイズとして使用する
15 return rawImage.EncodeToPNG(Vector2Int.FloorToInt(rawImage.rectTransform.sizeDelta), ignoreAlpha);
16 }
17
18 /// <summary>
19 /// RawImageをキャプチャーし、PNGフォーマットにエンコードします。
20 /// </summary>
21 /// <param name="rawImage">キャプチャー対象のRawImage。</param>
22 /// <param name="outputSize">出力されるPNGデータの幅、高さ。</param>
23 /// <param name="ignoreAlpha">透明度を無視し、RGBのみのデータとして出力するか。</param>
24 /// <returns>エンコードされたPNGバイト配列。</returns>
25 public static byte[] EncodeToPNG(this RawImage rawImage, Vector2Int outputSize, bool ignoreAlpha = false)
26 {
27 // 入力テクスチャを取得する
28 // rawImageにテクスチャがセットされていればそれを使い、なければマテリアルの
29 // メインテクスチャを使い、それもなければ白色テクスチャを使う
30 var sourceTexture = rawImage.mainTexture;
31
32 // マテリアルを取得する
33 var material = rawImage.material;
34
35 // 出力サイズは最低でも1ピクセル四方とする
36 outputSize = Vector2Int.Max(Vector2Int.one, outputSize);
37
38 // PNGデータ生成用のテクスチャを作成する
39 // ignoreAlphaがtrueの場合はフォーマットをRGB24とし、アルファを捨てるようにする
40 var resultTexture = new Texture2D(
41 outputSize.x,
42 outputSize.y,
43 ignoreAlpha ? TextureFormat.RGB24 : TextureFormat.RGBA32,
44 false);
45
46 // レンダリング用のテクスチャを生成する
47 var resultRenderTexture = RenderTexture.GetTemporary(outputSize.x, outputSize.y, 0);
48
49 // 後でアクティブテクスチャを原状復帰するため、現在のアクティブテクスチャを覚えておく
50 var activeTexture = RenderTexture.active;
51
52 // resultRenderTexture上にmaterialを使ってsourceTextureをレンダリングする
53 Graphics.Blit(sourceTexture, resultRenderTexture, material);
54
55 // レンダリング結果をresultTextureに読み取る
56 RenderTexture.active = resultRenderTexture;
57 resultTexture.ReadPixels(new Rect(Vector2.zero, outputSize), 0, 0);
58
59 // アクティブテクスチャを原状復帰する
60 RenderTexture.active = activeTexture;
61
62 // もうresultRenderTextureは不要なので解放する
63 RenderTexture.ReleaseTemporary(resultRenderTexture);
64
65 // PNGデータを取得する
66 var result = resultTexture.EncodeToPNG();
67
68 // もうresultTextureは不要なので破壊する
69 Object.Destroy(resultTexture);
70
71 // PNGデータを返す
72 return result;
73 }
74}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。