HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2023
1030
buhiogploadしたモデルのUV設定8解決


buhio

リンク

2023/10/30(Mon) 10:51:05|NO.100378

gploadで読み込んだtamane2モデルに対し、UV指定でアニメーションできるかテストしてみましたが、うまくいきませんでした。
何かが違うのかもしれませんが、わかる方がいればご教示頂きたいです。
マニュアルを見ると、gpmatprmtで、マテリアルオプション値が指定できるというように読めたのですが、理解が間違っているかもしれません。

尚、gpmatprmp を使用して、bufferに描画する形であればモデルでも適用されました。
ならいいじゃん、それ使えよというところですが、UVのオフセットで指定できる方がスクリプトが簡単だなということでの質問です。
よろしくお願いいたします。


;HSP ver3.7b7で検証 #include "hgimg4.as" chdir dir_exe+"\\sample\\hgimg4" gpreset setcls CLSMODE_SOLID, $000000 ; 画面クリア設定 ;====テクスチャマテリアル============== gptexmat id_texmat, "res/ball64.png",GPOBJ_MATOPT_UVOFFSET|GPOBJ_MATOPT_UVREPEAT ; テクスチャマテリアル作成 ;==================================== ;gpplate id_model, 10,10,-1, id_texmat ;描画先モデル+テクスチャマテリアルを設定 gpbox id_box,10,-1,id_texmat gpload id_gpload,"res/tamane2" gpnodeinfo id_mat,id_gpload,GPNODEINFO_MATERIAL,"atama" gpmatprmt id_mat,"u_diffuseTexture","res/ball64.png",GPOBJ_MATOPT_UVOFFSET|GPOBJ_MATOPT_UVREPEAT setscale id_gpload,0.05,0.05,0.05 setpos id_gpload,0,0,60 gpbox id_box2,100 ;透過確認用ダミーモデル setpos id_box2,0,0,-200 offsetx = 0.0f ;UVオフセット初期化 offsety = 0.0f timer = 0.0f ;タイマー初期化 repeat redraw 0     ; 描画開始 offsetx = 1f/8*int(timer\8)      ;UVは下から offsety = -1f/8*int(timer/8)-1f/8 //boxモデルにUVセット⇒機能する gpmatprm2 id_box, "u_textureOffset", offsetx , offsety ;UVオフセットのシェーダー設定 gpmatprm2 id_box, "u_textureRepeat", 1.0f/8.0f , 1.0f/8.0f ;UVリピートのシェーダー設定 //tamane2マテリアルにUVセット?機能していない? gpmatprm2 id_mat, "u_textureOffset", offsetx , offsety ;UVオフセットのシェーダー設定 gpmatprm2 id_mat, "u_textureRepeat", 1.0f/8.0f , 1.0f/8.0f ;UVリピートのシェーダー設定 addang id_gpload ,0,0.05,0 ;tamaneモデルを回転 addang id_box ,0,0.05,0 ;ボックスモデルを回転 addang id_box2,0,0.01,0 ;ダミーボックスモデルを回転 gpdraw ;シーンの描画 timer+=0.1f ;タイマー加算 redraw 1 ; 描画終了 await 1000/60 ; 待ち時間 loop



この記事に返信する


usagi

リンク

2023/10/31(Tue) 02:09:37|NO.100387

こんにちわ
おそらくモデル読み込み時にシェーダーコンパイルされ、モデル全体がレンダリングされますので、
モデルの頭のマテリアルにテクスチャのオフセット、リピートがdefineされていないからかと思われます。
※textured.vertを見てみると察しが付くかもしれません。

一例ですがどうぞ

;HSP ver3.7b7で検証 #include "hgimg4.as" chdir dir_exe+"\\sample\\hgimg4" gpreset : setcls CLSMODE_SOLID, $008888 ;====テクスチャマテリアル============== gptexmat id_texmat, "res/ball64.png",GPOBJ_MATOPT_UVOFFSET|GPOBJ_MATOPT_UVREPEAT ; テクスチャマテリアル作成 ;====================================== gpload id_gpload,"res/tamane2" gpnodeinfo id_mat,id_gpload,GPNODEINFO_MATERIAL,"atama" gpmatprmp id_mat,, id_texmat; ★gpmatprmtより読み込んであるならこっちのがシンプル setscale id_gpload,0.3,0.3,0.3 setpos id_gpload,0,-50,0 offsetx = 0.0f : offsety = 0.0f : timer = 0.0f repeat redraw 0 offsetx = 1f/8*int(timer\8) offsety = -1f/8*int(timer/8)-1f/8 ; ★tamane2.materialのheadUVのdefinesにTEXTURE_REPEAT;TEXTURE_OFFSETを追加しておくこと gpmatprm2 id_mat, "u_textureOffset", offsetx , offsety ;UVオフセットのシェーダー設定 gpmatprm2 id_mat, "u_textureRepeat", 1.0f/8.0f , 1.0f/8.0f ;UVリピートのシェーダー設定 gpdraw timer+=0.1f redraw 1 await 1000/60 loop

