トップページ > 記事閲覧
グラデーションを描画したい
名前:にこよう 日時: 2020/04/05 03:30

こんばんは Dxライブラリでグラデーションを用いた背景を描画したいと思い dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=view&no=4138 こちらのスレッドを参考にさせていただいたのですが、 3角形だけでは表現できないグラデーションの為、思うように描画できませんでした なのでグラデーションに特化した描画関数を追加していただけないでしょうか? 例えばですが描画する範囲を指定するための座標が4つと グラデーションとなるための色のポイントを(描画範囲外を含めて)複数指定できるような関数を想像しております また、LoadSoundMemで取得したサウンドハンドルから元ファイルのパスを取得する関数を実装することは可能でしょうか 現在のDxライブラリではファイルパスは保存しておらず、 余分な処理を付け加える必要がある場合は自身でラッパー関数を作ります
メンテ

Page: 1 | 2 |

Re: グラデーションを描画したい ( No.18 )
名前:kanamaru 日時:2020/04/18 09:58

ソフトウェアイメージを使ったバージョンのプログラムできました。 なんか左右に黒い隙間?が僕の環境でありますが、フルスクリーンでも描画できました。 (フルスクリーンじゃないときは黒い隙間が無いので僕の関数が原因ではないと考えます) フルスクリーンでも問題なく描画できるので、十分な速度は出ていると思います。 DrawSoftImage()は負荷がかかるらしいのでグラフィックハンドルに変換して描画しました。 #include "dxlib.h" int DrawBoxGrad(int x1, int y1, int x2, int y2, int Colorlt, int Colorrt, int Colorlb, int Colorrb, bool AutoColorChange) { int red[4], green[4], blue[4]; int handle, i, j, grhandle; int sx = x2 - x1; int sy = y2 - y1; if (sx < 0) sx *= -1; if (sy < 0) sy *= -1; if (Colorlb == 0) Colorlb = Colorlt; // 四角形の左下の色が指定されていなければ上の色をコピーする if (Colorrb == 0) Colorrb = Colorrt; // 四角形の右下の色が指定されていなければ上の色をコピーする GetColor2(Colorlt, &red[0], &green[0], &blue[0]); GetColor2(Colorrt, &red[1], &green[1], &blue[1]); GetColor2(Colorlb, &red[2], &green[2], &blue[2]); GetColor2(Colorrb, &red[3], &green[3], &blue[3]); /*if (AutoColorChange) { for (int i = 0; i < 4; i++) { int h, l, s; RGBtoHLS(red[i], green[i], blue[i], &h, &l, &s); int color_h = GetColorHLS(h + GetKey(KEY_COUNT), l, s); // 少しづつ色を変化させる GetColor2(color_h, &red[i], &green[i], &blue[i]); } }*/ // 空のフルカラー画像を作成する handle = MakeXRGB8ColorSoftImage(sx, sy); for (i = 0; i < sy; i++) { for (j = 0; j < sx; j++) { // 色をセット int r, g, b; r = (((red[0]*(sx - j) + red[1]*j) / sx * (sy - i) + (red[2]*(sx - j) + red[3]*j) / sx * i)) / sy; g = (((green[0]*(sx - j) + green[1]*j) / sx * (sy - i) + (green[2]*(sx - j) + green[3]*j) / sx * i)) / sy; b = (((blue[0]*(sx - j) + blue[1]*j) / sx * (sy - i) + (blue[2]*(sx - j) + blue[3]*j) / sx * i)) / sy; DrawPixelSoftImage(handle, j, i, r, g, b, 0); } } // グラフィックハンドルを作成 grhandle = CreateGraphFromSoftImage(handle); // 使い終わったら解放 DeleteSoftImage(handle); // グラフィックハンドルを描画 int dx, dy; if (x1 < x2) { dx = x1; } else { dx = x2; } if (y1 < y2) { dy = y1; } else { dy = y2; } DrawGraph(dx, dy, grhandle, TRUE); // グラフィックハンドルの削除 DeleteGraph(grhandle); return 1; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { //ChangeWindowMode(TRUE); // DXライブラリの初期化 if (DxLib_Init() < 0) return -1; int x = 0, y = 0; GetDrawScreenSize(&x, &y); DrawBoxGrad(0,0,x,y,GetColor(255,0,0),GetColor(0,255,0),GetColor(0,0,255),GetColor(255,255,0),0); // キー入力待ち WaitKey(); // DXライブラリの後始末 DxLib_End(); // ソフトの終了 return 0; } 一部どうやら定義していない関数が含まれていたようなので、 コメントアウトして実行して検証しているので、 もしかしたら影響があるかもしれません。
メンテ
Re: グラデーションを描画したい ( No.19 )
名前:にこよう 日時:2020/04/18 10:23

