[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 08/06 20:32 / Filesize : 251 KB / Number-of Response : 956
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【C++】 DirectX初心者質問スレ Part24 【C】



1 名前:デフォルトの名無しさん mailto:sage [2009/06/22(月) 22:06:29 ]
※回答する人も、質問する人も必ず読んでください

これらに当てはまる人のための質問スレです。
1.C/C++は多少理解している。
2.最近DirectXを始めたばかり
3.SDKを見ても、Googleで検索しても、いまいち理解できない人
4.余計な雑談は不要ですよ

【 回答してくださる方 】
・ できるだけ優しく質問に答えてあげてください。
・ 優しく教えるのが嫌でしたら、解決するためのヒントだけでも結構です。
 「ググれ」「SDK見れ」以外の回答でおながいします。
・ 神ですら理解不能な質問は無視して下さい。

【 質問する方 】
・ どんな事で躓いているのか明確にしよう。
・ 長くならないなら躓いている部分のコードを晒してみれ。
・ 解決した場合、お礼を言うのは当然だが、何をどうしたら解決したかを明確に書こう。
・ 回答して貰ったら、出来るだけお礼もしよう。

【C++】 DirectX初心者質問スレ Part23 【C】
pc12.2ch.net/test/read.cgi/tech/1242977486/

29 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 21:58:05 ]
>>28
DrawPrimitiveのオーバーヘッドの影響かな?
頂点数を相対的に増やしていけば、
その差は縮まるんじゃないかなぁ。

30 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 21:58:51 ]
DrawPrimitiveの読み出しがそもそも遅い

31 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 22:24:39 ]
HLSLでVSからPSにグローバル変数で値を持ち越す事って出来ないですよね?
なんか挙動を見る限り入ってなさそうで・・・

32 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 22:56:41 ]
>>29-30
頂点数と転送回数のバランス次第ではありえるということですね
ありがとうございます


33 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 23:07:15 ]
>>31
そもそもシェーダからグローバルメモリへの
書き込みは出来ません。(DX10はしらね)

34 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 23:41:51 ]
>>33
varyingみたいに使えればなーと思ったんですが
やはりVSから構造体に詰めて渡すしかないんですね
ありがとうございます

35 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 23:52:10 ]
>>34
そもそもそれぞれが並列処理で動いてるのにグローバル変数をどうやって管理するつもりだったんだ?
シェーダーは逐次処理でまわってるわけじゃないぞ。


36 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 01:49:39 ]
シェーダーを延々と長々書き足していったら途中で動かなくなってしまい
どうやら一定量超えると動かないみたいなのですが、これは容量オーバーなのでしょうか?

37 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 01:57:19 ]
シェーダープロファイルでインストラクション数に制限がある



38 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 02:05:59 ]
ありがとうございます

39 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 09:39:40 ]
>>20
情報不足で申し訳ない。
加算合成なので、Zテストはしていないんです。
ただ、どちらにしろそれが「小さい方が遅い」結果にはつながらない気がしますね。

>>22
むしろ角度をつけないのが良い。とか思っていましたが、そういうものでしょうか。
確かに飛び散る火の粉がいつも同じ形なのは問題かもしれませんね

40 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 09:43:47 ]
後考えられるとすれば、縮小時は元の解像度より下がってフィルタがかかってる
拡大時は元の解像度より上がってフィルタがかかってない
そういうフィルタ設定でテクスチャを張ってる前提だけど。

テクスチャ外してみたらどうなるよ

41 名前:デフォルトの名無しさん [2009/06/25(木) 13:11:04 ]
ウィンドウを一色で塗りつぶすことって出来ますか?


42 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 13:18:28 ]
>>40
ミップマップの生成はD3DX_DEFAULTで、拡大も縮小もLINARです。
テクスチャ外しても再現しました。


視野角ではなくカメラからの距離(遠くなり、小さく描画されている時の方が遅い)でも、再現しました。
それと、パーティクルの生成数を10倍にしたところ、「大きく映っているほうが遅い」という常識的な結果になりました。
つまりまとめますと
「描画量が少ないと、小さく映っているほうが遅い時がある」
って感じですね。

これだとロジックのどこかにバグがあるかと思われるかもしれませんが、本当にカメラ位置しか変えずにコンパイルしています。

描画量が少ないと。といっても、毎フレーム100個ほどのポイントスプライトを描画しているんですけどね。
500個にしたら逆転しました。(小さく映っているほうが速くなりました)

