トップページ > 記事閲覧
テクスチャの色を超えた明るさで描画したい
名前:そめ 日時: 2021/05/09 20:26

お世話になっております Android/Windowsで3Dベースで開発を行っています パワーアップ状態(や色違い)などを表現するため表題を実現したいです 仮にGを+0.5fした状態で描画したいとします 例えばDrawGraphで実現する場合は  1.一時スクリーンにテクスチャを複写→  2.真緑のBoxをα128で加算半透明描画し→  3.その一時スクリーンを使ってバックスクリーンに描画 という手段が考えられます(Fill3倍) 3DオブジェクトをDrawModelで実現する場合も恐らく同様でしょうか パーティクルに対してもこれをやりたいのですがこいつがネックになりそうです DrawPrimitive3D を使って大量の粒子をワンコールで描画する機能を実装しようと思っているのですが 粒子ごとに1.のテクスチャ複写をするとワンコール描画ができなくなってしまいます (実際にFont描画は上記のやり方でDrawPrimitive2Dでまとめて描画していますが元のテクスチャが白いので別段問題はありません) Windowsならピクセルシェーダーで実現できるのですがAndroidが引っかかっています 法線を無視してスペキュラを任意強度で発現させるようなことができれば解決できそうですが何かやりようはないでしょうか (エミッシブだとテクスチャの黒部分が明るくなりません) もしくは↓このような関数があると非常に助かります void SetAdditionalColor( COLOR_U8 addColor );//描画時にaddColorを加算して描画する void SetSpecularForceAdd( BOOL forceAdd )//VERTEX3Dメンバspcをライティングや法線を無視して加算する機能にスイッチする ご検討よろしくお願いいたします
メンテ

Page: 1 |

Re: テクスチャの色を超えた明るさで描画したい ( No.1 )
名前:管理人 日時:2021/05/12 01:07

> もしくは↓このような関数があると非常に助かります > void SetAdditionalColor( COLOR_U8 addColor );//描画時にaddColorを加算して描画する > void SetSpecularForceAdd( BOOL forceAdd )//VERTEX3Dメンバspcをライティングや法線を無視して加算する機能にスイッチする SetAdditionalColor は機能として追加しても問題が無さそうですが、SetSpecularForceAdd は 用途が特殊過ぎて( 且つシェーダーが増えて exeファイルの容量が増えてしまうので )ちょっと追加は難しいです 非公開のブレンドモードに以下のものがあります // αブレンドの描画元の輝度を最大4倍にできるモード DX_BLENDMODE_ALPHA_X4 // 加算ブレンドの描画元の輝度を最大4倍にできるモード DX_BLENDMODE_ADD_X4 こちらを以下のように SetDrawBlendMode で SetDrawBlendMode( DX_BLENDMODE_ADD_X4, 255 ); 使用した状態で描画するとテクスチャの色の値に4を掛けた明るさで加算描画されます こちらの機能を使用すると『テクスチャの色を超えた明るさで描画』が実現できますが、 それで代用することはできないでしょうか?
メンテ
Re: テクスチャの色を超えた明るさで描画したい ( No.2 )
名前:そめ 日時:2021/05/12 12:43

>SetAdditionalColor は機能として追加しても問題が無さそうですが 追加していただけると非常に助かります お願いしてもよろしいでしょうか? >テクスチャの色の値に4を掛けた明るさで加算描画されます 非常に魅力的ですが黒に干渉できないため色変えの用途としては難しいです いまテストしているのですが DrawPrimitive3Dにおいて法線の向きによらずspcが加算されるという状態に成功してしまいました (SetUseLighting(FALSE);にしても成功しておりなにかしらのバグでしょうか) なのですが、これを単純化するために一部を抜き出すと再現されず困っています これは本来の理屈的に意図的に発現させることは可能でしょうか? (これが意図的に起こせるのであればDrawPrimitive2Dを使用している部分もSetupCamera_Orthoで無理やりDrawPrimitive3Dに置き換え、実現したい効果をすべて解決できそうな気配があります) 下に抜き出したソースを貼りますので見ていただくことは可能でしょうか ※の部分が成功時における不可解な部位となります (テストはwindowsで行っています) よろしくお願いいたします
メンテ
Re: テクスチャの色を超えた明るさで描画したい ( No.3 )
名前:そめ 日時:2021/05/12 12:46