>かめのこにょこにょこさん コードの編集有難うございますm(__)m キッパリ分かれていた斜めの線が無くなって、若干X字にラインが入るようになりました 斜めで分かれていた時よりかは気にならないので、断然よくなりました kanamaruさんに頂いた関数の高速化が難しければこちらの関数を使っていこうと思います 恐らく以下の場所の色の順番が逆だと思われるので、そこだけ修正しましたm(__)m // 右下の頂点の情報をセット vertex[2].pos.x = static_cast<float>(x2); vertex[2].pos.y = static_cast<float>(y2); vertex[2].dif.r = static_cast<BYTE>(red[3]); vertex[2].dif.g = static_cast<BYTE>(green[3]); vertex[2].dif.b = static_cast<BYTE>(blue[3]); // 左下の頂点の情報をセット vertex[3].pos.x = static_cast<float>(x1); vertex[3].pos.y = static_cast<float>(y2); vertex[3].dif.r = static_cast<BYTE>(red[2]); vertex[3].dif.g = static_cast<BYTE>(green[2]); vertex[3].dif.b = static_cast<BYTE>(blue[2]); >kanamaruさん >ソフトウェアイメージを使ったバージョンのプログラムできました。 ありがとうございます 実際に描画してみたのですが、継ぎ目のないきれいなグラデーションでした >なんか左右に黒い隙間?が僕の環境でありますが、フルスクリーンでも描画できました。 >(フルスクリーンじゃないときは黒い隙間が無いので僕の関数が原因ではないと考えます) 私の環境では黒い隙間は見受けられませんでした 仮想フルスクリーンにしてみても特に問題はありませんでした >フルスクリーンでも問題なく描画できるので、十分な速度は出ていると思います。 関数の処理時間を計測してみたのですが 平均35.1ms 最短33.5ms 最長58.8ms と、ゲームのバックで描画するには少々問題のある処理速度でした PCはそれなりのスペックの物を使用しているので、PCの問題ではないかと思います >一部どうやら定義していない関数が含まれていたようなので、 >コメントアウトして実行して検証しているので、 >もしかしたら影響があるかもしれません。 すみません、自身で定義した他の関数を含めてしまいました お察しではあるかと思いますが、徐々に色を変化させるだけのものですので、 コメントアウトしていただいて問題はありません
メンテ
Re: グラデーションを描画したい ( No.20 )
名前:kanamaru 日時:2020/04/18 10:28

十分な速度出てると思ったけど処理が遅かったですか。 一度作ったグラデーションのグラフィックハンドルを保存しておいて繰り返し使えばたぶん早くなると思います。 後は、描画の時毎回別のグラデーションを使うわけでないのならプログラムの最初にグラデーション作成しておくといいかもしれません。 たぶん色の変化は繰り返しだと思いますし。 …なんか僕のプログラミングの悪い癖が出てそうですけど(メモリたくさん使いそうです。)
メンテ
Re: グラデーションを描画したい ( No.21 )
名前:にこよう (解決) 日時:2020/04/18 11:08

>後は、描画の時毎回別のグラデーションを使うわけでないのならプログラムの最初にグラデーション作成しておくといいかもしれません。 >たぶん色の変化は繰り返しだと思いますし。 ループ毎に徐々に変化する分の画像を生成するのにかなり時間がかかってしまうのと、 メモリの消費が激しい為、最初に生成するのは難しそうです ただ、1枚のグラデーションを生成する関数としては使えると思います 今回の関数の解決策としてはかめのこにょこにょこさんの関数を使いたいと思います 色々考えていただいて、ありがとうございました
メンテ
Re: グラデーションを描画したい ( No.22 )
名前:kanamaru 日時:2020/04/18 11:26

