🔖

【MAYA・Python】hlslを利用してモデルチェックを行うツール

2022/07/30に公開

今回はmayaのrender setup機能を用いて、シェーダ(hlsl)モデルのエラーチェックを視覚的に行うツールを作成しました。以下の動画ではポリゴンの裏面が見えてしまっていないか、ポリゴンの法線がおかしくないかを確認しています。
https://youtu.be/1qnJTBh56KU

https://github.com/Kuru-teo/PythonCollection/tree/master/ChangeMatByRenderSetUp

【できること】

ポリゴンの裏面が見えてしまっていないか、ポリゴンの法線がおかしくないかを確認できます。またShaderを追加してデバッグ手段を自由に増やすことができます。

【事前準備】

  1. Windows/Settings/Preference/Preferenceを開き、Display/Viewport2.0/Rendering engineを「DirectX11」に変更します。
  2. Windows/Settings/Preference/Plug-in Managerから「dx11Shader」をロードします。
  3. ハードウェアテクスチャリングをオンにしておきます。

【実行方法】

  1. 「ChangeMatByRenderSetUp」をダウンロード後、MAYA_SCRIPT_PATHのパスが通っている場所にフォルダごと配置。(デフォルトはC:\Users\ユーザー名\Documents\maya\scripts)
  2. 以下コマンドをスクリプトエディタで実行
 from ChangeMatByRenderSetUp.ChangeMatByRenderSetUp import *
 main()

【使い方】

  1. チェックしたい項目のshaderを選択
  2. 対象のメッシュを選択し、「add」でリストに登録(トップ階層でまとめてaddできます。)
  3. 対象のマテリアルを選択し、「add」でリストに登録
    ※デフォルトで登録できるマテリアルのShader typeは「lambert,phong,blinn」になっています。追加する場合はスクリプトの以下部分を編集してください。
  4. 「Render Setup」をクリックすると項目のShaderでマテリアルがオーバーライドされます。
    例)「CHECK_TwoSide」ではポリゴンの裏面が赤く表示されます。
  5. 通常の状態との切り替えは「switch material :True(False)」で行います。
  6. チェックが終わったら「RESET」でデータをきれいにできます。(デバッグ用のマテリアルやrender setupレイヤーが削除されます)

【仕組み解説】

本ツールはMAYAのRender Setup機能を利用しています。
Render Setup機能について以下のサイトにわかりやすくまとめてあります。
https://kiwamiden.com/rendersetup-for-python-part1
今回はShader Overeideでマテリアルを置き換えています。

hlsl(.fx)ファイルについて

置き換えるシェーダーはhlslです。mayaで使用するための.fxファイルは 本ツールパッケージの以下のパスに格納してください。デフォルトでは「CHECK_Normal」と「CHECK_TwoSide」があります。
ChangeMatByRenderSetUp / maya_materials

【プラグインとレンダリング変数について】

起動時にhlsl関連の設定を自動で行うこともできます。

  1. userSetup.pyファイルに以下コードを記述。プラグイン「dx11Shader」を読み込み
import maya.cmds as cmds
def loadPlug(name):
    cmds.evalDeferred("cmds.loadPlugin('"+name+"',qt=True)", lp=False)
    cmds.evalDeferred("cmds.pluginInfo('"+name+"',e=True,autoload=True)", lp=False)
loadPlug("dx11Shader.mll")
  1. batファイルに以下コードを記述。レンダイングエンジンを「dirextX11」に変更
set MAYA_VP2_DEVICE_OVERRIDE=VirtualDeviceDx11

【確認されている不具合】

  1. viewport2.0の透過度のアルゴリズムが「アルファカット」の場合hlslは機能しません。
  2. 鋭角なメッシュのエッジ部分では若干赤い点線が出ます
  3. rendersetupのマテリアルオーバーライドがTrueの時、オーバーライド元のマテリアルを何かしらのメッシュに割り当てるとShadingEngineノードが複製されてしまいます。ノード名が変わるので挙動がおかしくなります。

Discussion