43 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 14:35:03 ]
インスタンス処理について質問があります
サンプルのInstancingなのですが、技法3、定数のインスタンス化の処理はあまり意味ないように思えるのですが
これって効果あるのでしょうか?

for( int nRemainingBoxes = 0; nRemainingBoxes < g_NumBoxes; nRemainingBoxes++ )
{
// set the box Instancing array
V( g_pEffect->SetVector( g_HandleBoxInstance_Position, &g_vBoxInstance_Position[nRemainingBoxes] ) );
V( g_pEffect->SetVector( g_HandleBoxInstance_Color, (D3DXVECTOR4*)&g_vBoxInstance_Color[nRemainingBoxes] ) );

// The effect interface queues up the changes and performs them
// with the CommitChanges call. You do not need to call CommitChanges if
// you are not setting any parameters between the BeginPass and EndPass.
V( g_pEffect->CommitChanges() );

V( pd3dDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0, 0, 4 * 6, 0, 6 * 2 ) );
}

44 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 15:19:18 ]
>>43
サンプルをみたが、1(HWInstancing)以外は
あまり意味はないな。
1の比較対象として、用意しているに過ぎない。
特に3は、普通に描画してるだけだな。


45 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 15:39:45 ]
ありがとうございます。
2だとDrawPriitiveを減らせる効果はあるぐらいですかね

同じモデルを複数回描画するのを効率化したいのですが、
ハードウェアインスタンスを使えたら使う、使えなければ普通に描画するしかないということでしょうか?

46 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 15:54:08 ]
2だか忘れたけど、同じモデルデータを大量に複製して
頂点にID持たせてつなげてビデオメモリに転送しとく奴だっけ?

板ポリゴン大量に扱いたいけどハードウェアインスタンス使えないって時に結構使えて気もするが

47 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 16:01:07 ]
>>46
2はそうだね。
無駄重複が大量にあるのは、
キモイな。

1は、メッシュx1、DrawPrimitive x1
2は、メッシュxN、DrawPrimitive x1
3は、メッシュx1、DrawPrimitive xN
4は、メッシュx1、DrawPrimitive xN
かな。



48 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 16:10:09 ]
>>45
そうだね。HWのそれ以外
DPを減らす方法は無いと思う。(D3D9)

ただ、サンプルの2はボックスの頂点データを
そのまま大量に複製しているように見えるが、
座標データを定数や頂点テクスチャに移せるなら、
頂点バッファは純粋にインデックスのみって構成も
可能だよね。
これがいけるんならサンプル2も、対象に入りそうだな。

49 名前:デフォルトの名無しさん [2009/06/25(木) 17:06:01 ]
初歩的な質問で申し訳ありません。
C言語が必要になり、根っからの文系人間が「Cの絵本」という本でもってプログラミングに挑戦しています。

if文のところで、

#include <stdio.h>

main()
{
int s = 65;

printf("あなたの点数は%d点です。\n", s);

if(s < 70)
{
printf("平均点まであと%d点。\n", 70-s);
printf("がんばりましょう!\n");
}
else
{
printf("よくできました!\n");
}
}


という文を作りました。
ここから月数に応じてコメントを表示するプログラム(1月ならばwinter、3月ならspringといった具合に)を作りたいのですが、どのように変化を加えればよいのでしょうか?
月は1月〜12月までなので、13月以上と1月未満の数値を打ち込んだ場合はerrorと表示させたいです。
よろしくお願いします。


50 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 17:09:52 ]
凄くすれ違いです・・

51 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 18:05:34 ]
SetRenderTargetで描くのと
UpdateSurfaceでコピーするのは
どっちが速いですか?

52 名前:デフォルトの名無しさん [2009/06/25(木) 19:11:09 ]
頂点バッファ作成で躓いてますorz

struct VERTEX
{
float x,y,z;
DWORD color;
enum{ FVF = D3DFVF_XYZ | D3DFVF_DIFFUSE };
};

IDirect3DVertexBuffer9* pvb = NULL;
Graphics->GetDevice()->CreateVertexBuffer( sizeof(VERTEX)*3, D3DUSAGE_DYNAMIC, VERTEX::FVF, D3DPOOL_MANAGED, &pvb, NULL );

ってやってるんですがCreateVertexBufferを呼んでもpvbがNULLのままで・・・

エラーではD3DERR_INVALIDCALLが返ってきてます.

MSDNみると

メソッドの呼び出しが無効である。
たとえば、メソッドのパラメータに無効な値が設定されている場合などである。

とあるのですがおかしいところも見当たらない気がします.

