トップページ > 記事閲覧
テクスチャの色を超えた明るさで描画したい
名前:そめ 日時: 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 | 2 |

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です なおコード切り抜いて小型化すると再発しませんでした これでなにかヒントになりますでしょうか
メンテ

Page: 1 | 2 |

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

   クッキー保存