bate's blog

調べたこと実装したことなどを取りとめもなく書きます。

DrawProcedualで複数の三角形を描画

3角形を3つ表示

using UnityEngine;

public class DrawProcedualTrianglesTest : MonoBehaviour
{
    public Shader shader;
    public Material material;

	private void OnRenderObject()
	{
        if (material == null) {
            material = new Material(shader);
        }
        material.SetPass(0);
        Graphics.DrawProcedural(MeshTopology.Triangles, 3 * 3, 1);
	}
}

SV_VertexIDは頂点のIDであることを利用したオフセット。

Shader "Unlit/PointTopologyTest"
{
	Properties
	{
		_Color ("Color", Color) = (1,0,0,1)
	}
	SubShader
	{
		Tags { "Queue"="Transparent" "RenderType"="Transparent" }
		LOD 100
        
        Blend SrcAlpha OneMinusSrcAlpha 

		Pass
		{
			CGPROGRAM
            #pragma target 4.5
			#pragma vertex vert
			#pragma fragment frag
			#include "UnityCG.cginc"

			struct appdata
			{
                uint vertexId : SV_VertexID;
			};

			struct v2f
			{
				float4 position : SV_POSITION;
			};

            static float4 positions[3] = {
                float4(0,1,0,1),
                float4(1,0,0,1),
                float4(-1,0,0,1)
            };
            
			half4 _Color;
			
			v2f vert (appdata v)
			{
				v2f o;
                float4 offset = positions[v.vertexId / 3];
				o.position = UnityObjectToClipPos(positions[v.vertexId % 3] + offset);
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target
			{
				return _Color;
			}
			ENDCG
		}
	}
}