トップページ > 記事閲覧
DrawPrimitive2D()で頂点アルファが効かない
名前:kaz 日時: 2015/01/03 22:31

DrawPrimitive2D()でDX_NONE_GRAPHを指定すると頂点アルファが効かなくなります。 画像を指定するかSetDrawBlendMode()を指定すると頂点アルファが効くようになります。 バグか仕様か分かりませんが一応報告しておきます。 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { SetOutApplicationLogValidFlag(FALSE) ; ChangeWindowMode( TRUE ) ; DxLib_Init(); const int WIDTH = 640; const int HEIGHT = 480; const int BL = 20; //背景 DrawBox( 0 , 0 , WIDTH, HEIGHT, GetColor(129,129,129) , TRUE) ; for (int y=0; y<HEIGHT/BL; y++) { for (int x=0; x<WIDTH/BL; x++) { if ((y%2 == 0) && (x%2 == 0) || (y%2 != 0) && (x%2 != 0)) { DrawBox(x * BL, y * BL, x * BL + BL, y * BL + BL, GetColor(96,96,96) , TRUE); } } } int alpha = 100; VERTEX2D p[4] = { {{0, 0, 0}, 1.0f, GetColorU8(255, 0, 0, 255), 0.0f, 0.0f}, {{0, 0, 0}, 1.0f, GetColorU8(255, 0, 0, alpha), 0.0f, 0.0f}, {{0, 0, 0}, 1.0f, GetColorU8(0, 255, 0, 255), 0.0f, 0.0f}, {{0, 0, 0}, 1.0f, GetColorU8(0, 255, 0, alpha), 0.0f, 0.0f}, }; auto setpos = [&p](int x) { p[0].pos = VGet( x, 100, 0); p[1].pos = VGet( x+200, 100, 0); p[2].pos = VGet( x, 300, 0); p[3].pos = VGet( x+200, 300, 0); } ; setpos(10); //これは頂点アルファが効かない DrawPrimitive2D(p, 4, DX_PRIMTYPE_TRIANGLESTRIP, DX_NONE_GRAPH, TRUE); setpos(220); int SoftImage = MakeARGB8ColorSoftImage(8, 8) ; FillSoftImage( SoftImage, 255, 255, 255, 255) ; int m_hDummyTex = CreateGraphFromSoftImage(SoftImage) ; //画像を指定すると頂点アルファが効く DrawPrimitive2D(p, 4, DX_PRIMTYPE_TRIANGLESTRIP, m_hDummyTex, TRUE); setpos(430); SetDrawBlendMode(DX_BLENDMODE_ALPHA, 255) ; //SetDrawBlendMode()を指定すると頂点アルファが効く DrawPrimitive2D(p, 4, DX_PRIMTYPE_TRIANGLESTRIP, DX_NONE_GRAPH, TRUE); WaitKey() ; DxLib_End() ; return 0 ; }
メンテ

Page: 1 |

Re: DrawPrimitive2D()で頂点アルファが効かない ( No.1 )
名前:管理人 日時:2015/01/06 01:44

微妙なところですが、一応仕様ということで・・・ 載せて頂いたテストプログラムの内、本来は3番目以外はアルファが効かないのが正しい( SetDrawBlendMode( DX_BLENDMODE_NOBLEND ) は アルファブレンドを行わない、という設定なので )のですが、アルファチャンネル付き画像でも SetDrawBlendMode( DX_BLENDMODE_NOBLEND ) ; の 設定ではアルファチャンネルによる透過効果が発生しないというのは若干不親切なので、アルファチャンネルつきの画像で且つ引数の TransFlag が TRUE の場合は、SetDrawBlendMode( DX_BLENDMODE_NOBLEND ) の設定でも内部で SetDrawBlendMode( DX_BLENDMODE_ALPHA ) が実行されるようになっています この条件に2番目の描画が適合しているので、2番目の描画は内部で SetDrawBlendMode( DX_BLENDMODE_ALPHA ) が実行されています そして、グラフィックハンドルが DX_NONE_GRAPH の場合はその条件に適合していないので、本来の仕様通りアルファブレンドが行われない ( 頂点カラーのアルファ値が何であっても透明効果が発生しない )というわけです・・・ お節介な仕様の性で条件が複雑になってしまっていてすみません・・・ m(_ _;m
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存