解決したスレッドに投稿するのもいいのかわかりませんが、 隠し関数の中に使えそうな関数がありました。 DrawPixelSoftImage_Unsafe_XRGB8という関数で、 DrawPixelSoftImageの代わりに使っても速度は遅いですか?(その場合最後の引数を消す必要があります。) エラーチェックをしない代わりに高速らしいです。
メンテ
Re: グラデーションを描画したい ( No.23 )
名前:にこよう (解決) 日時:2020/04/18 12:14

>解決したスレッドに投稿するのもいいのかわかりませんが、 解決済みでも今回のように何かあれば、教えていただけると嬉しいですm(__)m >DrawPixelSoftImage_Unsafe_XRGB8という関数で、 >DrawPixelSoftImageの代わりに使っても速度は遅いですか?(その場合最後の引数を消す必要があります。) 変更して計測してみたところ、多少早くなったものの、 やはり処理落ちしてしまうようですm(__)m 平均27.7ms 最短25.7ms 最長42.5ms
メンテ
Re: グラデーションを描画したい ( No.24 )
名前:管理人 日時:2020/04/19 05:45

個人的にはかめのこにょこにょこさんの頂点数を増やす方法とkanamaruさんの1ピクセルづつ描画して 正確なグラデーションを描画する方法の間を取ったような方法の『DrawPolygonIndexed2D に渡す頂点数をもっと増やす』が 速度と描画結果のバランスが良いのではないかと思います #define VERT_X 80 #define VERT_Y 45 VERTEX2D vertex[VERT_Y][VERT_X]; unsigned short indices[(VERT_Y - 1)*(VERT_X - 1)*6]; int indices_setup; // Online Sample: nokotan.github.io/WebAssemblyStudio/?f=fdm81i856i9 // グラデーションカラーの四角形を描画する int DrawBoxGrad(int x1, int y1, int x2, int y2, int Colorlt, int Colorrt, int Colorlb, int Colorrb, bool AutoColorChange) { int red[4], green[4], blue[4]; if (Colorlb == 0) Colorlb = Colorlt; // 四角形の左下の色が指定されていなければ上の色をコピーする if (Colorrb == 0) Colorrb = Colorrt; // 四角形の右下の色が指定されていなければ上の色をコピーする GetColor2(Colorlt, &red[0], &green[0], &blue[0]); GetColor2(Colorrt, &red[1], &green[1], &blue[1]); GetColor2(Colorlb, &red[2], &green[2], &blue[2]); GetColor2(Colorrb, &red[3], &green[3], &blue[3]); // if (AutoColorChange) // { // for (int i = 0; i < 4; i++) // { // int h, l, s; // RGBtoHLS(red[i], green[i], blue[i], &h, &l, &s); // int color_h = GetColorHLS(h + GetKey(KEY_COUNT), l, s); // 少しづつ色を変化させる // GetColor2(color_h, &red[i], &green[i], &blue[i]); // } // } // 各頂点の情報をセット for (int i = 0; i < VERT_Y; i++) { for (int j = 0; j < VERT_X; j++) { vertex[i][j].pos.x = static_cast<float>(x2 - x1) * j / (VERT_X - 1) + static_cast<float>(x1); vertex[i][j].pos.y = static_cast<float>(y2 - y1) * i / (VERT_Y - 1) + static_cast<float>(y1); vertex[i][j].dif.r = static_cast<BYTE>((((red[0] *((VERT_X - 1) - j) + red[1] *j) / (VERT_X - 1) * ((VERT_Y - 1) - i) + (red[2] *((VERT_X - 1) - j) + red[3] *j) / (VERT_X - 1) * i)) / (VERT_Y - 1)); vertex[i][j].dif.g = static_cast<BYTE>((((green[0]*((VERT_X - 1) - j) + green[1]*j) / (VERT_X - 1) * ((VERT_Y - 1) - i) + (green[2]*((VERT_X - 1) - j) + green[3]*j) / (VERT_X - 1) * i)) / (VERT_Y - 1)); vertex[i][j].dif.b = static_cast<BYTE>((((blue[0] *((VERT_X - 1) - j) + blue[1] *j) / (VERT_X - 1) * ((VERT_Y - 1) - i) + (blue[2] *((VERT_X - 1) - j) + blue[3] *j) / (VERT_X - 1) * i)) / (VERT_Y - 1)); vertex[i][j].pos.z = 0.0f; vertex[i][j].rhw = 1.0f; vertex[i][j].dif.a = 0xff; vertex[i][j].u = 0.0f; vertex[i][j].v = 0.0f; } } // 頂点インデックスを作成 if( indices_setup == 0 ) { indices_setup = 1; int k = 0; for (int i = 0; i < VERT_Y - 1; i++) { for (int j = 0; j < VERT_X - 1; j++) { indices[k] = static_cast<unsigned short>(i * VERT_X + j); indices[k + 1] = static_cast<unsigned short>(i * VERT_X + j + 1); indices[k + 2] = static_cast<unsigned short>(( i + 1 ) * VERT_X + j); indices[k + 3] = static_cast<unsigned short>(( i + 1 ) * VERT_X + j + 1); indices[k + 4] = static_cast<unsigned short>(( i + 1 ) * VERT_X + j); indices[k + 5] = static_cast<unsigned short>(i * VERT_X + j + 1); k += 6; } } } return DrawPolygonIndexed2D(&vertex[0][0], VERT_X * VERT_Y, indices, (VERT_Y - 1)*(VERT_X - 1)*6, DX_NONE_GRAPH, FALSE); } 上記の例では横方向の頂点数 VERT_X が 80、縦方向の頂点数 VERT_Y が 45 となっていて、 丁度 1280x720 の範囲を描画する場合は16x16サイズ毎に2ポリゴン使って描画しています VERT_X と VERT_Y の数が大きくなるほど描画結果が正確になると共に負荷が高くなりますので、 バランスの良い数値を設定してみてください m(_ _)m
メンテ
Re: グラデーションを描画したい ( No.25 )
名前:kanamaru 日時:2020/04/19 08:11

