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」の部分がコメントアウトされており、色変え前の画像が表示されるようになっています。)