【C++】 DirectX初心者質問スレ Part40 【C】©2ch.net

レス数が900を超えています。1000を超えると表示できなくなるよ。
1デフォルトの名無しさん 転載ダメ©2ch.net2016/09/25(日) 14:43:57.34ID:3wiQalb8
回答する人も、質問する人も必ず読んでください

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

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

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


【C++】 DirectX初心者質問スレ Part39 【C】
http://echo.2ch.net/test/read.cgi/tech/1418438785/

>>2リンク

898デフォルトの名無しさん2017/12/03(日) 20:22:53.42ID:WDmLCv4g
>>897
ソースがあるんだから移植しろよ、アホか

899デフォルトの名無しさん2017/12/03(日) 21:03:11.39ID:qMNlGUHN
すみません、初心者なもので、HLSLの文法がよく分かっていないのです。
例えばこの一文にしても、

particles[index].color = image.read(id);

このままじゃHLSLでは使えませんよね、
じゃあ、済みません、一つだけに質問を絞って消えます。

上の変数particlesですが、Metalという言語において
元のテクスチャを格納したバッファだと思われます。
HLSLだと、サンプラーを使いたいテクスチャで定義することと同義だと思われます。

というかここまで書いてきて思ったのですが、要するにテキスチャを読みこむというのは、
文字通り画像を分解することじゃなくて、画像と同じスケールの板を用意して、それに画像の色を取得させて、
元画像をパーティクル化しているように見せている、ということですよね。

ですので、分からないのは、
particles[index].position = float4(id.x / (float)size.x, id.y / (float)size.y, 0, 1);
これをHLSLでどう表現するかです。変数パーティクルの後に配列[index]があり、
さらにpositionなるメソッド?が用意されている。ここでパーティクルが配置されているものと思われます。
とても直感的で分かりやすいですが、これをどうHLSLに翻訳するか、教えて頂けないでしょうか。

900デフォルトの名無しさん2017/12/03(日) 22:05:15.66ID:xSL5mF2a
DirectXしかわからないけど

入力で座標とどのピクセルを描画するかの情報を送る

頂点シェーダでパーティクルのポリゴン作る

ピクセルシェーダで入力情報をもとにテクスチャの1pxを描画

って感じだと思う

901デフォルトの名無しさん2017/12/04(月) 01:03:00.54ID:g/Dvecy1
シェーダコード見てみたけど100行ぐらいしかないやん
しかもシェーダなんて似たようなコードだし
リファレンス見ながら書き直してもたいしたことないだろ

「真性の馬鹿なので勉強の仕方がわかりません。答え教えてください」
こういう風にしか見えんわ

902デフォルトの名無しさん2017/12/04(月) 02:52:37.40ID:5zvUhAUl
>>900-901

ありがとうございました。
もう少し自力でやってみようかと思います。

903デフォルトの名無しさん2017/12/04(月) 16:21:04.56ID:PtiyKmP1
馬鹿には無理

904デフォルトの名無しさん2017/12/04(月) 17:19:00.46ID:UVpqn+og
自己紹介乙

905デフォルトの名無しさん2017/12/04(月) 19:45:16.62ID:5zvUhAUl
馬鹿だから無理でした。

内容としては、

頂点シェーダで、テキスチャのサイズにテキスチャ座標をスケーリングしたものと同様の変数を
x座標、y座標ように2つ用意する



それをそのまま2つの配列にする



頂点座標のx成分、y成分にそれぞれ配列を代入する




確保していたテクスチャから色情報を取得してそれを頂点座標に代入



頂点座標を出力(ピクセルシェーダはスルー)

そうしたら、何も映りませんでしたが、入力していたメッシュをワイヤーフレームワイヤーフレームとか
ソリッドとかで表示できる機能がvvvvにはあるのですが、それをポイントにしたら
点が一つだけ表示されました。

書いていて情けなくなるくらい自分馬鹿だなあと思っています。
でも実現の方法が分からず・・・優しい方教えてください。

906デフォルトの名無しさん2017/12/05(火) 01:37:34.16ID:wXeULMnZ
俺って天才だなあ

907デフォルトの名無しさん2017/12/05(火) 11:28:09.79ID:Kxri3/vO
VSとPSの最低限の物を理解してれば難しくないだろ