どこか他で不具合出てるのでしょうか・・・.

思い当たる節がないので困ってます

53 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 19:21:20 ]
インデックスバッファや頂点バッファは
D3DPOOL_MANAGEDをD3DUSAGE_DYNAMICでは作れなったかったきが気がする
D3DPOOL_DEFAULTが推奨

54 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 19:27:29 ]
動的なバッファにする必要がないなら
D3DPOOL_MANAGEDのままで使用方法に0を指定するのも有

55 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 21:22:56 ]
髪の毛みたいなソフトボディ?のアニメーションもキーフレームアニメーションでできるのですか?

56 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 21:52:41 ]
スキニングを探してるのか?

57 名前:52 mailto:sage [2009/06/25(木) 21:54:53 ]
ご協力ありがとうございました.
CreateVertexBuffer解決しました.
Usageを0にしたのと
D3DPRESENT_PARAMETERS構造体の
AutoDepthStencilFormatをD3DFMT_D24FS8にしていたのを
D3DFMT_D24S8に変更でいけました.







58 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 22:29:41 ]
DirectInputについて質問です。
秒間60回入力を拾っても、描画の垂直同期待ちとかで
一瞬予定通りに拾えない時間帯があると思います。
(ペイントソフトを作ってマウスで線を描くと、線が切れる部分が出る)

自分はマルチスレッドで入力を回収し、バッファにためておくことで解決しようと
考案中なのですが、みなさんが他に良い方法を使用していたら、教えてください

59 名前:デフォルトの名無しさん mailto:sage [2009/06/25(木) 22:32:43 ]
DirectInputでマウスさんさとゃでめよん

60 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 00:06:10 ]
>>58
変なことやらないほうがよくね?
仮に1フレームで押してる・押してないと2つの状態がとれたときにそれはどっちが優先なの?
たまに押した状態がくっついてるような変なアプリみるけど
それって小細工のたまものだと思うw

61 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 00:11:20 ]
IDirectInputDevice8::GetDeviceDataで
入力履歴の配列が得られる。
これで何時押されて、何時離されたか
判断出来る。

62 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 01:22:24 ]
それってパッドの入力履歴とれる?


63 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 08:58:01 ]
>>58
入力はスレッドでやり、スレッド優先度を高くしておく。
ただしそのままだとそいつが処理を食ってしまうので、きちんとWaitEventやらで沈黙することが大事。

64 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 19:04:47 ]
普通のメッシュファイルは表示できるんだけど、
テクスチャとかマテリアルでアルファ値が設定されていないものを
任意のアルファ値で半透明に表示する方法はないですか?

65 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 19:07:38 ]
そういうシェーダを書く。
マジで。
固定シェーダ(笑)でもできるけど、面倒この上ないよ

66 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 19:10:32 ]
なんか質問するごとにシェーダでやれと言われまくるんだよなー
そろそろ勉強したほうがいいのかな
どこから勉強すりゃいいのかよくわからんのだが

67 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 19:10:40 ]
D3DTA_TFACTORを使えば簡単だけど
シェーダーでやった方がいいな



68 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 19:12:48 ]
SetTextureStageState( D3DTSS_CONSTANT, 任意色 );
SetTextureStageState( D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
SetTextureStageState( D3DTSS_ALPHAARG1, D3DTA_CONSTANT );

別に面倒ってほどでもないなあ

69 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 19:14:39 ]
>>66
エフェクトからやれ。
エフェクトファイルは必須だから。

70 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 19:19:25 ]
スプライトをSetRenderTargetの咲に描くにはどうしますか?

71 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 20:24:01 ]
>>66
はぁ?
ていうか今日はじめて今日できる
ウンコする時間も考慮すると後3〜4時間?
余裕過ぎる

そんな程度

72 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 21:27:55 ]
>>66
気持はわかるが、マジでシェーダオンリーにしたほうがいい。
本気で。
俺も固定シェーダにこだわってゲームつくってたけど、プログラマブルシェーダに移行したら天国だった。

73 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 21:39:47 ]
HLSLがC言語だとすると、固定シェーダーは得体の知れないアセンブラ

74 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 22:17:20 ]
シェーダーの勉強のとっかかりになるところでいいところない?
いきなり高度なことやってるページばかりしかなくてこまる

75 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 22:19:11 ]
×固定シェーダ
○固定機能

間違った用語を平気で使い続ける馬鹿って何なの?

76 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 23:03:47 ]
たぶん、プログラマブルなシェーダに対しての、プログラマブルじゃない固定という意図では?

