質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

HLSL

HLSLは、米マイクロソフト社によって開発された Direct3D APIで使われるプロプライエタリなシェーディング言語です。

解決済

Unityのモザイクシェーダーでブロックが正方形にならない

yrema
yrema

総合スコア285

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

HLSL

HLSLは、米マイクロソフト社によって開発された Direct3D APIで使われるプロプライエタリなシェーディング言語です。

1回答

0評価

0クリップ

256閲覧

投稿2022/05/28 11:59

モザイクシェーダーを導入したのですが、モザイクが正方形ブロックにならなくて困っています。
下図のように横に長いブロックになってしまいます。
イメージ説明

シェーダーの出どころはこちらです(フリー素材)
https://booth.pm/ja/items/1703064

各インスペクターです。
イメージ説明

イメージ説明

イメージ説明

※Canvasのサイズは120x90、Gameタブの解像度も120x90です。

元画像はこちらです(120x90)
イメージ説明

使用しているのはモザイク1なので
以下のHLSLでは恐らく★1~3の3行をどうにか修正すればいいのではないかと推測しますが、分からなくて困っています。

Shader "Pya/mosaic" { Properties { [Enum(UnityEngine.Rendering.CullMode)] _Cull("Cull", Float) = 0 [KeywordEnum(mosaic1_normal, mosaic2_average, blur1_normal, blur2_gauss)] _Mode("Type", Float) = 0 [Header(Mosaic)] _Pixelation ("Pixelation Size", Range(1, 1000)) = 70 [Space (7)] [Header(Blur)] _BlockSize ("Block Size", Range(1, 1000)) = 10 _SD ("SD(blur2 only)", Range(1,100)) = 10 } SubShader { Tags { "Queue" = "Transparent" "RenderType"="Transparent" } ZWrite Off Cull [_Cull] //GrabPassでレンダリング結果を取得 GrabPass {} //X方向へのぼかし処理 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma multi_compile _MODE_MOSAIC1_NORMAL _MODE_MOSAIC2_AVERAGE _MODE_BLUR1_NORMAL _MODE_BLUR2_GAUSS #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; }; struct v2f { float4 vertex : SV_POSITION; float4 grabPos : TEXCOORD0; }; sampler2D _GrabTexture; float4 _GrabTexture_ST; float4 _GrabTexture_TexelSize; float _Pixelation; float _BlockSize; float _SD; v2f vert(appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.grabPos = ComputeGrabScreenPos(o.vertex); return o; } fixed4 frag(v2f i) : SV_Target { fixed4 col; float2 uv = i.grabPos.xy / i.grabPos.w; //0~1に変換 // ★1 float2 uv_pixel = floor(uv * _Pixelation) /_Pixelation; //ピクセル化 // ★2 //-----モザイク1 先頭ピクセルで範囲を塗りつぶす --------// #ifdef _MODE_MOSAIC1_NORMAL col = tex2D(_GrabTexture, uv_pixel); // ★3 //-----モザイク2 平均化した色で範囲を塗りつぶす --------// #elif _MODE_MOSAIC2_AVERAGE float count=0; //X方向にピクセルをずらして色を加算する for(int j = 0; j <= floor(1/(_GrabTexture_TexelSize.x * _Pixelation)); j++) { col = col + tex2D(_GrabTexture, uv_pixel + float2(j * _GrabTexture_TexelSize.x, 0)); count++; } //平均 col = col / count; //-----ぼかし1 周辺ピクセルの色を平均化 -------------// #elif _MODE_BLUR1_NORMAL float count=0; float size=floor(_BlockSize)*0.1; for(int j = -size; j <= size; j++) { //X方向にピクセルをずらして色を加算する col = col + tex2D(_GrabTexture, uv + float2(j * _GrabTexture_TexelSize.x,0)); count++; } //平均 col = col / count; //-----ぼかし2 ガウス関数での重み付け --------------// #elif _MODE_BLUR2_GAUSS float size=floor(_BlockSize)*0.1; float weight_total; float var = pow(_SD, 2) * 0.001; //分散 for(int j = -size; j <= size; j++) { float distance = j / size; //重み y = -exp(-0.5*x^2/σ^2) float weight = exp(-0.5 * pow(distance, 2) / var); weight_total = weight_total + weight; //X方向にピクセルをずらして重み付けした色を加算する col = col + tex2D(_GrabTexture, uv + float2(j * _GrabTexture_TexelSize.x,0)) * weight; } //正規化 col = col / weight_total; #endif return col; } ENDCG } //GrabPassで1つ目のPassのレンダリング結果を取得 GrabPass {} //Y方向へのぼかし処理 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma multi_compile _MODE_MOSAIC1_NORMAL _MODE_MOSAIC2_AVERAGE _MODE_BLUR1_NORMAL _MODE_BLUR2_GAUSS #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; }; struct v2f { float4 vertex : SV_POSITION; float4 grabPos : TEXCOORD0; }; sampler2D _GrabTexture; float4 _GrabTexture_ST; float4 _GrabTexture_TexelSize; float _BlockSize; float _SD; v2f vert(appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.grabPos = ComputeGrabScreenPos(o.vertex); return o; } fixed4 frag(v2f i) : SV_Target { fixed4 col; float2 uv = i.grabPos.xy / i.grabPos.w; //0~1に変換 #ifdef _MODE_MOSAIC1_NORMAL //何もしない col = tex2D(_GrabTexture, uv); #elif _MODE_MOSAIC2_AVERAGE //何もしない col = tex2D(_GrabTexture, uv); #elif _MODE_BLUR1_NORMAL float count=0; float size=floor(_BlockSize)*0.1; for(int j = -size; j <= size; j++) { //Y方向にピクセルをずらして色を加算する col = col + tex2D(_GrabTexture, uv + float2(0,j * abs(_GrabTexture_TexelSize.y))); count++; } col = col / count; #elif _MODE_BLUR2_GAUSS float size=floor(_BlockSize)*0.1; float weight_total; float var = pow(_SD, 2) * 0.001; for(int j = -size; j <= size; j++) { float distance = j / size; float weight = exp(-0.5 * pow(distance, 2) / var); weight_total = weight_total + weight; //Y方向にピクセルをずらして色を加算する col = col + tex2D(_GrabTexture, uv + float2(0,j * abs(_GrabTexture_TexelSize.y))) * weight; } col = col / weight_total; #endif return col; } ENDCG } } }

◆環境
Unity2020.3.11f1
Windows10

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

HLSL

HLSLは、米マイクロソフト社によって開発された Direct3D APIで使われるプロプライエタリなシェーディング言語です。