#include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode(TRUE); SetAlwaysRunFlag(TRUE); SetGraphMode( 512, 512 , 32 ) ; SetWindowSize( 512, 512 ) ; int TextureHandle ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) { // エラーが発生したら直ちに終了 return -1 ; } // テクスチャの読み込み TextureHandle = LoadGraph( "Src1.bmp" ) ; bool is_Ortho = false; bool is_Light = true; int time=0; // ESCキーが押されるかウインドウが閉じられるまでループ while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; ClearDrawScreen() ; //入力によって機能切り替え if( CheckHitKey( KEY_INPUT_O ) == 1 ){ is_Ortho = true; } if( CheckHitKey( KEY_INPUT_P ) == 1 ){ is_Ortho = false; } if( CheckHitKey( KEY_INPUT_L ) == 1 ){ is_Light = true; } if( CheckHitKey( KEY_INPUT_K ) == 1 ){ is_Light = false; } // カメラ if(is_Ortho){ SetupCamera_Ortho( 2000.0f ) ; }else{ SetupCamera_Perspective( 60.f * DX_PI_F / 180.0f ) ; } SetCameraPositionAndAngle( VGet( 0.0f, 0.f, -8.0f), 0.f, 0.f, 0.f ) ; // ライティング関係 SetUseLighting(is_Light);//※1これをFALSEにしても加算色が実現できた ChangeLightTypeDir( VGet( 0.f, 0.f, 1.f ) ) ;//※2これを全て0にしても加算色が実現できた VERTEX3D v[6]; //三角形2つ分 //VERTEX3D v[6];を作る { VERTEX3D q[4]; //4隅の頂点 int texw = 256; int texh = 256; float x_=0.f, y_=0.f, z_=500.f; float size=256; //四点共通要素の初期化 for(int i=0; i<4; i++){ q[i].dif=GetColorU8(255,255,255,255); q[i].norm.x=0.f;q[i].norm.y=0.f;q[i].norm.z=-1.f;//法線はこちら向き //※3ここを全て0にしても加算色が実現できた q[i].spc=GetColorU8(0,255,255,0);//加算したい色に青緑を指定 } //[0][2] //[1][3] の順で四角形を形成 { int i=0; q[i].pos.x = x_ - size*0.5f; q[i].pos.y = y_ + size*0.5f; q[i].pos.z = z_ + 0.f; q[i].u = 0.f; q[i].v = 0.f; i++; q[i].pos.x = x_ - size*0.5f; q[i].pos.y = y_ - size*0.5f; q[i].pos.z = z_ + 0.f; q[i].u = 0.f; q[i].v = 1.f; i++; q[i].pos.x = x_ + size*0.5f; q[i].pos.y = y_ + size*0.5f; q[i].pos.z = z_ + 0.f; q[i].u = 1.f; q[i].v = 0.f; i++; q[i].pos.x = x_ + size*0.5f; q[i].pos.y = y_ - size*0.5f; q[i].pos.z = z_ + 0.f; q[i].u = 1.f; q[i].v = 1.f; i++; } //四隅の頂点から三角形を2つつくる { //1つ目の三角形 v[0] = q[0]; v[1] = q[1]; v[2] = q[2]; //2つ目の三角形 v[3] = q[1]; v[4] = q[3]; v[5] = q[2]; } } //プリミティブ描画 DrawPrimitive3D(v, 6, DX_PRIMTYPE_TRIANGLELIST, TextureHandle, TRUE); DrawFormatString(0,0,0xffffffff,"%s %d",is_Ortho?"SetupCamera_Ortho":"SetupCamera_Perspective", time); time++; ScreenFlip() ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; }
メンテ
Re: テクスチャの色を超えた明るさで描画したい ( No.4 )
名前:管理人 日時:2021/05/13 02:05

