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


HSPTV!掲示板


未解決 解決 停止 削除要請

2025
0531
莉琉HGIMG4 GLSLを使った特定色の置き換えについて5解決


莉琉

リンク

2025/5/31(Sat) 03:05:33|NO.103505

HGIMG4を使い格闘ゲームを製作しています。
2Pカラー等のキャラクターの色違いを表示させる為に現状色の違うPNGをそのまま用意していましたが、
容量節約の為GLSLを用い色変えをしようとしました、が、うまくいきません。

https://1drv.ms/u/c/fca890c0cc61310c/EfFHrnmYtnZKlQGfZHn0Jp8BxYdZWZ3UQ-JtGaIjCtn3ow?e=gO2mXD
(上記ファイルをダウンロードしてください)


■irokae.frag

#if defined(OPENGL_ES) || defined(GL_ES) #ifdef GL_FRAGMENT_PRECISION_HIGH precision highp float; #else precision mediump float; #endif #endif /////////////////////////////////////////////////////////// // Uniforms uniform sampler2D u_diffuseTexture; /////////////////////////////////////////////////////////// // Varyings varying vec2 v_texCoord; varying vec4 v_color; void main() { vec4 texColor = texture2D(u_diffuseTexture, v_texCoord); // 色置換リスト vec3 targetColor1 = vec3(0.561, 0.584, 0.984); // R143, G149, B251 vec3 replaceColor1 = vec3(0.980, 0.557, 0.557); // R250, G142, B142 vec3 targetColor2 = vec3(0.388, 0.306, 0.569); // R 99, G 78, B152 vec3 replaceColor2 = vec3(0.600, 0.306, 0.306); // R153, G 78, B 78 // 置換処理(ちょい誤差含め変更) if (distance(texColor.rgb, targetColor1) < 0.01) { texColor.rgb = replaceColor1; } else if (distance(texColor.rgb, targetColor2) < 0.01) { texColor.rgb = replaceColor2; } gl_FragColor = v_color * texColor; }

■本体

#include "hgimg4.as" gpreset screen 0, 600, 600 GameTime = 0.0 celload "mei.png",1 ;色変え前の画像 gpusershader "res/shaders/sprite.vert", "irokae.frag", "" ;色変えシェーダー設定 gsel 1 ;※BufferでXYのサイズ取得用 buffer 2,ginfo_winx,ginfo_winy,screen_offscreen + screen_usergcopy ;色変え用Buffer設定(screen_usergcopy突っ込むと映らなくなる) celput 1 ;元の画像をコピー celdiv 2,0,0,ginfo_winx/2,ginfo_winy/2 ;画像分割&中心点設定 buffer 1,1,1,0 ;元の画像はいらんので破棄 repeat gsel 0 redraw 0 color 128,128,128 boxf GameTime++ X座標 = 300.0 Y座標 = 300.0 gmode 4,,,255 pos X座標, Y座標 celput 2, 0 , 1.0-0.5*cos( GameTime* M_PI / 180.0 ) ,1.0-0.5*cos( GameTime* M_PI / 180.0 ),GameTime* M_PI / 180.0 redraw 1 await 16 loop



①色変え前の画像をbuffer1に読込
②カスタムシェーダーを設定してbuffer2を作成(オフスクリーン、カスタムシェーダー適応)
③buffer2にbuffer1の画像をコピー、celdivで分割&中心点設定
④いらないbuffer1の元画像削除(極小の画面で初期化)

上記の物をやっているのですが、②の段階でカスタムシェーダーを適応してbufferを作成すると、
画面上に何も映らなくなります。
シェーダーのパス設定が悪いのかなと思い"res/shaders/irokae.frag"としても、うまくいきませんでした。
flagファイルが悪いのかなと思ったのですが、別の物を使用してもうまくいきませんでした。
そもそもの①~④の手順が悪いと思うのですが、なかなか2Dのカスタムシェーダーの記述の資料が見つからない為、挫折しています。
知識のある方はご教授いただければ幸いです。

(実際のファイルは10行目の「+ screen_usergcopy」の部分がコメントアウトされており、色変え前の画像が表示されるようになっています。)



この記事に返信する


buhio

リンク

2025/5/31(Sat) 16:17:19|NO.103508

こんちわ。
ご希望のものかどうかわかりませんが、一応当方で動いたものを貼ります。


#include "hgimg4.as" gpreset screen 0, 600, 600 celload "mei.png",1 ;色変え前の画像 gpusershader "sprite.vert", "irokae.frag", "" ;色変えシェーダー設定(sprite.vertも同じフォルダにコピーした) buffer 2,443,556,screen_offscreen + screen_usergcopy ;テクスチャサイズに合わせた gpgetmat var,2,GPGETMAT_OPT_SCRMAT ;バッファ2のマテリアル取得 gpmatprmp var,"u_diffuseTexture",GPOBJ_ID_SRCFLAG+1 ;u_diffsseTextureにバッファ1を指定→色変えシェーダー適用 repeat gsel 0 redraw 0 color 128,128,128 boxf gmode 4,,,255 pos 0 ,0 celput 1,0,0.5,0.5 pos 0,200 celput 2,0,0.5,0.5 redraw 1 await 16 loop



莉琉

リンク

2025/5/31(Sat) 16:53:49|NO.103509

ご回答ありがとうございます。

同じフォルダ内に「sprite.frag」を置き、頂いた記述をコピーしたのですが、
gpmatprmpの所で「エラー3:パラメータの値が異常です」の表示が出てしまいます。
また、自分の環境だとその時点で変数Varに-1が代入されていますが、これはうまく処理できていないのでしょうか?
HSPのバージョンは、最新版のHSP3.7β10を使用しています。



莉琉

リンク

2025/5/31(Sat) 16:58:01|NO.103510

あっ、すみません
「sprite.frag」ではなく、「sprite.vert」でしたね。
動作いたしました!ありがとうございます!

もう少し挙動を研究してみますが、スレッドは解決にいたします。



buhio

リンク

2025/5/31(Sat) 16:58:50|NO.103511

>>同じフォルダ内に「sprite.frag」を置き

同じフォルダ内に「sprite.vert」です。頂点シェーダーとフラグシェーダーが同じ名前なので、拡張子をチェックしてください。
varが-1は、シェーダーのコンパイルに失敗していると思われます



buhio

リンク

2025/5/31(Sat) 17:00:07|NO.103512

おっと、、かぶっちゃった



記事削除

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

NO.103505への返信

マスコット

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

名前

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

削除用パスワード

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

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

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