前提条件
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}
回答1件
あなたの回答
tips
プレビュー