unity3d-jp / UnityChanToonShaderVer2_Project

UnityChanToonShaderVer2 Project / v.2.0.9 Release
3.82k stars 811 forks source link

背景透過キャプチャ画像を出力する際の問題 #103

Closed TP-113 closed 2 years ago

TP-113 commented 2 years ago

こんにちは。

先日 #102 のissueを投稿させていただいた者です。#102 では、Unityをフックしているモジュールで発生した問題をこのリポジトリのissueとして扱うのは無理があるとご回答いただきました。その節はご回答ありがとうございました。

102 で報告いたしました、背景透過時にキャラの透過部分のアルファが残って透けてしまう問題なのですが、UnityRecorderやRenderTextureでスクショを撮るときにも同様の問題が発生いたします。そこで、Unityの公式モジュールをのみを使用した状況に絞ってIssueを立て直させていただきます。

16 に同じ現象と思われるIssueの報告がありましたのでUnityRecorderのアルファ付き出力でpngとして出力してみたのですが、やはり透けてほしくない部分(おでこにかかる前髪など)にアルファ値が残ってしまいます。

image image

一枚目の画像はunityのGameウィンドウ上で表示されている画像です。この画像では、緑色の背景の影響を受けることなく、おでこにかかった髪は後ろにあるおでこの色を正しく透過しています。 一方、二枚目の画像は、UnityRecorderでFormatのInclude Alphaにチェックを入れ、png形式で出力した画像を画像編集ソフトに取り込んだ様子です。おでこの髪がキャラごと透けてしまい、背景のチェック模様が見えてしまっています。

透過部に使用しているシェーダーはUnityChanToonShader/Toon_ShadingGradeMap_TransClippingです。

Unity上でUTSを使ってレンダリングしたキャラクターの背景透過画像を外部ソフトに取り込んで使用したいのですが、透過部分を正しく出力する方法はありませんでしょうか?

H3idi-X commented 2 years ago

こんにちは。 TransClipping シェーダーは、「とにかくシーン内でこの表現をしたい」という人のためのシェダーとなっております。 RenderTexutreにコピーした場合や、Recoderで出力した場合にアルファ値が残ってしまうのは、仕様となります。詳しくはソースコードをご確認ください。 マスクなどをして、多少、凝ったレンダリングを行えば、お望みの表現は可能と思われますが、プログラミングテクニックのレクチャーは私どもは行っておりませんので、その旨、ご理解いただけますようお願いいたします。

H3idi-X commented 2 years ago

他の方からよい解決案が、ここで得られれば良いと思いますので、このIssueをクローズしていただく必要はありません。

riina commented 2 years ago

Hi. I tried working this out. I got something vaguely like what the desired behaviour here seems to be, requiring a shader edit and adjusting material properties.

Material: -Enable inverse clipping -Set clipping level to 0.5 -Adjust transparency as needed

--- a/Assets/Toon/Shader/Toon_ShadingGradeMap_TransClipping.shader
+++ b/Assets/Toon/Shader/Toon_ShadingGradeMap_TransClipping.shader
@@ -193,7 +193,7 @@ Shader "UnityChanToonShader/Toon_ShadingGradeMap_TransClipping" {
             Tags {
                 "LightMode"="ForwardBase"
             }
-            Blend SrcAlpha OneMinusSrcAlpha
+            Blend SrcAlpha OneMinusSrcAlpha, SrcAlpha One
             Cull[_CullMode]

(edit: apparently this issue is on legacy 2.0.8. either way, this is a one line change)

L196: changes main pass alpha to always use destination alpha value as a minimum, adding SrcAlpha^2. Then alpha will always remain 1 if the pixel is already 1. Other blend options exist, but at the very least, I think One in that line should remain One for this use case.

TP-113 commented 2 years ago

@higeometry ご回答ありがとうございます!アルファ値が残るのは仕様とのこと承知しました。イシューを残していただきありがとうございます。

@riina Thank you for your advice! I have tried your modification. It gave me pretty close to what I want.

TP-113 commented 2 years ago

私のプロダクトに関しては @riina さんに教えていただいた方針で実装しようと思います。このIssueはこれで閉じておきます。ご助言ありがとうございました!

Regarding my product, I will implement it according to the policy taught by @riina . I will close this issue. Thank you for your advice!