さて、Shaderでは単純に描画だけを扱うわけではないです。
GPUで計算ができるShaderは考え方によっては計算用のShaderとしても使えます。
これは結構当たり前かもしれませんね。
で、ここからなのですが今まで私はShaderで書き込む以上、
最終的にはテクスチャに値を取り出しておく必要があるため
値は必ず0~1の間で表現しなければならないと思っていました。
なので、RenderTextureを作って計算結果を渡していたのですが……
まずは検証コードです。
using UnityEngine;
using System.Collections;
public class ColorTest : MonoBehaviour {
#region DECLARATION
RenderTexture computeTexture;
RenderTexture resultTexture;
Texture2D readTexture;
public float upColor = 1;
public float downColor = 1;
public float result = 0;
public Material upMat,downMat;
#endregion // DECLARATION:
// Use this for initialization
void Start () {
computeTexture = new RenderTexture(128, 128, 0, RenderTextureFormat.ARGBFloat);
resultTexture = new RenderTexture(128, 128, 0, RenderTextureFormat.ARGBFloat);
readTexture = new Texture2D(128, 128, TextureFormat.RGBAFloat, false);
}
// Update is called once per frame
void Update () {
upMat.SetColor("UpColor", new Color(upColor, upColor, upColor));
Graphics.Blit(null, computeTexture, upMat, 0);
downMat.SetColor("DownColor", new Color(downColor, downColor, downColor));
downMat.SetTexture("SetTex", computeTexture);
Graphics.Blit(null, resultTexture, downMat, 0);
RenderTexture.active = resultTexture;
readTexture.ReadPixels(new Rect(0, 0, 128, 128), 0, 0);
result = readTexture.GetPixel(0,0).r;
}
}
中身としてはRenderTextureを作り
Graphics.BlitでテクスチャにUpColorを書き込み
そのテクスチャを今度はDownColorでマイナスしたものを別のテクスチャに書き込み。
それをReadPixelで取得してresultにカラーの情報を書き込んでます。
なので中身的には
UpColor - DownColor = result
となっています。
UpColor、DownColorともに1の状態です。resultは0ですね。
テクスチャにはそのまま値を渡しているので本来ならば
DownColorを0にすればいいのですが……
UpColorを2にしたところ結果は白になりリザルトは1に
つまりこれはUpColorの2をテクスチャが保持しており
その2から1引いた結果ということになっています。
なのでこんなことも
DownColorは2、結果resultは-2に。
つまりこの時点でテクスチャに書き込んでいるにもかかわらず
カラーの値は0~1ではないということがなんとなくわかると思います。
なぜこんなことが起きたのか?
それはRenderTextureのFormatに関係しています。
RenderTextureFormatをARGBFloat(もしくはHalf,Intなど)にすることでカラーを32ビットの整数値で取得することができるのです。
もしかしたらご存知の方も多いでしょうが
こんな風に計算を行った結果をテクスチャに書き込む場合、Formatによっては
0~1以外の値が取得できたり、もしくは値を0~1のrepeatとして返すこともあります。
正直知らなかったので計算時にひどい目にあいました。
どうせ0~1になるだろうと思って高い値のまま渡していたせいか、破たんしまくって何回かUnityじたいが落ちたりしました。
なので今後計算をShaderに任せるときはこのことを頭に置いておいた方がいいかもしれないですね。
PR
COMMENT
カレンダー
最新記事
(02/05)
(01/22)
(06/01)
(12/18)
(12/18)
最新コメント
プロフィール
HN:
あい。
年齢:
30
性別:
非公開
誕生日:
1994/01/09
自己紹介:
仕事でunityしつつ、3Dとかやるので
そろそろどこに向かってるのか分からなくなってきた人
めーるあどれす:
nokutan_aiあっとyahoo.co.jp
このブログはリンクフリーです。
バナーのURL
"https://blog.cnobi.jp/v1/blog/user/ffb3f4a3a70931da92ac361f9c87596b/1408110435"
になってると思います。
@AI_nohito からのツイート
そろそろどこに向かってるのか分からなくなってきた人
めーるあどれす:
nokutan_aiあっとyahoo.co.jp
このブログはリンクフリーです。
バナーのURL
"https://blog.cnobi.jp/v1/blog/user/ffb3f4a3a70931da92ac361f9c87596b/1408110435"
になってると思います。
@AI_nohito からのツイート
カウンター