本記事はUnity Advent Calendar 2018の9日目の記事です。
半年前ぐらいにこんなものを作りましたが、ちょっとするとShaderがジャギってくるので解決できないか調査してみました。
これを調査しようと考えていたんやけどもhttps://t.co/FCVPyMG8FV
— gremito:#ものラジ (@grem_ito) 2018年12月9日
環境
- Unity 2018.1.0f2
- AR: Vuforia Core Samples
- 端末: SAMSUNG GALAXY note 8
作った経緯
いろんなサイトを参考に初歩的なところを抑えながらShaderのソースコードを書いていました。
Shader "Custom/MyShader" {
Properties
{
_MainTex("MainTex", 2D) = "white"{}
}
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert_img
#pragma fragment wave_circle_frag
ENDCG
}
}
CGINCLUDE
#include "UnityCG.cginc"
float4 wave_circle_frag(v2f_img i) : SV_Target
{
float2 st = i.uv;
float distort = st * (1.0 + 0.1 * sin(st.x * 5.0 + _Time.z) + sin(st.y * 3.0 + _Time.z));
return step(
0.5,
abs(sin(distance(float2(0.5, 0.5), distort) * 30))
);
}
ENDCG
}
試しにGPUを使って解決できないか試してみた
- グラフィックスパフォーマンスの最適化
- 【Unity】GPU Instancingで遊ぶ
- 【Unity】パーティクルをGPU Instancingで描画してみる & 対応シェーダーを自作してみる
- Unity の GPU Instancing に対応するシェーダのコードを調べてみた
などを参考にInstancing
を付けて動作させてみたところ全く状況変わらずでした。
となると、単純に計算のずれから起きているものだと思ったので、他ShaderをAR上で動かそうと考えました。
他のShaderを使ってAR上で動作
シェーダーお絵描き入門勉強会の資料を公開しました🙇 #spzcolabhttps://t.co/kwRANl48uC
— setchi (@setchi) 2018年4月11日
の資料を参考に一部のShaderを書いて動作してみたところ、以下のようにキレイに動作することを確認しました。
結局、sin関数内の計算 or _Time. の掛け算で数値がずれたっぽいから別のShader書いて試してみたところ、問題なかった😇笑https://t.co/1RDGQe2Bcq
— gremito:#ものラジ (@grem_ito) 2018年12月9日
まとめ
まだまだShader勉強中なので、作りたいものを普通に作れるぐらい習得したいなと。
また最初の方から、パフォーマンスを意識した作りをできるようなれるように楽しんで覚えていきますー!
\\\٩( 'ω' )و ////
また今回、Advent Calendarの記事でアップしましたが遅れてしまい失礼しましたm(_ _)m
FirebaseとUnityに関するネタで前編後編をUnity Advent Calendar 2018とFirebase Advent Calendar 2018で投稿しようと考えていたり、Unity2018の最新でLINQはパフォーマンス的に使えるのかなども書こうか迷ってしまい、寝かせていた半年前ぐらいにAR上でShaderを動かしたプロジェクトのジャギっている問題を調査・解決するネタで書こうと思い、上記のようなことで遅れてしまっての投稿となってしまいました。。。笑汗
他にもAR上にShaderを動かすネタでやりたいことが1~2個あるんで、また何か試して来年どっかでアップしようと思いますー( ✌︎'ω')✌︎