77 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 23:24:27 ]
まぁ将来シェーダーいじるようなゲームプログラマーになりたいとかじゃなけりゃ
好きなもんを好きなように使っておけとしか言えないが。



78 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 23:31:04 ]
アホが68件程度しか発見できないのがせめてもの救い
www.google.co.jp/search?q=%22%8C%C5%92%E8%83V%83F%81[%83_%22

79 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 23:36:47 ]
まあでも固定機能パイプラインを示す
適当な言葉がないのも事実。
固定シェーダでいいんじゃないの。

80 名前:デフォルトの名無しさん mailto:sage [2009/06/26(金) 23:39:21 ]
固定機能パイプラインで良いんじゃ

81 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 00:39:43 ]
定食

82 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 01:02:27 ]
内部を考えると固定のシェーダーとも言えなくもないがw

83 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 02:46:10 ]
通じりゃいいだろ
こだわるところじゃない

84 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 02:49:13 ]
DirectX11では
「演算シェーダ」「ハルシェーダ」「ドメインシェーダ」の
三つのプログラマブルシェーダと
テッセレーションを行うための「固定機能シェーダ」が新設されるそうな

もう紛らわしいから固定機能パイプラインは無かった子にして良いよ

85 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 07:12:24 ]
もう固定機能パイプラインをちゃんと言うしかないな

86 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 08:20:06 ]
固定機能パイプラインが無くなる事で
良書が増えるといいねぇ

87 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 12:36:05 ]
directxライブラリと標準ライブラリを同時に使うことってできないんでしょうか?



88 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 12:40:39 ]
勝手に使えよ。

89 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 12:44:25 ]
多分同じ変数や関数が複数回使われてるみたいなエラー出たんだろ

90 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 13:00:26 ]
DirectXつかっててそんなの出るか・・・?

91 名前:デフォルトの名無しさん mailto:sage [2009/06/27(土) 19:52:46 ]
maxとminがdefineされてるから、
std::maxとstd::minと衝突するってやつか?
NO_MINMAXでぐぐればいけた気がする。

92 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 21:09:13 ]
同じMS製品でそんなの出るとか不良品じゃねーか

93 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 22:03:18 ]
もともとmaxとかminとか定義してたライブラリありまくるぜ
vectorとか標準ライブラリ作った人なんでこんな名前にしたんだと思った
std::〜っていちいち書くぐらいしかないのかな?

94 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 22:32:35 ]
いちいち書いたほうがいい
STLだけ差し替えたりするし。

95 名前:デフォルトの名無しさん mailto:sage [2009/06/28(日) 23:46:05 ]
SYSPROCはどこに書けばいいの?

96 名前:デフォルトの名無しさん mailto:sage [2009/06/29(月) 12:42:29 ]
>>93
DirectXのmin maxはマクロだから、std::つけてもエラーが出る。

97 名前:デフォルトの名無しさん mailto:sage [2009/06/29(月) 16:29:55 ]
rad0 が #define されてるのが地味にトラップ。



98 名前:デフォルトの名無しさん mailto:sage [2009/06/29(月) 23:07:23 ]
DirectInput8のGetDeviceStateメソッドでジョイパッドの入力を生で受け取り
コード側でそれを、否定・論理積を使ってトリガ情報に加工して使おうとしています。

当該処理はDLLに放り込みました。
それを、Win32コンソールアプリケーションをドライバにしてforループでガンガン回しながら
テスト実行してみたところ、ベタ入力もトリガ入力も正しく取れるのですが、
本番環境のWin32アプリケーションに組み込んでみたところ、
トリガ入力がベタ同然の振る舞いをするようになってしまいました。

理屈の上では、メインループでどれだけの時間がかかろうと、かかるまいと、
GetDeviceStateが押された瞬間にキーが押しっぱなしでさえあれば
トリガとしてのふるまいをしてくれるはず・・・と期待しているのですが、どうにもなりません。

これって、いわゆる「直接入力における取りこぼし」ってやつなんでしょうか・・・

99 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 01:46:34 ]
外人「OH〜ユーアーサムラーイCOOL!」
農民「ノー…アイ アム ア ファーマー…」
外人「オウマイゴー アイムソーリー ユーアープアー」


100 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 03:09:45 ]
>>98
実を言うとそこまで深く突っ込んで調べたことが無い。
そのテスト版のプログラムもし公開できるものなら見てみたいよ

