Azure Kinect × 셀에서 점 크기를 변경하는 방법

2019년 20일째 3D Sensor Advent Calendar 기사입니다.

입문


아니오, 이거 안 돼요?이렇게 막혔어요.
같은 벽에 부딪힌 사람이 많은 것 같으니 보도해 보세요.

곤란한 일


AzureKinect에서 가져온 점 구름의 PointSize 입자 비율을 변경할 수 없습니다.)
구체적으로 말하면 VertexShader의 PSIZE 값을 변경해도 화면에 아무런 변화가 없음...곤란해.
카메라가 다가오면 이런 느낌이에요.
PointSize가 1로 고정된 느낌입니다.

완성된 일


AzureKinect에서 가져온 Depth 이미지의 PointSize를 변경할 수 있습니다.
이런 느낌.이해하기 쉽도록 PointSize를 5로 설정합니다.

PointSize를 1에서 2로 변경해도 전혀 다릅니다.

왜 그래?


네.
버텍스의 입자 크기는 PSIZE로 변경할 수 있다는 인식으로 만났지만 DX11 이후 무효화된 수수께끼 변경은 소용이 없었다.Quest를 OpenGL로 바꿀 수 있는데...일로 @Looking Glass & Azure Kinect(@asidys230)October 24, 2019
같은 고민을 하는 사람이 있다.

DX11 PSIZE Bug, PLEASE HELP! - Unity Forum



DX11 doesn't support point mode rendering anymore according to the documentation, so I'm surprised it works at all. The idea behind that is that it is replaced by geometry shaders. So you'll have to generate a quad at every vertex yourself using a geometry shader.



잘 모르겠지만 DX11 이후로는 솔직하게 작용하지 않을 것 같아요.p>
그러니까 범인은 이 녀석이야.br/>


이렇게 하면 돼요.br/>


그나저나 Shader는 이런 느낌이에요.p>

ColorutoutPoint.shader

Shader "Custom/ColoredVertex" {
    Properties{
     _Size("ShaderSize", Float) = 1.000000
     _PointSize("PointSize", Float) = 1.0
    }
        SubShader{
         Pass {
        CGPROGRAM
        #pragma vertex vert
        #pragma fragment frag
        #pragma target 2.0
        #include "UnityCG.cginc"
        #pragma multi_compile_fog
        #define USING_FOG (defined(FOG_LINEAR) || defined(FOG_EXP) || defined(FOG_EXP2))

        float _Size;
        float _PointSize;

        // uniforms
        // vertex shader input data
        struct appdata {
          float3 pos : POSITION;
          half4 color : COLOR;
          UNITY_VERTEX_INPUT_INSTANCE_ID
        };

    // vertex-to-fragment interpolators
    struct v2f {
      float psize : PSIZE;
      fixed4 color : COLOR0;
      #if USING_FOG
        fixed fog : TEXCOORD0;
      #endif
      float4 pos : SV_POSITION;
      UNITY_VERTEX_OUTPUT_STEREO
    };

    // vertex shader
    v2f vert(appdata IN) {
        IN.pos.xyz = IN.pos.xyz * _Size;

      v2f o;
      UNITY_SETUP_INSTANCE_ID(IN);
      UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
      half4 color = IN.color;
      float3 eyePos = mul(UNITY_MATRIX_MV, float4(IN.pos,1)).xyz;
      half3 viewDir = 0.0;
      o.color = saturate(color);
      // compute texture coordinates
      // fog
      #if USING_FOG
        float fogCoord = length(eyePos.xyz); // radial fog distance
        UNITY_CALC_FOG_FACTOR_RAW(fogCoord);
        o.fog = saturate(unityFogFactor);
      #endif
        // transform position
        o.pos = UnityObjectToClipPos(IN.pos);
        o.psize = _PointSize;
        return o;
      }


    // fragment shader
    fixed4 frag(v2f IN) : SV_Target {
      fixed4 col;
      col = IN.color;
      // fog
      #if USING_FOG
        col.rgb = lerp(unity_FogColor.rgb, col.rgb, IN.fog);
      #endif
      return col;
    }
    ENDCG
     }
    }
}


마지막


난 반했어.

근본적으로 해결하고 싶은 마음은 있지만 먼저 해결해서 너무 좋아요.p>
내일은 Sirokujira 씨의'Stereo Labs ZED Camera에 대한 이야기'입니다.p>

좋은 웹페이지 즐겨찾기