unity shader用にほかのサイトからパクって調整した処理を残しておくコーナー
閉じる
閉じる

新しい記事を投稿しました。シェアして読者に伝えましょう

×

unity shader用にほかのサイトからパクって調整した処理を残しておくコーナー

2019-05-14 11:38
    1
    ライトの色を合成するのにRGVをHSVにして
    HとSを混ぜてあげれば色合いだけ変わるんじゃねーの?

    2
    でもHって1で一周するやつだから単純な足し算引き算じゃ混ぜれんよね……
    (0.9と0.1の間は0になってほしいところ0.5になるという)
    角度をベクトルに変換して混ぜることで間をとる方法があるらしいぞコレだな!?
    これパクって改変だな!?


    うまくいかないと思ったらCG言語でのatan2とかいうの-90度も90度も90度として返してくるとからしいぞ……
    なんか精度低くした代わりに処理速度早くしてなおかつちゃんと180~-180で値返してくれるのを公開してくれてるサイトがあったぞ!
    これパクって改変だな!?

    4
    なんとかうまくいったけど水色のオブジェクトに赤いライトあてると緑色になる
    色相の混ざり方的には完全に合ってるけど感覚的にはダメな奴だなコレ……?

    という流れでせっかくパクって何とか改変したのに使わなくなった処理をメモ的に張り付けておくことにするという流れですはい……

    上で書いたCG言語でのatan2では都合が悪かったので0~360で角度を返してくれるようにした奴
    パクり元サイトは以下
    近似式でatan2の処理を高速化してみる
    高速化されているという部分は処理負荷自体に詳しくないのでシェーダーでも早いものなのかなどはわかってない(キリッ)

    //------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    //CG言語でのatan2は90も-90も90で返してきてしまうらしい?
    //とにかく180度以上になった時にきついのでユニークで実装
    //処理自体も正確ではなくなる近似値をとるようにして高速化しているらしい
    //https://garchiving.com/approximation-atan2/
    //ここにあったものを微改変
    //------------------------------------------------------------------------------------------------------------------------------------------------------------------------


    float atan2_360(float yv, float xv) {
    float x = abs(xv);
    float y = abs(yv);
    float z;
    bool c;

    c = y < x;
    if (c)z = (float)y / x;
    else z = (float)x / y;

    float a;
    //0~45度までで変換しているらしい
    //ここで処理の正確さと速さをコメントアウトで選択するらしい
    //一旦一番早いものを使用
    a = z * (-1556 * z + 6072); //2次曲線近似
    //a = z * (z * (-448 * z - 954) + 5894); //3次曲線近似
    //a = z * (z * (z * (829 * z - 2011) - 58) + 5741); //4次曲線近似

    if (c) {
    if (xv > 0) {
    if (yv < 0)a = 36000 - a;
    }
    if (xv < 0) {
    if (yv > 0)a = 18000 - a;
    if (yv < 0)a = a + 18000;
    }
    }

    if (!c) {
    if (xv > 0) {
    if (yv > 0) a = 9000 - a;
    if (yv < 0) a = 27000 + a;
    }
    if (xv < 0) {
    if (yv > 0) a = a + 9000;
    if (yv < 0) a = 27000 - a;
    }
    }

    //0~3600になっているので補正
    a = a * 0.01;


    return a;
    }

    角度をベクトルに変換してから混ぜて平均をとるという方法で
    HSVのHを混ぜる処理
    パクり元サイトは以下
    角度の平均を求める方法
    注意
    ・上で作成したatan2_360を使っている箇所がある
    ・実際自分がシェーダー内で使っていた部分から
     このブログ上で改変省略してシンプルにした部分があるので
     その部分間違えてる可能性あるので動かんかったら修正の必要あり




    //------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    //HSVのHの平均を出すために角度として考えてベクトル変換してから平均値を出す関数
    //https://qiita.com/koyo-miyamura/items/37d555ae150047ebefde
    //計算内容自体の参考
    //------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    float H_average(float base_H, float light_H) {

    float angles_rad;

    //0~1に360をかけて角度に、そこからさらにラジアンというものに変換
    angles_rad = radians(360 * base_H);
    //サインとコサインでベクトルにする(できるらしい?)
    float2 base_vectors = float2 (cos(angles_rad), sin(angles_rad));

    //ほかの要素も同様に処理
    angles_rad = radians(360 * light_H);
    float2 light_vectors = float2 (cos(angles_rad), sin(angles_rad));

    //ベクトルを足して割る
    float2 last_vectors =(base_vectors + light_vectors)/ 2 ;

    //ベクトルからラジンアン、角度、Hに逆変換
    //CG言語のatan2は90も-90も区別せず90度と返してくるらしいのでいただいてきた独自処理で0~360でもらう
    float last_H = (atan2_360(last_vectors.y, last_vectors.x)) / 360;

    return last_H;
    }


    移植してみたけど使わなかったものを残しておくための記事だけども
    RGBとHSVの変換に関してもパクったサイトURLを貼っておく
    【Unity】RGBをHSVに変換して明るさとかを変えるシェーダー

    基本的にセルシェーダーの更新は一つ前の記事を追記で更新していこうと思ってるけども
    こういう風にパクってきたとはいえ色々調べたのに使わなかったみたいなのまたでたら
    こっちに追記するかも


    広告
    コメントを書く
    コメントをするには、
    ログインして下さい。