忍者ブログ
個人サークル「のくたん結鼓」の子が、色々書き残すだけの処。梅よろしでも飲みながらのんびり見てやってください
[47]  [46]  [45]  [44]  [43]  [42]  [41]  [40]  [39]  [38]  [37
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

今回の記事に関しては個人での検証なのでちょっと謎です。
でもおそらくそれで間違いはないかと思います。






さて、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
back
COMMENT
name
title
text
color   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
mail
URL
pass
secret
PREV ←  HOME  → NEXT
カレンダー
08 2017/09 10
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
最新コメント
プロフィール
HN:
あい。
年齢:
23
性別:
非公開
誕生日:
1994/01/09
自己紹介:
仕事でunityしつつ、3Dとかやるので
そろそろどこに向かってるのか分からなくなってきた人

めーるあどれす:
nokutan_aiあっとyahoo.co.jp

このブログはリンクフリーです。
バナーのURL
"http://file.nokutanno.kagome-kagome.com/banner.gif"
になってると思います。






カウンター
リンク
リンク先募集してます!
Copyright (C) 2017 結鼓記録書庫 All Rights Reserved.

Photo by (c)Tomo.Yun   TemplateDesign by kaie
忍者ブログ [PR]