※tamane2.materialの書き換え箇所

material headUV : textured { u_inverseTransposeWorldViewMatrix = INVERSE_TRANSPOSE_WORLD_VIEW_MATRIX u_matrixPalette = MATRIX_PALETTE sampler u_diffuseTexture { path = res/head_SD.png wrapS = REPEAT wrapT = REPEAT } technique { pass { defines = SKINNING;SKINNING_JOINT_COUNT 12;VERTEX_COLOR;TEXTURE_REPEAT;TEXTURE_OFFSET } } }



buhio

リンク

2023/10/31(Tue) 13:25:17|NO.100389

>usagi師匠(勝手に弟子入り)

 動きました!ありがとうございます!!!
 
 うっすらと見えてきた、、シェーダーの構造が。。。
 ・materialファイル内でユニフォームやdefineが定義されてシェーダーに投げられる。
 ・gameplay3dが定義したmatrixなどもマテリアルファイルでユニフォームに投げられている。
 ・HSPスクリプトで変更する変数は、gpmatprmでシェーダー内のユニフォーム変数へアクセス
 ・シェーダー内の#if defined(TEXTURE_REPEAT)〜というのは、必要な場合のみコンパイルされるもの
 ・つまり独自のシェーダーを組み込んで、あるdefineがある場合のみ動作させることも可能
 ・新たな疑問が湧き出て溺れそう
 上記は、私の私見です。お取り扱いは自己責任で。

 フォグシェーダーで今は、また霧の中ですが、、、



アキアキノヒロロ

リンク

2023/11/1(Wed) 07:26:52|NO.100401

buhioさんの提起している問題とは、直接関係することでなく、申し訳ありませんが。
usagiさんのご説明、buhioさんの理解の仕方、今の私にとても参考になりそうです。

実は、はしけむさんの『デプスシャドウシェーダー』で陰影描画にトライしている者です。
今までのモデルのままでも、地面等にできる影は、描画できました。
しかし、モデル自体にできるはずの陰は、そのままではできませんでした。
なので、materialを書き換えてみて、どうにか再現ができたのですが、その仕組みがよく分からないままです。
はしけむさんのサンプルのmaterialファイルをコピーして適当にいじってごまかしていました。
お二人のやり取りで、materialについての手掛かりがつかめそうです。

無理やり、横はいりした無礼をお許し下さい。



usagi

リンク

2023/11/6(Mon) 12:26:08|NO.100440

>buhioさん
シェーダーとマテリアルに関して、
おっしゃられている通りかと思います。

感覚的にはモデルのマテリアル差し替えたらシェーダー切り替わって欲しいですが、
読み込んだモデルの一部(頭)差し替えだったので、
モデル自体のマテリアル設定に依存していたのかもしれません。
(hspの仕様なのか不具合なのかはソース追わないと分からないです)


>アキアキノヒロロさん
ご無沙汰しております。
アキアキノヒロロさんが提示する課題、問題はいつも
興味深い内容だったので、考えるのが楽しかったです。

>デプスシャドウシェーダー
使われている物を私は存じ上げないので、中身が分からないですが。
マテリアルはあくまで材質の設定情報ですよ。

それをどう描画するかはシェーダーに委ねられます。
以前、ライトの説明か何かでレンダリングパイプラインの
固定シェーダーについて説明をしたかもしれませんが、
hgimg4ではシェーダーが書ける様になったので独自の描画を定義できる訳ですね。
おそらく、シェーダー側に定義が追加されているのではないでしょうか?

デプスシャドウやセルフシャドウについては、考え方自体は単純で、
光源から見た距離とカメラからの距離を比較して、
裏側なら暗くするってだけです。

以前youdaiさんが投影テクスチャにチャレンジしていて、
その時簡単なシャドウのサンプル付けたので、
動作だけでも、見てみるとシャドウの概念が分かりやすいかもしれないですね。
https://hsp.tv/play/pforum.php?mode=all&num=99856