908デフォルトの名無しさん2017/12/05(火) 14:04:47.35ID:JFWc1rHJ
ソース貼れ

909デフォルトの名無しさん2017/12/05(火) 16:03:39.98ID:D/e4ygg6
とりあえず最低限の頂点シェーダだけです。配列index[],index2[]にはソフトウェアの方から、座標を任意個数リニアに出力してくれるノードを使っています。
入力してるメッシュは1つだけで、出力されてるのも1つだけなので、このコードをどういじってもせいぜい変形したメッシュにビデオ入力がそのまま映るだけです。目的としては320*240個のパーティクルを作りたいのですが、
ソフトウェア側でその数のパーティクルを用意するのでなく、単にその数の座標を入力しているだけの状態です。
struct vs2ps
{
float4 Pos : POSITION;
float2 TexCd : TEXCOORD0;

};
// --------------------------------------------------------------------------------------------------
// VERTEXSHADERS
// --------------------------------------------------------------------------------------------------

float index[320];
float index2[240];
vs2ps VS(
float4 PosO : POSITION,
float4 TexCd : TEXCOORD0

)
{
vs2ps Out;

PosO.x=index[TexCd.x * (ArrSize-1)];
PosO.y=index2[TexCd.x * (ArrSize-1)];


Out.Pos = mul(PosO, tWVP);
Out.TexCd = mul(TexCd, tTex);

return Out;
}

910デフォルトの名無しさん2017/12/05(火) 16:14:07.63ID:D/e4ygg6
あとPSとVSのバージョンは3.0までしかソフトウェアが対応していません。
DX9の環境です。
よろしくお願いします。

911デフォルトの名無しさん2017/12/05(火) 20:03:21.35ID:pLTMnh9T
DX9だと入力のメッシュを320*240にしないと難しいよ

912デフォルトの名無しさん2017/12/06(水) 07:35:08.83ID:wUCWLeX9
その場合、単一のメッシュ(320*240)をピクセル毎になるように分割する、ということになるのでしょうか?
幸い、メッシュを任意個に分割するノードがvvvvにはあります。

913デフォルトの名無しさん2017/12/06(水) 14:41:43.41ID:JYUSgfd5
おまえ、人に聞いてばっかだな
マジ寄生虫

914デフォルトの名無しさん2017/12/06(水) 17:04:03.53ID:wUCWLeX9
流石に潮時ですかね
スレ汚し失礼しました
ただ、具体的な回答があればもっと早く消えていたのですが。
残念です。

915デフォルトの名無しさん2017/12/14(木) 23:24:46.89ID:EX9aqF1y
このスレはバカしかいないからな

916デフォルトの名無しさん2017/12/16(土) 12:16:16.86ID:mmje4ODI
自己紹介

917デフォルトの名無しさん2018/02/04(日) 21:11:37.50ID:DR0CpTml
DirectXも終わりかな

918デフォルトの名無しさん2018/02/04(日) 21:43:22.78ID:BflI37ma
まだ終わらんよ

919デフォルトの名無しさん2018/02/05(月) 15:47:52.04ID:D7qesvRf
CreateCompatibleBitmapでメモリビットマップを作成し、
それに対してGDIのDrawTextで描画し、それを画面にBitBltするという、
昔からよくある手法で画面に大量の文字を描画する処理があるのですが、
DirectWriteに置き換えると文字を綺麗にできると聞きました。

CreateCompatibleBitmapなどの仕組みは残したまま、
メモリビットマップへのDrawTextの部分を置き換えることは可能でしょうか?
よいサンプルがあれば勉強してみたいのですが。

920デフォルトの名無しさん2018/02/05(月) 18:26:14.26ID:qXocenM+
>>919
GDIでTextOut/DrawTextやってる程度なら出力先をGDIとしてDirect2D上に描画

Direct2D and GDI Interoperability Overview
https://msdn.microsoft.com/en-us/library/windows/desktop/dd370971
Rendering DirectWrite
https://msdn.microsoft.com/en-us/library/windows/desktop/ff485855.aspx

文字単位で凝った処理してるならリンク先にもあるけどDrawGlyphRunというメソッド中心で調査されたし

