見出し画像

平面メッシュの裏面を描画する(2023/12)

2Dアバターの実装に合わせて、ZEPETO Studioでトゥーンシェーダーが提供されるようになりました。それに伴い、標準シェーダーや、裏面を描画するための手順が追加されています。

最新のZEPETO標準シェーダーは ZEPETO/Standardで、このシェーダーは平面メッシュの裏面を描画しません。本稿ではZEPETO/Standardシェーダーを修正して裏面を描画できるよう修正する手順を説明します。

うさぎの耳は平面メッシュで作成しているので、デフォルトでは描画されない
左: ZEPETO/Standardをそのまま使用
右: ZEPETO/Standardを改変し、裏面を描画させるシェーダーを使用

再編されたシェーダーの構造

2Dシェーダー提供と同時にシェーダーが再編され、用途ごとに名前が付いたことで、どのシェーダーを使えばよいかが分かり易くなりました。

ZEPETO提供のシェーダーファイル一覧
SkinとかHairとかEyeとか分かり易い

さらに各シェーダーは1つのファイルで完結していましたが、再編後は#includeしているシェーダーが多くなり、スマートな構成になりました。#includeって何? という話ですが、本稿で説明する範囲では、複数のシェーダーで共通している処理を使うときに参照して、毎回書かなくていいように効率化している、くらいの認識でよいです。

正確な説明は以下のページなどを参照してください。

ZEPETO/Standardシェーダー

ZEPETO/Standardシェーダーの実体はzepeto.characterパッケージ内のCloth.shaderファイルとなります。Cloth.shaderファイルをベースにして、裏面も描画するシェーダーを作成していきます。

resource-internalフォルダのCloth.shaderがZEPETO/Standardの実体

Cloth.shaderの冒頭は以下です。シェーダーの名前はZEPETO/Standardです。

Shader "ZEPETO/Standard"  {
	Properties {

		
		_Color ("Color", Color) = (1,1,1,1)
		_MainTex ("Albedo (RGB)", 2D) = "white" {}
		_Glossiness ("Smoothness", Range(0,1)) = 0.5
		_Shininess ("Shininess", Range (0.03, 1)) = 0.078125
		_BumpMap ("Normal map", 2D) = "bump" {}
:
:

ZEPETO/Standardシェーダーの裏面描画バージョンを作成する手順

基本的には前回と似たような手順で、ベースとなるシェーダーファイルを自分のUnityプロジェクトフォルダ配下に配置し、修正をかけていく手順となります。

前回はUnityの提供するStandardシェーダーをベースに改変していましたが、今回はZEPETOの提供するZEPETO/Standardシェーダーをベースに改変します。また、ZEPETO/Standardは#includeを使用しているので、参照先を修正する必要があります。順に解説します。

  1. Cloth.shaderファイルをコピーしてPJ内に配置する

  2. shaderの識別名を変更する

  3. Cull OFFを記述する

  4. #includeの参照先を修正する

1. Cloth.shaderファイルをコピーしてPJ内に配置する

zepeto.characterパッケージに含まれるCloth.shaderファイルをコピーして、Unityプロジェクト配下の任意のフォルダに貼り付けます。その後、適当なファイル名にリネームします。

下図ではUnityプロジェクト配下のAssetsフォルダの下にshadersフォルダを作成し、その中にCloth.shaderを貼り付け。その後Cloth.shaderをリネームしてCloth-culloff.shaderにしています。

Cloth.shaderを複製するだけのファイル操作です

2. shaderの識別名を変更する

Cloth-culloff.shaderをテキストエディタで開き、1行目の”ZEPETO/Standard”を"ZEPETO/Standard Cull Off"に変更します。ここで指定した名前は、Unity上でシェーダーを選択する際の識別名になります。

Shader "ZEPETO/Standard Cull Off"  {
	Properties {

		
		_Color ("Color", Color) = (1,1,1,1)
:
:

3. Cull OFFを記述する

19行目にCull Offを追記します。これで裏面が描画されるようになります。

:
:
	SubShader {
		Tags { "RenderType"="Opaque" }
		LOD 200
		Cull OFF

		CGPROGRAM
		// Physically based Standard lighting model, and enable shadows on all light types
		#pragma surface surf StandardSpecular  finalcolor:tonemapping:
:
:

4. #includeの参照先を修正する

さらに24行目の#includeについて、"ToneMapping.cginc" を、 "Packages/zepeto.character/resources-internal/ToneMapping.cginc"に修正します。

:
:
		// Physically based Standard lighting model, and enable shadows on all light types
		#pragma surface surf StandardSpecular  finalcolor:tonemapping
		#include "Packages/zepeto.character/resources-internal/ToneMapping.cginc"
		
		// Use shader model 3.0 target, to get nicer looking lighting
		#pragma target 3.0
:
:

ここで少し解説します。

改変前のファイル Cloth.shaderは、#include "ToneMapping.cginc" の記述で同じフォルダ内のToneMapping.cgincを参照しています。これは正しい。

同一フォルダ内で参照

しかし改変のために複製した Cloth-culloff.shader は全く別のフォルダにあるため、Cloth-culloff.shader と同じフォルダ内には ToneMapping.cginc は存在しません。このままだとshaderのエラーが出てしまいます。

shadersフォルダ内にはToneMapping.cgincはない
Unity上でも、24行目で指定されているToneMapping.cgincが開けない、というエラーがでる

これを解消するために、#include "Packages/zepeto.character/resources-internal/ToneMapping.cginc"とパッケージ名からのパスを記述することで、パッケージ内のToneMapping.cgincを指定しています。

パッケージ内のToneMapping.gcincを参照するイメージ

別解として、24行目を #include "ToneMapping.cginc" としたまま、shadersフォルダにToneMapping.cgincを複製して配置する方法もありますが、そこはお好みで。

Unity上で確認

適当なMaterialのInspactorを開き、shaderを選択していきます。Cloth-culloff.shader内で指定していた識別名 "ZEPETO/Standard Cull Off" が出てくると思います。

ZEPETO/Standard Cull Offがでている

これで尻を見られても安心です。

耳が裏側からでも描画されます

注意点

Cull Offにすることで裏面を描画するので当然、負荷は上がります。また、カメラの位置によってはメッシュで覆われているはずの裏側が見えるようになってしまいます。

裏面を描画する必要のあるパーツだけメッシュとMaterialを分けておいて、Cull Offを設定するのがベストなのですが、作業の段取りやコストの関係で、とりあえずCull Offしとけばいいやになってしまいます。負荷かけてごめんなさい。

左: Cull Back … 裏面は描画されない
右: Cull Off … カメラの位置によっては裏面が見えてしまう


この記事が参加している募集

メタバースやってます

この記事が気に入ったらサポートをしてみませんか?