buhio

リンク

2023/11/6(Mon) 19:39:26|NO.100442

>usagi師匠

最後のサンプルを拝見しました。まだすべて理解はできていません。

"u_diffuseColor"は、個別に指定可能だが、その他のユニフォーム変数は共有される。
だから、サンプルスクリプトでは、中央のboxにユニフォーム変数を設定するだけで、そのシーン内のオブジェクトが持つユニフォーム変数は一括で変更されている。
という理解で合っているでしょうか?

gploadしたモデルに適用する場合、モデルのマテリアルファイルに"projShader.vert","projShader.frag"を設定する。
さらに、133行目からの部分もモデルに追加してやる必要がある。これでオフスクリーンバッファをモデルのシェーダーに紐づける。
 

    gpmatprmp モデルのノードマテリアルID,"u_projTexture", GPOBJ_ID_SRCFLAG+buf_tex;描画テクスチャ gpmatprmf モデルのノードマテリアルID,"wrap","clamp","u_projTexture" gpmatprmp モデルのノードマテリアルID,"u_depthTexture", GPOBJ_ID_SRCFLAG+buf_proj;深度バッファ  
という理解で合っていますか?

まだテストが不十分で、わからない部分が多いです。行列もまださっぱりわかりません。
元々テクスチャが張られているモデルでも、これで行けるのか?など、疑問は尽きませんが、大変勉強になります。



アキアキノヒロロ

リンク

2023/11/6(Mon) 20:14:21|NO.100443

usagiさん、この私にまでご返事頂き、恐縮です。
「シャドウのサンプル」
私のようなズブの素人でも、感覚的にとても頭に入りやすく、有難いです。

>デプスシャドウシェーダー
>使われている物を私は存じ上げないので、中身が分からないですが。
 はしけむさんの『デプスシャドウシェーダー』「GitHub」公開
  shadowShaderDemoProject
  https://github.com/hashikemu/shadowShaderDemoProject
です。

buhioさん、再びの横はいり申し訳ありませんでした。



usagi

リンク

2023/11/6(Mon) 21:39:53|NO.100444

>buhioさん

おそらくですが、hgimg4では"u_diffuseColor"など標準である物はモデル毎、
自分で拡張したuniformはマテリアル単位になっているのかと考えてます。
※こちらもソース追いかけないと正しい事は分からないですが、そんな気がします。

描画を一気にするのではなく、ひとつづつパラメーターを書き換えながら描画すれば
マテリアル共有してても大丈夫でしたが、速度や手間を考えるとマテリアル複製した方が簡単かもです。


>gploadしたモデルに適用する場合
理解はあってますが、すみません。
サンプルを単純化する為、全ての描画を独自にしてしまってるので、
hspデフォルトに準拠した形で呼び出せる形にはしてなっていないです。
ですから、スキングやライティング等適応されないので、
少々書き換える必要があります。
説明が足りずすみませんが、概念の解説用で使える物では無いです。


>行列も
行列はちょっと難しいですよね。。。
3Dの基本ではあるのですが、ライブラリ使っていると表面から見えないので理解が大変かもしれません。
d3mみたいなものを自前で作ってみると分かると思います。
今回の例だとテクスチャをプロジェクションマッピングする為に使いました。


>元々テクスチャが張られているモデル
デフォだと、u_diffuseTextureが使われているので、それを書き換えてしまうとダメです。
例えば、モデルに対して弾痕やデカールの様な物を重ねて貼りたければ、新たに
sampler2D u_decalTexture
の様な形で自前の物をシェーダーに定義してそれを書き換える形になります。

難しい事をしなければ頂点シェーダーはそのままで良いですが、
フラグメントシェーダーで合成する必要があります。
※ライトマップやバンプマップもテクスチャなのでそれを見ると察しがつくかもしれません。



usagi

リンク

2023/11/6(Mon) 22:07:50|NO.100445

>アキアキノヒロロさん
おぉ、大分気合の入ったデモプロジェクトですね。
読むのに時間かかってしまうので、ぱっと見で申し訳ございませんが、

or_stdと言うシェーダーをマテリアルに指定すればよろしいかと思いました。
hgimg4デフォのtexturedに変わる物として用意されている印象です。
(たぶん、オリジナルのスタンダードシェーダーという意味かと)

ライトの色で判定してシャドウマップ一回バッファに書き込み、
その後、カメラ位置からのレンダリングに合成するように見えました。



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.100378への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

ONION software Copyright 1997-2023(c) All rights reserved.