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


HSPTV!掲示板


未解決 解決 停止 削除要請

2023
0130
buhiohgimg4 シェーダーテストサンプル 「波」6解決


buhio

リンク

2023/1/30(Mon) 18:44:29|NO.99040

;シェーダーとは何ぞやと、悩んできましたが、とりあえず思った通りに動いてくれたサンプルです。
;1枚の格子状のgpbファイルに波のテクスチャを張って、時間経過でうねうね動くサンプルです。
;自分のメモ用ですが、誰かのお役に立てば幸いです。
;色々な方のサイトを参考にさせていただきました。理解が不十分な部分もあるかと思いますが、ご容赦くださいませ。

;バーテックスシェーダー(頂点シェーダー)⇒頂点の数だけ実行される(今回は頂点シェーダーのみ改変textured.vert→textured_wave.vert)
;フラグメントシェーダー(ピクセルシェーダー)⇒ピクセルの数だけ実行される(今回は改変なしのtextured.frag)
;モデルのmaterialファイルのシェーダー指定をtexutured_wave.vertに書き換える必要があります。

;頂点シェーダーに[u_time]というfloat型の変数をUniform変数を宣言する。Uniformは、各頂点に共通のパラメータを送るもの
;main関数にて、x座標とu_timeの値でsin関数を使って各頂点のy座標を上書き→波のように動く

;Attributeは、座標など頂点ごとのパラメータを渡すもの
;varyingは、フラグメントシェーダーへの橋渡しをするもの

;サンプルデータ
;https://sites.google.com/view/buhio/
;HSP3.7b4にて動作確認→3.6では動きません(GPNODEINFO_MATERIAL)を使うためです。

;HSP3.7b4にて動作確認
#include "hgimg4.as" ;hgimg4

screen 0,640,480
setcls CLSMODE_SOLID, $000000 ; 画面クリア設定

gpreset

camera_fov=45:camera_aspect=1.5f:camera_near=0.5f:camera_far=768*10:camera_sw=0
gpcamera id_camera, camera_fov, camera_aspect, camera_near, camera_far,camera_sw ; カメラとして設定する
gpusecamera id_camera ; 使用するカメラを選択する
setpos id_camera,0,50,600
gplookat id_camera,0,0,0

gpload id_model,"res/wave.gpb"//格子に波のテクスチャを張ったモデルを読込
setscale id_model,5,5,5

gpnodeinfo id_mat,id_model, GPNODEINFO_MATERIAL,"obj1"//モデルのメッシュに対応するマテリアル

_time=0.0f
//--------------------------------------------------
*main

redraw 0

gpmatprm1 id_mat,"u_time",_time/2000

_time++

gpdraw ; 3D描画更新

redraw 1
await 1000/60
goto *main


;//////////////////////////ここからシェーダー
;textured.vertを改変→textured_wave.vertに名前変更

///////////////////////////////////////////////////////////
// Uniforms
uniform mat4 u_worldViewProjectionMatrix;
uniform float u_time;→→→→→→→→→→→→→→→追加項目

・・・省略

void main()
{
vec4 position = getPosition();
position[1] += sin(position[0] + u_time* 100);→→→→→→→→→→→→→→→追加項目
gl_Position = u_worldViewProjectionMatrix * position;

・・・省略



この記事に返信する


buhio

リンク

2023/1/30(Mon) 18:48:49|NO.99041

あぁ、、、シェーダーのコメントは「//」ですね、、

;//→→→→→→→→→→→→→→→追加項目

//追加してください。



buhio

リンク

2023/1/30(Mon) 22:11:44|NO.99047

追記、当然なんでしょうが、頂点シェーダーによってモデルの形状が変わっても、
画面表示のみで、実際(という表現が正しいかわかりませんが)の頂点は変わっていないので、
物理設定をしても、波ではなく平面として当たり判定がなされます。

このあたりのシェーダーというものの意味と、レンダリングパイプラインという意味がようやく
なんとなく理解できたかなと。シェーダーすごいな〜。昨今ゲームのビルの破壊とかもシェーダーで表現されてるんだろうか?

素人には難しすぎます。。



youdai

リンク

2023/2/1(Wed) 17:06:36|NO.99057

shadertest.zipの旧バージョンを動作させました。

>→→→→→→→→→→→→→→→追加項目

シェーダーの上記の部分をコメントアウトすると正常に動作しました。

●波のモデルの形状についての質問

この波打っているモデルの変形する前の形状について質問があります。
もしかして、この形状は格子状の平面を変化させているのではなく、最初から波打っている凹凸のある形状なのでしょうか?
それを頂点シェーダーでsin関数でpositionの変形をさせているのかなぁというようにシェーダーからは読めました。
自分も去年、未公開ですが、頂点位置が変化する波シェーダーを作ったのですが、自分とは違うやり方が見れて、なるほどなぁと思いました。

●HGIMG4のシェーダーファイルのエンコードはShift-JISの方がいいかも
shadertest.zipのシェーダーファイルの文字列のエンコードがUTF-8でしたが、これはHGIMG4の仕様に合わせて、Shift-JISの方がいいかもしれません。
場合によっては、HGIMG4側で文字列関係のエラーが起きる可能性があります。



buhio

リンク

2023/2/1(Wed) 20:08:25|NO.99060

youdaiさん

●元々のモデルは、平面フラットな格子状のモデルです。波のテクスチャを張った板状モデルです。
 sin関数だけですが、動いたからまぁいいやぐらいしか考えていません。
 これを応用すれば、風になびく旗が作れるんだよと書いてるサイトもありましたが、そこまではできてません。

●エンコードについて指摘ありがとうございます。
おっしゃる通りで、保存時にShift-JISを選択し忘れたかもしれません。


あの、ガラス猿も、シェーダーですよね?ピクセルシェーダーだけであそこまでできるというのは、すごい話です。
コメントありがとうございました。 



youdai

リンク

2023/2/2(Thu) 10:34:27|NO.99061

返信ありがとうございます。

>元々のモデルは、平面フラットな格子状のモデルです。波のテクスチャを張った板状モデルです。
フラットから変形させる方法であれば、自分も同じやり方ですね。スクリプトからは違ったやり方に感じたので、不思議な感じです。
機会があれば、自分の波シェーダー作品も動画にして公開したいと思います。

>あの、ガラス猿も、シェーダーですよね?ピクセルシェーダーだけであそこまでできるというのは、すごい話です。
あれは遅延シェーディングという技術を使っていて、一旦描画したものを元画像にして、それをフラグメントシェーダー(ピクセルシェーダー)で変形させるという手法で作っています。
実はHSPプログラムコンテスト版の最初のあれを研究実装するのに一年がかりでした。(^^;)

あと、ホームページ見ました。カッコイイデザインですね!
ただ、この掲示板のHPのリンクが:が足りなくてリンクされていないので、httpsの:は書いた方がいいと思います。



buhio

リンク

2023/2/2(Thu) 13:14:59|NO.99062

>あれは遅延シェーディングという技術を使っていて、一旦描画したものを元画像にして、それをフラグメントシェーダー(ピクセルシェーダー)で変形させるという手法で作っています。
実はHSPプログラムコンテスト版の最初のあれを研究実装するのに一年がかりでした。(^^;)

今の私には、理解できません。。。また勉強させてください。

HPのリンク切れ、、、お恥ずかしいかぎり、、、ありがとうございます🐽
これでいけるのかな

追記:GoogleサイトでHPを作りました。無料やん!!やった!と思いましたが、FTPでアップロードできないようで、
HSP DishでWebGLを動かすのは難しいのかもしれません。別スレ立てようかな、、(以上プチ情報です)



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