リッチなレンダリング目的ならどの方法でやるにしても
既定だと基本的にGDI互換の方向で描画して大差無いので
IDWriteRenderingParamsを適切に設定する

921デフォルトの名無しさん2018/02/06(火) 11:46:02.28ID:tlS6x/He
>>920
ありがとうございます。
わからない仕組みばかりですが、勉強してみます。

922デフォルトの名無しさん2018/02/06(火) 12:56:29.36ID:HnlXhHfV
テクスチャに描画は知ってた方がよくね

923デフォルトの名無しさん2018/02/09(金) 15:51:11.72ID:ukoLQzoH
そんなの誰だって知ってるよだろw

924デフォルトの名無しさん2018/02/10(土) 11:37:08.60ID:nvNZfDk8
文字サイズ固定ならテクスチャが最強だよね

925デフォルトの名無しさん2018/02/10(土) 19:32:54.48ID:/TjPUdsq
低レベルな争いだなあ(´・ω・`)

926デフォルトの名無しさん2018/02/11(日) 01:05:56.81ID:WMQeXuiD
本当にやりたいことを聴かずに遠回しに質問するからだよ

927デフォルトの名無しさん2018/02/11(日) 18:35:56.75ID:3GTkA4HB
質問の目的は明確だし1レス目の回答で完了してるのに
どんだけバカが揃えばこんなうんこみたいな流れになるんだ...

928デフォルトの名無しさん2018/02/17(土) 11:36:46.23ID:0Y0wbDyD
頂点を射影変換して、さらにクリッピングまでされた頂点をテッセレーションで分割したいのですが、
パイプラインの流れ的に普通にはできません。

やれるとしたら、ジオメトリシェーダでプログラマブルにクリッピングして、
それをストリームアウトし、再度頂点シェーダから読み込んでテッセレーションするというやり方でしょうか?
プログラマブルなクリッピングが可能かどうかが問題ではりますが・・・。

もっといい方法があれば教えてほしいです。

929デフォルトの名無しさん2018/02/17(土) 14:07:50.33ID:2QbLbnEt
クリッピング最後じゃいかんの

930デフォルトの名無しさん2018/02/17(土) 15:15:17.47ID:zOfD1Lkw
4ヶ月ぶりに覗いたけど
相変わらずかそってんのな
amdのfetch4ってgatherredで効くの?
Sample()で4点フェチして自前でバイリニアすると(dx9のshadowmapのサンプル)
ちゃんと補完されるのに
gatherredだとモザイクみたくなるんだよな
コツ教えて

9319282018/02/17(土) 16:01:19.76ID:A6BmBrel
>>929
クリッピング後じゃないとダメなんです

932デフォルトの名無しさん2018/02/19(月) 15:18:33.91ID:LkkqjNZ1
ピクセルシェーダはピクセル単位だし
クリッピングされた頂点が欲しいというなら
これは不適当だ
アンタの言うとおり
ジオメトリで三角形分割して
ストリームアウトプットしか無いんじゃないか

933デフォルトの名無しさん2018/02/20(火) 12:16:25.68ID:/DCDJ0JE
何がしたいのか、サッパリわからん。
この説明だと、二次元に落とし混んだ後に三次元計算したい!と無理なロジックを考えとるように聞こえるの。

934デフォルトの名無しさん2018/02/20(火) 12:24:07.25ID:/DCDJ0JE
そもそも「クリップ」が何を、どのような結果を期待しているのか?がわからない。

「ワールド座標内から三次元に空間を切り取りたい」
だけならば、頂点シェーダで空間外にある頂点を捨てれば済む訳なんだが、
するとドメイン、ハルシェーダに流し込むべきプリミティブの整合がなくなる。

そうなるとジオメトリシェーダでプリミティブ単位で落とすことになるが、これだとパイプラインの工程に制約され、テセレータに戻すには二バス目が必須となる。

935デフォルトの名無しさん2018/02/20(火) 12:29:55.68ID:/DCDJ0JE
書きながらなんとなく、メッシュをピクセル単位で落としたい、
メッシュの衝突をシェーダでやりたいのかと思ったが、そうなるとテセレータが欲しいという意図が不明。

もちっと具体的に実現したい結果を説明しないと有意義な答えは出てこないと思う。

936デフォルトの名無しさん2018/02/20(火) 12:34:30.91ID:/DCDJ0JE
シェーダは別に1パスであらゆることが実現できるようには設計されていない、
一般的な三次元描画のセオリーを基軸にして、高速に計算できるように設計している。

パイプラインのフローに合わないものを実現するならば、マルチパスにするか、アルゴリズムを変えないと実現できずにアシぶみするだけ。

937デフォルトの名無しさん2018/02/20(火) 14:06:33.85ID:ZhrEO/E0
930だがcapsviewerみたらshader _gather4がoffだった
このせいか?
GPUは超最新のRX470だから意外だ・・

クリッピングに関しては
やってることがおかしいのは
皆わかっていることだろう
大事なのは本人が満足することであって
忠告は余計なお世話だ

938デフォルトの名無しさん2018/02/20(火) 18:24:40.52ID:ptcA/Sk+
仰有る通りです。

939デフォルトの名無しさん2018/02/20(火) 18:40:51.90ID:Q8WKYTfx
1パスでやるなら一つ方法がある。
頂点シェーダは頂点番号を引数に取れたはずだから、三角形リスト(ようはストリップとファン以外)を前提に頂点番号の剰余をとる。
あとは定数バッファにクリップしたい空間をいれるなりする。

というか、クリップしたいのが何なのかがわからんと、これでいけるのかもわからんが。

940デフォルトの名無しさん2018/02/20(火) 18:53:53.14ID:NF5x4bMT
そうだ。俺が知る限り、ピクセルシェーダ以外にdiscard命令はないから、厳密にはクリップはできないと思う。
これはプリミティブの一貫性を担保出来なくなるからだと思う。

つまりクリップ後じゃないとダメというなら、それはかなり無理をしないと実装しにくいと思います。

おわり

941デフォルトの名無しさん2018/02/20(火) 19:35:33.56ID:u4AWVd2v
Direct3Dの描画はプリミティブ単位だからね
三角形や線とかな
だから頂点シェーダで頂点を破棄なんて
そもそもナンセンス
大体頂点を破棄したら三角が線になっちまうしな

クリッピングってのは平面に交差した三角形を破棄し
その接触してた境界線を使って
1〜2個の三角形を作って追加することだな
掻い摘まむと

942デフォルトの名無しさん2018/02/20(火) 19:39:01.32ID:u4AWVd2v
それにクリッピングしてない三角形と
クリッピングして半分サイズになった三角形を
それぞれテッセレーションかけたとして
描画に差が出るとは思えないんだよな
結局出来る絵は一緒だろみたいな

9439282018/02/20(火) 21:55:02.19ID:o7gc+o+D
みなさん、ご意見ありがとうございます!

ジオメトリシェーダーでプログラマブルにクリッピングし、
次のパスでテッセレーションさせる方法で思惑通りにできました。
品質、パフォーマンスともにばっちりです。
プログラマブルシェーダの威力を今までで一番実感できましたw

入力頂点や最終的な表現が少々特殊なアプリケーションなので、こんなことしてます^^;

944デフォルトの名無しさん2018/02/21(水) 05:52:54.40ID:4FJWcrHN
特殊学級逝け

945デフォルトの名無しさん2018/02/21(水) 06:44:11.37ID:3DX90cKY
なんかできない理由を引き出すことが目的だったみたいだね。

946デフォルトの名無しさん2018/02/21(水) 10:51:47.16ID:zwuXHePG
>>941-942
ほんそれ

947デフォルトの名無しさん2018/02/21(水) 21:15:13.73ID:PIrsuTwG
プロかアマか知らんが
実際にテッセレーション使う
アプリがあることに驚きだ

948デフォルトの名無しさん2018/02/22(木) 03:58:30.48ID:uf68Vai0
モデラーソフトウェアが曲面を出力しないからね。
俺はデザイン段階のメッシュ生成に使うぐらいだな
ランタイムは使い処がない。元が面しかないから

新着レスの表示
レス数が900を超えています。1000を超えると表示できなくなるよ。
レスを投稿する