2019/04/15(月) [n年前の日記]
#1 [dxruby] DXRuby 1.5.22devで不具合が出る状況が分かった
DXRuby 1.5.22dev で、Shader を使って描画しようとすると何も描画されない状態になる場合があったのだけど。色々試してみたところ、症状が出てしまう記述の仕方がちょっと分かってきた。
状況としては、Shader の描画元として RenderTarget を指定して、かつ、RenderTarget に対して明示的に update() を呼んでしまうと、描画されない状態になる模様。
状況としては、Shader の描画元として RenderTarget を指定して、かつ、RenderTarget に対して明示的に update() を呼んでしまうと、描画されない状態になる模様。
◎ サンプルソース。 :
例えば、以下のソースで、最後のあたりの rt.update をコメントアウトすると、症状が改善する。
_02_shader_with_rendertarget.rb
_02_shader_with_rendertarget.rb
# RenderTarget に画像を描画してからshaderに渡す事例 require 'dxruby' hlsl = <<EOS texture tex0; sampler Samp0 = sampler_state { Texture =<tex0>; }; float4 PS(float2 input : TEXCOORD0) : COLOR0 { float4 output; // input.y = input.y / 2.0; output = tex2D( Samp0, input ); return output; } technique HelloShader { pass P0 { PixelShader = compile ps_2_0 PS(); } } EOS core = Shader::Core.new(hlsl) shader = Shader.new(core, "HelloShader") img = Image.new(128, 128) v = 0 img.height.times do |y| img.width.times do |x| img[x, y] = [255, 0, (v>>8) & 0x0ff, v & 0x0ff] v += 2 v = 0 if v > 0x0ffff end end imgs = [img] rt = RenderTarget.new(640, 480) Window.loop do break if Input.keyPush?(K_ESCAPE) rt.draw_tile(0, 0, [[0]], imgs, 0, 0, 3, 2) rt.update x, y = 0, 0 Window.draw_shader(x, y, rt, shader) end
◎ 対策。 :
スクリプトソースを書く側で行える対策としては…。そもそも RenderTarget に対して update() を呼ばないようにする、というのが一番手っ取り早い気がする。
というのも、RenderTarget に対して update() を呼ぶのは昔の書き方で。DXRuby 1.4.1 以降は自動で update() が呼ばれるようになっているので、比較的新しいバージョンの DXRuby を使っているなら、わざわざ update() を呼ぶ必要はないわけで。古いスクリプトに対する互換性のためだけにメソッドが残されてる状態らしい。
_DXRuby RenderTarget#update
ちなみに、DXRuby 1.4.6 では、update() を呼んでも問題は起きない模様。もっとも、最近の DXRuby を使っているなら、そもそも呼ばなくていいのだけれど。
ちなみに、以下のスクリプトも、update を削除したらフツーに描画されました。とメモ。
_mieki256's diary - タイトル画面をグネグネするアレを書いてみたり
というのも、RenderTarget に対して update() を呼ぶのは昔の書き方で。DXRuby 1.4.1 以降は自動で update() が呼ばれるようになっているので、比較的新しいバージョンの DXRuby を使っているなら、わざわざ update() を呼ぶ必要はないわけで。古いスクリプトに対する互換性のためだけにメソッドが残されてる状態らしい。
_DXRuby RenderTarget#update
ちなみに、DXRuby 1.4.6 では、update() を呼んでも問題は起きない模様。もっとも、最近の DXRuby を使っているなら、そもそも呼ばなくていいのだけれど。
ちなみに、以下のスクリプトも、update を削除したらフツーに描画されました。とメモ。
_mieki256's diary - タイトル画面をグネグネするアレを書いてみたり
[ ツッコむ ]
以上、1 日分です。