101 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 19:24:25 ]
DLLにした時点でどこのキーとってるのか俺にはわからないけど
メインの処理のキー入力を勝手にとってくるもんなの?そーゆーのって?

102 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 19:30:02 ]
法線とライトの内積を求めてその値で境界の範囲を決めるトゥーンシェードで
Sio29さんのCelsView見たく境界の色をあいまいにするのってどうやってやるんですか?


103 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 19:34:53 ]
>>102
本人に聞いてこいよ

104 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 19:38:42 ]
>>102
参照するトゥーンマップの段階の変わり目をグラデーションにするだけ

105 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 19:41:18 ]
>>103
つっこみありがとう
Sio29さん独特の技術なら聞いてこようと思います

やりたい事がわかりやすいように例を挙げただけだったんですが

106 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 19:43:30 ]
>>104
それじゃなんねーと思うぜ
法線は段階的に角度がついてるわけじゃねーし

107 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 19:43:40 ]
>>104
ありがとうございます
色の決定にトゥーンマップを使用していないのでつまづいています




108 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 19:53:43 ]
>>106
なんで?
頂点シェーダでマップの参照位置を計算してピクセルシェーダにわたして
実際の色参照をピクセルシェーダでやれば問題ないんだけど

109 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 19:57:30 ]
>>107
トゥーンマップを使わないでどうやってるの?
いちいち内積の値でifで条件分けして陰つけてるの?

110 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 20:02:58 ]
>>108
関係なくね?
例えば立方体の辺にグラデ入れたいとしてその方法で何かつくの?

111 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 20:07:34 ]
VS上の法線などのベクトルは、
PSには線形補間されて渡される。

112 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 20:12:47 ]
>>110はライティングの仕組みを全く理解してないと思われ
そんなこと言ったら普通のグローシェーディングもできないことになる

113 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 20:12:51 ]
>>111
だから頭の中でそれでグラデがつくか考えてみろっての

114 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 20:14:52 ]
>>112
だからその仕組みとこの仕組みがリンクしてねぇって俺は主張してるわけだよ

115 名前:102 mailto:sage [2009/06/30(火) 20:23:13 ]
>>109
そうです、ifで条件つけてやってます
マテリアルごとにトーンマップを用意するのが面倒なので

116 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 20:30:46 ]
>>114
VSの計算結果で頂点Aが黒で頂点Bか白としましょう
PSで頂点AとBの中間地点のピクセルを描画するときは
線形補間された灰色という値が入ってきますよね?
だから通常のライティングが成立してるのはわかりますよね?

VSで頂点Aのマップの参照位置を(u,v)=(0,0)
Bの参照位置を(u,v)=(1,0)としましょう
PSでAとBのちょうどまんなかのピクセル描画時には
線形補完された(u,v)=(0.5,0)という値が入ってきます
この値をつかってマップの色をサンプリングすればOKなのですよ

117 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 22:35:53 ]
>>116
そこまで来てねぇよw
法線の値でグラデかけたマップから値とりにいくところで
うまくいかねぇと思うぜ



118 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 23:37:11 ]
customUI使うには何をincludeすればいいでしょうか。
ソース分割とかやったことなくてさっぱりわかりません。
bccDeveloper使ってやっています。

119 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 23:52:15 ]
>>117
www.arakin.dyndns.org/glsl_cartoon.php
ここが比較的わかりやすいから、見てみれば。
そこのテクスチャの色は2色、輪郭を含めて3色だが、
その3色の境界にグラデをかければ、最終的な
出力画像にもグラデが掛かるだろ。

120 名前:デフォルトの名無しさん mailto:sage [2009/06/30(火) 23:55:02 ]
>>118
CustomUIの中のCoreとOptionalプロジェクトを
インポートして使う。
VCならそのままだが、bccDeveloperはシラね。

121 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 00:00:58 ]
>>119
かかんねぇよ
よく考えろよ

122 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 00:12:20 ]
げちょげちょすっげキタネェのができるぞ
トゥーンマップ(?)でうまくいくのって2〜3色ぐらいでグラデなしの
ときだけのような希ガス

綺麗にならないのはグラデがかかってほしいところでちょうど
法線(内積?)が段階的にかわってくれるとは限らないってところがポイントだと思う
つまり、内積→マップの値の変換でうまくいかない

123 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 00:50:19 ]
境界って輪郭線じゃなくてシェーディングの部分でしょ?
だったら実際のところトーンマップの中間をグラデにしてるだけだと思うが>CelView
きたねぇところはきたねぇし