合わせ技は考えつきませんでした。 自分で調べてみたんですけど、四角形のポリゴンってdirectxでは使えないんですね。 openglだと使えるようですが…。 使えればこの質問の回答としては一番になると思うのですが…。 ttps://w.atwiki.jp/opengl/pages/27.html 先頭にhを付けてください
メンテ
Re: グラデーションを描画したい ( No.26 )
名前:にこよう 日時:2020/04/19 18:38

>個人的にはかめのこにょこにょこさんの頂点数を増やす方法とkanamaruさんの1ピクセルづつ描画して >正確なグラデーションを描画する方法の間を取ったような方法の『DrawPolygonIndexed2D に渡す頂点数をもっと増やす』が >速度と描画結果のバランスが良いのではないかと思います ありがとうございますm(__)m 試してみましたが、処理速度は問題なく、しっかりとグラデーションしているのは確認できました しかし、一部の三角形が浮き出るように描画されていたためどこかにバグがあるのだと思います 何をやっているのかは分かったのですが、コードが難しい為今のところ自身ではバグを見つけられませんでした 各ポリゴンごとに別の色を指定してスクショを取ったので、原因を教えていただければ嬉しいです dotup.org/uploda/dotup.org2117161.png 左上からいくつか大きな三角が描画されているようです >kanamaruさん Dxライブラリに三角形のポリゴンしかない理由はこういうことだったのですね 三角形でも同じことが出来るというのは今回思い知らされましたが、少々難しいです....
メンテ
Re: グラデーションを描画したい ( No.27 )
名前:管理人 日時:2020/04/21 10:29

> にこようさん > しかし、一部の三角形が浮き出るように描画されていたためどこかにバグがあるのだと思います 手元の環境では載せたプログラムで正常に描画できているので謎ですね… #define VERT_X 80 #define VERT_Y 45 この部分の数字を #define VERT_X 2 #define VERT_Y 2 として、頂点数を最小限に減らしても同様の現象が発生してしまうでしょうか? > kanamaruさん 載せていただいたURLのページの四角ポリゴンでも真ん中に色の区切りができてしまっているので、 openglの四角ポリゴンも内部的には三角ポリゴン2つで実現されていると思います
メンテ
Re: グラデーションを描画したい ( No.28 )
名前:にこよう (解決) 日時:2020/04/21 19:06

