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

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

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

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

GLSL

GLSL (OpenGL Shading Language) はC言語をベースとしたシェーディング言語です。

Q&A

解決済

1回答

2586閲覧

【Unity】WebGLでビルドした後に表示される点群のPointSizeを変更したい

Y0241-N

総合スコア1066

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

GLSL

GLSL (OpenGL Shading Language) はC言語をベースとしたシェーディング言語です。

0グッド

1クリップ

投稿2019/08/08 05:21

編集2019/08/08 08:54

前提条件

Unity上で点群データをWebGLでビルドし、表示することを目的に試行錯誤中です。(Unity2019.1.4f1)

点群データをUnityに取り組むためにPcxAsettsを使用しています。
このプロジェクトの中のTestフォルダにあるPlantシーンで実験中です。

ただ、このままWebGLでビルドしても、点群が表示されないので、こちらの記事を参考にしてPointCloud/Diskシェーダーを改変、

ビルド時にシェーダーが適応されるように[Editor] => [Project Settings]の[Always Included Shaders]に改変したPointCloud/Diskシェーダーを追加して表示できるようにしました。(改変したシェーダーは後述)

実現したいこと

ビルド後に点群が表示されたはよいものの、Scene上ではシェーダーのPointSizeで見た目上の大きさを変更できますが、
恐らくビルド時にPointSizeが別の値で上書きされているため、0.005ほどのサイズで描画されてしまいます。

これを、サイズを自由に変更できる、もしくは0.03のサイズで描画したいです。

PointCloudDisk

