mieki256's diary



2019/04/15(月) [n年前の日記]

#1 [dxruby] DXRuby 1.5.22devで不具合が出る状況が分かった

DXRuby 1.5.22dev で、Shader を使って描画しようとすると何も描画されない状態になる場合があったのだけど。色々試してみたところ、症状が出てしまう記述の仕方がちょっと分かってきた。

状況としては、Shader の描画元として RenderTarget を指定して、かつ、RenderTarget に対して明示的に update() を呼んでしまうと、描画されない状態になる模様。

サンプルソース。 :

例えば、以下のソースで、最後のあたりの rt.update をコメントアウトすると、症状が改善する。

_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 - タイトル画面をグネグネするアレを書いてみたり

以上です。

過去ログ表示

Prev - 2019/04 -
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project