;シェーダーとは何ぞやと、悩んできましたが、とりあえず思った通りに動いてくれたサンプルです。
;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;
・・・省略