>として、頂点数を最小限に減らしても同様の現象が発生してしまうでしょうか? 正常にグラデーションが描画できました こちらの環境の影響でしょうか? 少し原因を考えてみます
メンテ
Re: グラデーションを描画したい ( No.29 )
名前:かめのこにょこにょこ 日時:2020/04/21 20:04

こちらの環境 (WebAssemblyStudioですが...) でも図形が崩壊してしまう現象が生じました。 報告までに。 <nokotan.github.io/WebAssemblyStudio/?f=tpjeck2d0k>
メンテ
Re: グラデーションを描画したい ( No.30 )
名前:管理人 日時:2020/04/22 00:11

> にこようさん すみません、No.24 のプログラムにバグがありました return DrawPolygonIndexed2D(&vertex[0][0], VERT_X * VERT_Y, indices, (VERT_Y - 1)*(VERT_X - 1)*6, DX_NONE_GRAPH, FALSE); こちらの行は正しくは return DrawPolygonIndexed2D(&vertex[0][0], VERT_X * VERT_Y, indices, (VERT_Y - 1)*(VERT_X - 1)*2, DX_NONE_GRAPH, FALSE); となります m(_ _;m ( (VERT_Y - 1)*(VERT_X - 1)*6 の部分が (VERT_Y - 1)*(VERT_X - 1)*2 です ) 上記の修正をしたうえで、改めて #define VERT_X 80 #define VERT_Y 45 にして実行してみていただけないでしょうか? > かめのこにょこにょこさん WebAssemblyStudio では上記の修正をしても駄目ですね…( というか、 VERT_X 2 VERT_Y 2 に数値を減らしても駄目ですね… ) 同じ OpenGL ES を使用している Android版でも上記の修正で正常に描画されたので、恐らく HTML5版では DrawPolygonIndexed2D が正常に 動作しないのではないかと思いますが如何でしょうか?
メンテ
Re: グラデーションを描画したい ( No.31 )
名前:にこよう 日時:2020/04/22 00:53

>にして実行してみていただけないでしょうか? 綺麗に描画されるようになりました 速度と見た目からdefine値の微調整をして、最終的な関数をまた貼りに来ます ありがとうございましたm(__)m
メンテ
Re: グラデーションを描画したい ( No.32 )
名前:にこよう 日時:2020/04/24 17:20

> 管理人さん indices_setup変数を消しても動作上は同じ動きをすると思うのですが 何か意味があるのでしょうか?それとも、消してしまっても問題ないでしょうか?
メンテ
Re: グラデーションを描画したい ( No.33 )
名前:管理人 日時:2020/04/24 23:05

> indices_setup変数を消しても動作上は同じ動きをすると思うのですが > 何か意味があるのでしょうか? 『// 頂点インデックスを作成』の処理はプログラム全体で一回だけ実行すればよいので、 indices_setup が 0 の場合のみ実行することで頂点インデックスを準備する処理を 最初の一回だけ行い、2回目以降はこの処理を省くことでその分処理が軽くなる効果があります > それとも、消してしまっても問題ないでしょうか? 頂点インデックスを準備する処理が毎回実行される分遅くなってしまいますが、それでも 問題ないという事でしたら消してしまっても大丈夫です
メンテ
Re: グラデーションを描画したい ( No.34 )
名前:にこよう 日時:2020/04/25 00:04

>『// 頂点インデックスを作成』の処理はプログラム全体で一回だけ実行すればよいので、 >indices_setup が 0 の場合のみ実行することで頂点インデックスを準備する処理を >最初の一回だけ行い、2回目以降はこの処理を省くことでその分処理が軽くなる効果があります ご回答ありがとうございます すみません、コピペした際に勝手に全ての変数を関数内に持ち込んでいたのを忘れており、 このような簡単な事にも気が付きませんでした >頂点インデックスを準備する処理が毎回実行される分遅くなってしまいますが、それでも >問題ないという事でしたら消してしまっても大丈夫です define値をかなり多めの300*100にして計測してみたのですが、0.02ms程度の変化しか見られませんでした 簡単な計算処理なので、C++ではほとんど計算に時間がかからないようです ( 最適化の影響...? ) 本来はもっと少ない分割数で使用するので計算速度の差はほとんどないと思うので毎回実行する方針にしようと思います また、これの処理時間よりも、グラデーションに使用する色の影響で最大0.8msほどの計算速度の差が見られたことに驚きました
メンテ
Re: グラデーションを描画したい ( No.35 )
名前:かめのこにょこにょこ 日時:2020/04/26 13:36

> 管理人さん > > WebAssemblyStudio では上記の修正をしても駄目ですね…( というか、 VERT_X 2 VERT_Y 2 に数値を減らしても駄目ですね… ) > 同じ OpenGL ES を使用している Android版でも上記の修正で正常に描画されたので、恐らく HTML5版では DrawPolygonIndexed2D が正常に > 動作しないのではないかと思いますが如何でしょうか? 手元の環境では以下の変更を加えると正常に描画されるようになりましたが、管理人さんの環境ではいかがでしょうか。 <nokotan.github.io/WebAssemblyStudio/?f=ivza6s73uyp> > すみません、No.24 のプログラムにバグがありました > > return DrawPolygonIndexed2D(&vertex[0][0], VERT_X * VERT_Y, indices, (VERT_Y - 1)*(VERT_X - 1)*6, DX_NONE_GRAPH, FALSE); > > こちらの行は正しくは > > return DrawPolygonIndexed2D(&vertex[0][0], VERT_X * VERT_Y, indices, (VERT_Y - 1)*(VERT_X - 1)*2, DX_NONE_GRAPH, FALSE); > > となります m(_ _;m ( (VERT_Y - 1)*(VERT_X - 1)*6 の部分が (VERT_Y - 1)*(VERT_X - 1)*2 です )
メンテ
Re: グラデーションを描画したい ( No.36 )
名前:管理人 日時:2020/04/27 01:09

> にこようさん > すみません、コピペした際に勝手に全ての変数を関数内に持ち込んでいたのを忘れており、 > このような簡単な事にも気が付きませんでした VERTEX2D vertex[VERT_Y][VERT_X]; や unsigned short indices[(VERT_Y - 1)*(VERT_X - 1)*6]; を 関数のローカル変数にすると、容量の大きさからスタックメモリをオーバーしてプログラムが 正常に動作しなくなる可能性がありますので、vertex と indices はサンプルと同じように グローバル変数にするようにしてください ( VERT_X, VERT_Y がどちらも 16 など、値が小さい場合はローカル変数でも大丈夫ですが… ) > かめのこにょこにょこさん > 手元の環境では以下の変更を加えると正常に描画されるようになりましたが、管理人さんの環境ではいかがでしょうか。 すみません、*6 を *2 に変更した後、画面右上の Save を押していませんでした ( VisualStudio と同じようにビルドすると変更されたファイルが自動的に保存されるものだと思い込んでいました orz ) *6 を *2 に変更した後 Save を押してから Build & Run をしたところ、手元の環境でも正常な描画結果が得られました
メンテ
Re: グラデーションを描画したい ( No.37 )
名前:にこよう (解決) 日時:2020/05/02 18:16

かめのこにょこにょこさんの返信はなさそうなので、最後に関数を書いておきます >VERTEX2D vertex[VERT_Y][VERT_X]; や unsigned short indices[(VERT_Y - 1)*(VERT_X - 1)*6]; を >関数のローカル変数にすると、容量の大きさからスタックメモリをオーバーしてプログラムが >正常に動作しなくなる可能性がありますので、vertex と indices はサンプルと同じように >グローバル変数にするようにしてください これについてなのですが、分割数を1ずつ増やしながら目視で確認したところ、 〜8までは徐々にきれいになっていきましたがそれ以降はほとんど変化はありませんでした 8x8と100x50で別々にスクリーンショットを保存し、それを見比べても全くと言っていいほど変化はありませんでした なので、最終的に8x8で、容量が意外と小さくなったため、関数内の変数に変更しました また、他のプログラムに合わせるために変数名を変更していますが深い意味はないです ( constを使用していますがconstexprを使ったほうが良いと思われます ) 単純なグラデーションを一つの関数にまとまられたのは助かりました、皆さんのご助力ありがとうございましたm(__)m // グラデーションカラーの四角形を描画する ( 各頂点の色を指定する: 左上, 右上, 左下, 右下 ) int DrawBoxGrad(int x1, int y1, int x2, int y2, int Colorlt, int Colorrt, int Colorlb, int Colorrb) { const int VERT_X = 8; // 小さいグラデーションに分割する数 const int VERT_Y = 8; int red[4], green[4], blue[4]; // 4つの頂点の色 unsigned short indices[(VERT_Y - 1) * (VERT_X - 1) * 6]; VERTEX2D vertex[VERT_Y][VERT_X]; // ポリゴンの頂点の情報 if (Colorlb == 0) Colorlb = Colorlt; // 四角形の左下の色が指定されていなければ上の色をコピーする if (Colorrb == 0) Colorrb = Colorrt; // 四角形の右下の色が指定されていなければ上の色をコピーする GetColor2(Colorlt, &red[0], &green[0], &blue[0]); GetColor2(Colorrt, &red[1], &green[1], &blue[1]); GetColor2(Colorlb, &red[2], &green[2], &blue[2]); GetColor2(Colorrb, &red[3], &green[3], &blue[3]); for (int iy = 0; iy < VERT_Y; iy++) { for (int ix = 0; ix < VERT_X; ix++) { vertex[iy][ix].pos.z = 0.0f; // 各頂点の情報をセット vertex[iy][ix].rhw = 1.0f; vertex[iy][ix].dif.a = 0xff; vertex[iy][ix].u = 0.0f; vertex[iy][ix].v = 0.0f; vertex[iy][ix].pos.x = static_cast<float>(x2 - x1) * ix / (VERT_X - 1) + static_cast<float>(x1); vertex[iy][ix].pos.y = static_cast<float>(y2 - y1) * iy / (VERT_Y - 1) + static_cast<float>(y1); vertex[iy][ix].dif.r = static_cast<BYTE>( (((red[0] * ((VERT_X - 1) - ix) + red[1] * ix) / (VERT_X - 1) * ((VERT_Y - 1) - iy) + (red[2] * ((VERT_X - 1) - ix) + red[3] * ix) / (VERT_X - 1) * iy)) / (VERT_Y - 1)); vertex[iy][ix].dif.g = static_cast<BYTE>( (((green[0] * ((VERT_X - 1) - ix) + green[1] * ix) / (VERT_X - 1) * ((VERT_Y - 1) - iy) + (green[2] * ((VERT_X - 1) - ix) + green[3] * ix) / (VERT_X - 1) * iy)) / (VERT_Y - 1)); vertex[iy][ix].dif.b = static_cast<BYTE>( (((blue[0] * ((VERT_X - 1) - ix) + blue[1] * ix) / (VERT_X - 1) * ((VERT_Y - 1) - iy) + (blue[2] * ((VERT_X - 1) - ix) + blue[3] * ix) / (VERT_X - 1) * iy)) / (VERT_Y - 1)); } } int i = 0; for (int iy = 0; iy < VERT_Y - 1; iy++) { for (int ix = 0; ix < VERT_X - 1; ix++) { indices[i] = static_cast<unsigned short>(iy * VERT_X + ix); // 頂点インデックスを作成 indices[i + 1] = static_cast<unsigned short>(iy * VERT_X + ix + 1); indices[i + 2] = static_cast<unsigned short>((iy + 1) * VERT_X + ix); indices[i + 3] = static_cast<unsigned short>((iy + 1) * VERT_X + ix + 1); indices[i + 4] = static_cast<unsigned short>((iy + 1) * VERT_X + ix); indices[i + 5] = static_cast<unsigned short>(iy * VERT_X + ix + 1); i += 6; } } return DrawPolygonIndexed2D(&vertex[0][0], VERT_X * VERT_Y, indices, (VERT_Y - 1) * (VERT_X - 1) * 2, DX_NONE_GRAPH, FALSE); }
メンテ

Page: 1 | 2 |

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

   クッキー保存