1Shader "PointCloud/Disk" 2{ 3 Properties 4 { 5 _Tint("Tint", Color) = (0.5, 0.5, 0.5, 1) 6 _PointSize("Point Size", Float) = 0.03 7 } 8 SubShader 9 { 10 Tags { "RenderType"="Opaque" } 11 Cull Off 12 Pass 13 { 14 Tags { "LightMode"="ForwardBase" } 15 CGPROGRAM 16 #pragma vertex Vertex 17 #pragma geometry Geometry 18 #pragma fragment Fragment 19 #pragma multi_compile_fog 20 #pragma multi_compile _ UNITY_COLORSPACE_GAMMA 21 #pragma multi_compile _ _COMPUTE_BUFFER 22 #include "Disk.cginc" 23 ENDCG 24 } 25 Pass 26 { 27 Tags { "LightMode"="ShadowCaster" } 28 CGPROGRAM 29 #pragma vertex Vertex 30 #pragma geometry Geometry 31 #pragma fragment Fragment 32 #pragma multi_compile _ _COMPUTE_BUFFER 33 #define PCX_SHADOW_CASTER 1 34 #include "Disk.cginc" 35 ENDCG 36 } 37 } 38 39 SubShader 40 { 41 Pass 42 { 43 LOD 200 44 45 GLSLPROGRAM 46 #pragma multi_compile __ HEIGHTMAP_ON 47 48 #ifdef VERTEX 49 50 out vec4 Color; 51 uniform sampler2D _HeightTex; 52 uniform float _PointSize; 53 54 float ToneMap(float rawValue) 55 { 56 float contrast = 3.8; 57 float exposure = 0.001; 58 float a = exposure * pow(rawValue, contrast); 59 return a / (1.0f + a); 60 } 61 62 void main() 63 { 64 gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; 65 gl_PointSize = _PointSize * (1.0 / gl_Position.w); 66 67 #ifdef HEIGHTMAP_ON 68 float index = ToneMap(gl_MultiTexCoord0.x); 69 Color = texture2D(_HeightTex, vec2(index, 0)); 70 #else 71 Color = gl_Color; 72 #endif 73 } 74 75 #endif 76 77 #ifdef FRAGMENT 78 79 in vec4 Color; 80 81 void main() 82 { 83 vec2 coord = gl_PointCoord - vec2(0.5); 84 if (length(coord) > 0.5) 85 { 86 discard; 87 } 88 89 gl_FragColor = Color; 90 } 91 92 #endif 93 94 ENDGLSL 95 } 96 } 97 CustomEditor "Pcx.DiskMaterialInspector" 98} 99 100

試したこと

シェーダーに関しては浅知恵なため、どのようにして稼働しているかは、なんとなくでしか理解していないことをご了承ください。
恐らく、PointSizeはこの部分で決められているのだろうと思い、この部分をあれこれと改変してみましたが、どれもうまくいきませんでした。

C

1void main() 2 { 3  gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; 4 gl_PointSize = _PointSize * (1.0 / gl_Position.w);

gl_PointSize = 0.03fとする → ビルド時に点群が表示されなくなる(以下非表示と記載)
(1.0 / gl_Position.w)の1.0を3.0などに変えてみる → 大きさに変化なし
float _PointSize = 0.03f;と値を渡してみる → 非表示
gl_PointSize = _PointSize * 3(1.0 / gl_Position.w);括弧の前に数字をかけてみる → 非表示

###追記
修正依頼の通り、PointSizeを調べてみたところ、Unity上とWebGL上で同じ値が返ってきているにもかかわらず、点の大きさが明らかに異なっていることがわかりました。
![イメージ説明]
イメージ説明

表記はこのようなスクリプトで行っています

C

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class PointSizeText : MonoBehaviour 7{ 8 private Renderer PC; 9 public Text text; 10 void Update() 11 { 12 PC = this.GetComponent<Renderer>(); 13 PC.material.EnableKeyword("_PointSize"); 14 text.text ="PointSize:" + PC.material.GetFloat("_PointSize").ToString(); 15 } 16}

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

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

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

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

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

Ram.Type-0

2019/08/08 06:09

マテリアルの値が変わっているのかシェーダーの内部に問題があるのか分からないので、マテリアルのPointSizeをWebGLで実行時に表示して確認してみてください。
Y0241-N

2019/08/08 06:45

すみません、Shaderの変数をスクリプトから参照するにはどのように宣言すればよいのでしょうか...。 GetComponentでMaterialを取得して.gl_PointSaizeという感じでしょうか?
Y0241-N

2019/08/08 08:44

自力で何とかなりました、調べた結果、内部的な数値は適応されているようですが、何らかの要因で見た目場が変化していません。
guest

回答1

0

自己解決

自己解決しました。

結論から言うと「ビルド時に適応されるシェーダーのPointSizeではなく、Unity上で表示しているシェーダーのPointSizeを変更していたため、ビルド後にPointSizeが0の状態だった」という話でした。

詳しくはQiitaでまとめ記事を作ろうと思いますが、簡単に書き残しておきます。

WebGLでビルドする際、シェーダーはGLSL言語で書かれている必要があるので、PointCloud/DiskのシェーダーにGLSLで書かれた点群を表示する文を書き加えていましたが、これを分離。

C#

1Shader "Custom/PointCloud_GL" 2{ 3 Properties 4 { 5 _PointSize("PointSize", Float) = 500 6 } 7 8 SubShader 9 { 10 Pass 11 { 12 LOD 200 13 14 GLSLPROGRAM 15 #pragma multi_compile __ HEIGHTMAP_ON 16 17 #ifdef VERTEX 18 19 out vec4 Color; 20 uniform sampler2D _HeightTex; 21 uniform float _PointSize; 22 23 float ToneMap(float rawValue) 24 { 25 float contrast = 3.8; 26 float exposure = 0.001; 27 float a = exposure * pow(rawValue, contrast); 28 return a / (1.0f + a); 29 } 30 31 void main() 32 { 33 gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; 34 gl_PointSize = _PointSize * (1.0 / gl_Position.w); 35 36 #ifdef HEIGHTMAP_ON 37 float index = ToneMap(gl_MultiTexCoord0.x); 38 Color = texture2D(_HeightTex, vec2(index, 0)); 39 #else 40 Color = gl_Color; 41 #endif 42 } 43 44 #endif 45 46 #ifdef FRAGMENT 47 48 in vec4 Color; 49 50 void main() 51 { 52 vec2 coord = gl_PointCoord - vec2(0.5); 53 if (length(coord) > 0.5) 54 { 55 discard; 56 } 57 58 gl_FragColor = Color; 59 } 60 61 #endif 62 63 ENDGLSL 64 } 65 } 66}

この内部で適応されているPointSizeを変更してもなぜか点の大きさは変わらなかったので、スクリプトからPointSizeに値を渡すことで点の大きさを変更

Test

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Test : MonoBehaviour 6{ 7 void Start() 8 { 9 GetComponent<Renderer>().material.EnableKeyword("_PointSize"); 10 GetComponent<Renderer>().material.SetFloat("_PointSize", 50f); 11 } 12}

これで出力すると、スクリプトで渡した値の大きさで表示することができました。
イメージ説明

投稿2019/08/09 02:24

編集2019/08/09 02:26
Y0241-N

総合スコア1066

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問