🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

8945閲覧

unityシェーダーの_MainTex_TexelSizeについて

hacohaco

総合スコア2

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/12/06 09:02

よろしくお願い致します。
UnityShaderにおける、_MainTex_TexelSizeについて理解したいです。

_MainTex_TexelSizeのx,y,z,w各成分に含まれる数値が何を表しているのか、よく理解出来ませんでした。
各数値がテクスチャのピクセル数を指しているのではないことは、数値をフラグメントシェーダーのcolに入れてみた結果理解出来たのですが、
それではこの_TexelSizeという名の変数には何の数値が入っているのでしょうか、、?

あと、もう一つ分からない点として、
_MainTex_TexelSizeのx,y成分についてはunity公式サイトに
x = 1.0/width
y = 1.0/height
とありました。

テクスチャのサイズに対して1.0で割算をするのは何故でしょうか。

テクスチャそのままのピクセル数で縦横の対比を見たら
x:y→10pixel:5pixel→2:1
と直感的にわかりやすい対比の数値が見れますが、
1.0で割った場合は
x:y→1÷10 : 1÷5→0.1 :0.2
となるので、実際の対比とは違う結果になるのでは?と思ってしまい、
どういう意図で1で割算をするのか分からないでいます。

ご参考までに、検証に使ったデータを記載しておきます。

•使用テクスチャ
ピクセル数:10×5px
解像度:144dpi
サイズ:137バイト

•colに入力した際出力された数値
r:32
g:64
b:255

検索してもハッキリとした情報が見当たらず、とても初歩的な質問なんだろうなと思い、恐縮です。
よろしければ、ご教授頂けますと幸いです。
よろしくお願い致します。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

「各数値がテクスチャのピクセル数を指しているのではない」とおっしゃいますが、「Unity - Manual: Accessing shader properties in Cg/HLSL」の「Texture size」の節には...

__{TextureName}___TexelSize - a float4 property contains texture size information:

x contains 1.0/width
y contains 1.0/height
z contains width
w contains height

とあり、zとwにはテクスチャの幅・高さがそのまま入っているはずです。

xとyにはそれぞれテクスチャの幅・高さの逆数が入っていますが、これはtex2dでテクスチャをサンプリングするときに便利だからという理由からじゃないかと思います。
テクスチャをサンプリングする際の引数は左下が(0, 0)、右上が(1, 1)になるよう正規化されてますので、もし現在注目しているピクセルの隣のピクセルを見たいときには、テクスチャのサイズが10×5だったとすると水平方向のずらし量は1/10、垂直方向のずらし量は1/5...という風に逆数になるはずです。シェーダー上で逆数を計算するとわずかながら計算コストがかかりますが、あらかじめ__{TextureName}___TexelSize.xyとして逆数が計算済みになっていればそれを利用できますので、処理効率がちょっと向上できるものと思われます。

投稿2020/12/06 09:38

Bongo

総合スコア10811

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hacohaco

2020/12/06 13:49

Bongo様 ご教授大変ありがとうございます。 z,wの要素にはテクスチャのピクセルサイズがそのまま入っていると教えて頂いて、それを頼りに色々検証してみた結果、納得のいく検証結果を出すことができました。 原因として、シェーダー内でcolorの値は0〜1で扱う必要があることを理解していないこと、 シェーダー内の計算では割算は避けた方が良く、代わりに逆数を使った方が良いことを理解していないことが原因でした。 そのためcolorへの出力が意図通りになっていませんでした。 上記を踏まえた上で出力してみたところ、無事z,wがピクセルサイズであることが確認できました。 それと、x,yの要素に関して逆数に変換していることについて、大変わかりやすくご説明くださりありがとうございます。 テクスチャをサンプリングする際の引数が正規化されている、ということを踏まえるととても納得がいきました。 私1人では気づくことは大変難しかったです。 貴重なお時間を割いてご丁寧に教えて頂き本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問