> >SetAdditionalColor は機能として追加しても問題が無さそうですが >  > 追加していただけると非常に助かります > お願いしてもよろしいでしょうか? すみません、ライティングがOFFの場合はスペキュラカラーが無条件で加算される、という仕様で良いのでしたら ライティングがOFFの場合の動作仕様をそのようにしてしまうのが一番変更が少ないことに気付きました 『ライティングがOFFの場合はスペキュラカラーが最終出力の色に単純に加算される』という仕様への変更で そめさんのご希望する処理は実現できますでしょうか? > いまテストしているのですが > DrawPrimitive3Dにおいて法線の向きによらずspcが加算されるという状態に成功してしまいました > (SetUseLighting(FALSE);にしても成功しておりなにかしらのバグでしょうか) ライトがOFF( SetUseLighting(FALSE); )の場合はスペキュラカラーを無視するように なっているので、バグだと思います ただ、ライトがOFFの場合はコードを確認する限りはどう考えてもスペキュラカラーを 加算する処理に行かないので、謎です 法線の向きに関係なくスペキュラカラーが加算される、という現象についてもバグだと思いますが、 こちらも同様にそのような処理になることは無いはずなので、謎です 可能でしたら現象の再現が確認できるプログラムをご提供いただけないでしょうか? m(_ _;m
メンテ
Re: テクスチャの色を超えた明るさで描画したい ( No.5 )
名前:そめ 日時:2021/05/13 11:16

ひとまず2D描画でDrawPrimitive2Dを使ってる部分をDrawPrimitive3Dに変換することが出来ました (縦横比の辻褄合わせに苦戦しました) >『ライティングがOFFの場合はスペキュラカラーが最終出力の色に単純に加算される』という仕様への変更で >そめさんのご希望する処理は実現できますでしょうか? この場合MV1DrawModelなどのモデル描画に対しても効果をコントロールできますか? であればほぼ実現できます 色加算を制御できるようになりたい関数と状況まとめますと、 DrawPrimitive3D →上記対応していただけるとして DrawPrimitive2D →DrawPrimitive3Dへ置き換える(完了) DrawGraphなどの2D描画 →DrawPrimitive3Dへ置き換える MV1DrawModel →上記次第 という状況です SetAdditionalColorがあればこれ以外にも適用範囲が広がるので単純に助かります >可能でしたら現象の再現が確認できるプログラムをご提供いただけないでしょうか? m(_ _;m 了解しました 複雑化しているゲームのソースから再現を抜き出そうとして失敗したのが先程貼り付けたソースとなっているのですが、もう少し粘ってみます
メンテ
Re: テクスチャの色を超えた明るさで描画したい ( No.6 )
名前:そめ 日時:2021/05/13 12:43

少し条件がしぼれました DrawPrimitive3Dのコール前に switch(l) { case 0: break; case 1: SetUseLighting(TRUE); SetUseLighting(FALSE); break; case 2: SetUseLighting(FALSE); SetUseLighting(TRUE); break; case 3: SetUseLighting(TRUE); break; case 4: SetUseLighting(FALSE); break; } これの1と4の場合にspc加算が行われます プログラムからここ以外のSetUseLightingを除去してあり ChangeLightTypeDir SetLightSpcColor MV1から始まる関数 もすべて除去ずみ 頂点のメンバnormは全て0です なおコード切り抜いて小型化すると再発しませんでした これでなにかヒントになりますでしょうか
メンテ
Re: テクスチャの色を超えた明るさで描画したい ( No.7 )
名前:そめ 日時:2021/05/13 13:18

わかりました SetUseDirect3DVersion( DX_DIRECT3D_9EX ); でライティングオフの状態がspc加算に該当するみたいです
メンテ
Re: テクスチャの色を超えた明るさで描画したい ( No.8 )
名前:管理人 日時:2021/05/14 02:12

> この場合MV1DrawModelなどのモデル描画に対しても効果をコントロールできますか? モデルの描画は使用するシェーダーが異なるので、また別の話となります ライティング無しの場合はマテリアルのスペキュラカラーを単純加算する、という仕様に 変更すれば、マテリアルのスペキュラカラーを MV1SetMaterialSpcColor で変更して ライティング無しで描画すればコントロールできるということになりますが… > わかりました >  > SetUseDirect3DVersion( DX_DIRECT3D_9EX ); >  > でライティングオフの状態がspc加算に該当するみたいです ご情報ありがとうございます なるほど、Direct3D 9 の場合にそのような挙動になるということだったのですね… 調べてみた所、Direct3D 9 でライティングがOFFの場合にスペキュラカラーが出力カラーに単純加算 されるというのは Direct3D 9 の仕様のようなので、バグではなくそれが仕様ということのようです なので、とりあえず Direct3D 11 でも DrawPrimitive3D ではライティングOFFの場合は スペキュラカラーが出力カラーに単純加算されるように処理を変更してみました よろしければその変更を加えたこちらのバージョンをお試しください m(_ _)m ( とりあえず Windows版のみ作成しました ) https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 > SetAdditionalColorがあればこれ以外にも適用範囲が広がるので単純に助かります 了解です、実装してみます ただ、現在ちょっと作業時間が殆ど確保できない状態なので、少し日数をいただくかもしれません… m(_ _;m
メンテ
Re: テクスチャの色を超えた明るさで描画したい ( No.9 )
名前:そめ 日時:2021/05/14 03:35

対応ありがとうございます ひとまずダウンロードしました >モデルの描画は使用するシェーダーが異なるので、また別の話となります >ライティング無しの場合はマテリアルのスペキュラカラーを単純加算する、という仕様に >変更すれば、マテリアルのスペキュラカラーを MV1SetMaterialSpcColor で変更して >ライティング無しで描画すればコントロールできるということになりますが… 了解です これで全て解決しそうです 助かります >( とりあえず Windows版のみ作成しました ) ありがとうございます Android版もお待ちしております >ただ、現在ちょっと作業時間が殆ど確保できない状態なので、少し日数をいただくかもしれません… m(_ _;m ありがとうございます お待ちしております
メンテ
Re: テクスチャの色を超えた明るさで描画したい ( No.10 )
名前:管理人 日時:2021/05/15 01:55

> >ライティング無しの場合はマテリアルのスペキュラカラーを単純加算する、という仕様に > >変更すれば、マテリアルのスペキュラカラーを MV1SetMaterialSpcColor で変更して > >ライティング無しで描画すればコントロールできるということになりますが… >  > 了解です > これで全て解決しそうです > 助かります すみません、てっきり『それでは解決しない』というご返答を頂くことになると思っていました (・・; 確認なのですが、ライティングが無くなるとモデルの陰( 影ではなく陰 )がなくなり平らでノッペリとした 見た目になりますが、その状態でスペキュラカラーが加算されれば問題ないのでしょうか?
メンテ
Re: テクスチャの色を超えた明るさで描画したい ( No.11 )
名前:そめ 日時:2021/05/15 06:00

なるほど、、、 早とちりしてたのですが SetDrawBrightは全ての描画に干渉するだろうと思っていました ライティングの有無によらずMV1DrawModelには影響していないのですね 似たようなSetAdditionalColorも同様に影響される機能になると思っていました ですが、3Dモデルの色加算はテクスチャに直接書き込む方式で行くか、 強調を表現する場合はライティング角度などで工夫しようと思います >その状態でスペキュラカラーが加算されれば問題ないのでしょうか? ですので、問題ないです よろしくお願いします また関数名は周りのものと適宜合わせていただいて構いません よろしくお願いいたします
メンテ
Re: テクスチャの色を超えた明るさで描画したい ( No.12 )
名前:管理人 日時:2021/05/17 01:43

> >その状態でスペキュラカラーが加算されれば問題ないのでしょうか? > ですので、問題ないです > よろしくお願いします > また関数名は周りのものと適宜合わせていただいて構いません 了解です では『SetAdditionalColor 関数の追加』と 『ライティング無しの状態での MV1DrawModel ではマテリアルのスペキュラカラーを単純加算するように仕様を変更』を行います ただ、ちょっと5/24まで作業時間が全く確保できそうにないので、対応は一週間以上先となります、すみません m(_ _;m
メンテ
Re: テクスチャの色を超えた明るさで描画したい ( No.13 )
名前:そめ 日時:2021/05/17 16:56

かしこまりました お待ちしております もし段階的にご提供いただける流れになりそうであれば 『android版のDrawPrimitive3Dのライティング無し時のspc加算』を優先していただけると助かります ご検討よろしくお願いします それではよろしくお願いいたします
メンテ
Re: テクスチャの色を超えた明るさで描画したい ( No.14 )
名前:管理人 日時:2021/05/20 03:21

ご返信が遅くなり申し訳ありません > もし段階的にご提供いただける流れになりそうであれば > 『android版のDrawPrimitive3Dのライティング無し時のspc加算』を優先していただけると助かります > ご検討よろしくお願いします 了解しました ただ、ちょっとした作業をする時間も確保できない状態となってしまいましたので、 大変申し訳ありませんが対応は 5月24日以降となります m(_ _;m
メンテ
Re: テクスチャの色を超えた明るさで描画したい ( No.15 )
名前:管理人 日時:2021/06/04 02:08

大変お待たせしました 『android版のDrawPrimitive3Dのライティング無し時のspc加算』を実装したバージョンになります https://dxlib.xsrv.jp/temp/DxLibAndroidTest.zip // Android版 『SetAdditionalColor 関数の追加』と 『ライティング無しの状態での MV1DrawModel ではマテリアルのスペキュラカラーを単純加算するように仕様を変更』 についてはもう暫くお待ち下さい m(_ _;m # < 他スレッドの方へ > # 現在作業時間が非常に少なくなっています # 投稿の順番でご返信しますので今暫くお待ち下さい m(_ _)m
メンテ
Re: テクスチャの色を超えた明るさで描画したい ( No.16 )
名前:そめ 日時:2021/06/04 15:46

お世話になっております お忙しい中対応ありがとうございます!
メンテ
Re: テクスチャの色を超えた明るさで描画したい ( No.17 )
名前:そめ 日時:2021/06/05 06:31

動作確認できましたのでご報告です 対応ありがとうございます >『SetAdditionalColor 関数の追加』と >『ライティング無しの状態での MV1DrawModel ではマテリアルのスペキュラカラーを単純加算するように仕様を変更』 >についてはもう暫くお待ち下さい m(_ _;m こちらも気長にお待ちしております よろしくお願いいたします
メンテ

Page: 1 |

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

   クッキー保存