124 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 01:54:32 ]
>>123
境界の認識はあってるよ
実はCelView見てないけど
だったら高解像度になるにつれ余計なことしないほうがいいな

ようはシェーディングの境界をぼかしたいわけじゃなくて
シェーディングの境界がジャギってんのが気に入らないんだろ?

125 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 11:42:26 ]
プログラマブルシェーダについて質問です。
bool型定数を使った静的分岐をやろうとしました。
ttp://msdn.microsoft.com/ja-jp/library/bb944006(VS.85).aspx
>静的分岐では、ブール型のシェーダー定数に基づいてシェーダー コード ブロックのオン/オフを切り替えることができます。
>これは、現在レンダリングされているオブジェクトの種類に基づいて
>コード パスを有効または無効にできる便利な方法です。
>描画呼び出しの間では、どの機能を現在のシェーダーでサポートするかを決定し、
>その動作に必要なブール フラグを設定できます。
>ブール定数で無効にされたステートメントは、シェーダー実行中にスキップされます。

下記のようにやってみたのですが、
fcx.exeでコンパイルしたものを覗いたところ、cmp命令が使われてしまっていました。
それでは分岐による負荷がかかってしまいますよね。

分岐負荷がかからないコードブロック単位での静的分岐とは、どうやるのでしょうか?

bool UseTexture;

float4 PS(VS_OUTPUT In) : COLOR
{
if (UseTexture)
{
In.Color *= tex2D(DecaleSamp, In.TexDecale);
}
return In.Color;
}

126 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 14:57:45 ]
#ifdef
#else
#endif

127 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 18:58:43 ]
>>125
静的に決定させる為には、
静的に決定出来なきゃ駄目だよね。

>>125のコードだと、「bool UseTexture」は
いつ何時変わる可能性があるので、コンパイラは
決め撃ちすることは出来ない。

方法としては、>>126のプリプロセッサ以外に、

@「static const UseTexture = true;」にする。

Aシェーダの引数で受け取り、passで分岐する。

float4 PS(VS_OUTPUT In,
uniform bool UseTexture ) : COLOR
{
if (UseTexture)
{
In.Color *= tex2D(DecaleSamp, In.TexDecale);
}
return In.Color;
}

technique T
{
pass P0{ pixelShader = compile PIXELSHADER_TARGET PS( false );}
pass P1{ pixelShader = compile PIXELSHADER_TARGET PS( true );}
}

いづれも、最適化とプリシェーダはONにしておくこと。



128 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 20:01:27 ]
>>126-127
アドバイスありがとうございます。
静的分岐とは言え、さすがにON/OFFのチェンジはしたいので
>>126や、>>127の@というわけにはいきません。

ひとまず、>>127のAではうまくいきました。

そこで再質問なのですが、グローバル定数は、uniformとして扱われるMSの説明に書いてある上、
1回の描画命令の間では不変ですよね?
グローバル定数ではダメなのでしょうか?(ダメだったから>>125はダメだったわけですが…)

正直引数のuniformでやる方法ですと、
pass P0{ pixelShader = compile PIXELSHADER_TARGET PS( false );}
pass P1{ pixelShader = compile PIXELSHADER_TARGET PS( true );}
このようにtrueの場合とfalseの場合をいちいち定義しなければならず、
組み合わせが多い場合(ライトON/OFF、影ON/OFFなどなど)に組み合わせ爆発が厄介そうです。

uniform int の場合はintの取りうる範囲が多すぎるため、
PS(0) PS(1) のように定義しなければならないのはわかるのですが、
MSの説明を見る限り「bool型のシェーダ定数は特別扱いだよ」みたいに読めるのですが、
bool型を使うことによる利点のようなものは何かないのでしょうか?
MSの説明を見て

129 名前:デフォルトの名無しさん mailto:sage [2009/07/01(水) 20:38:08 ]
>>128
>1回の描画命令の間では不変ですよね?
シェーダの生存期間は、コンパイルによって
exe(的なもの)として生成されてから、破棄されるまでの間です。
描画命令間ではありません。
定数が静的であるとは、生成から破棄の間静的であることです。
描画命令の間不変としたいなら、描画毎のコンパイルが必要。

>組み合わせが多い場合(ライトON/OFF、影ON/OFFなどなど)に組み合わせ爆発が厄介そうです。
そうです。これはD3D9世代の欠点でもあります。
これを補う為に、フラグメントシェーダやデファードレンダリングなどがあったりします。
DX11では動的リンクが加わるそうなんで、ちょっとはマシになるかも。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<251KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef