Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
5
Help us understand the problem. What is going on with this article?
@bregade

DirectX11 Map UnmapのGPUによる挙動の違いについて

私が使っていたノートPCで
DirectX11のAPIをよく理解していなかったために起きた事象を記録します
ノートPCでGPUが付属している環境の方でDX10以降の学習をされている方は
同じ過ちをしないことを望みます。

ここで使っているFBXの描画処理は下記サイトの方法を参考にしました
http://gameworkslab.jp/プログラム記事まとめ/ライブラリ/

3Dモデルについてはこちらのものをお借りしています
http://6b.u5ch.com/others/downloads/index.html

■使用PC 下記の構成のモデルを利用しています
・SurfaceBook2
 ・プロセッサ:Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz (8CPUs), ~2.1GHz
 ・GPU 0:Intel(R) UHD Graphics620
 ・GPU 1:NVIDIA GeForce GTX1060
■環境
・VisualStudio2017 , DirectX11 C++

SurfaceBook2では、下記画像のようにExeファイルに対して右クリックを押した時、
インテルのGPUとNvidiaのGPUを切り替えることができます。

   

これを切り変えた時に、個人で作っていた描画プログラムが不正になっていたことがわかりました

(左)Intel(R) UHD Graphics620で描画 調査のためモデルを拡大表示(右)GeForce GTX1060:小さく表示される

GeForce GTX1060のドライバーを最新にしても変化がなく、
参考にしていた http://gameworkslab.jp/プログラム記事まとめ/ライブラリ/
ここのDirectX9のプログラムで両GPU切り替えた場合に同モデルが正常に描画できていることがわかり、
DirectX11のコード側が誤っていると推測されました

DirectX11はVisualStudioのデバッグ機能でシェーダプログラムのパイプラインを見ることができるので、
調べてみます
(左)Intel(R) UHD Graphics620で描画  (右)GeForce GTX1060:

比較してわかった上記情報をもとに原因箇所を特定

Intel(R) UHD Graphics620 はD3D11_MAPPED_SUBRESOURCE の pDataの値を読み込めている
09_intel_vtxlock.PNG

NVIDIA GeForce GTX1060 では読み込めていない
010_nvidia_vtxlock.PNG

結果をもとに修正をしたスキニング部分の処理の例です (右側が両GPUで正常に動作するコード)
11_gpudiff.PNG

(ここでnew,deleteしているのはもちろん好ましくありません。後日処理をうつしました)
両GPU共に意図通りの描画結果となりました (サボテンの位置が違うのはここでは気にしなくていいです)

■上記結果からまとめ
・インテルの統合型グラフィックスGPUはオンボードなため、本来は読みだせないであろうmap APIから得たD3D11_MAPPED_SUBRESOURCEのpData で情報を読み込めてしまっていたように推察され、
書き換え可能なものと勘違いしていたと考えられる。(おそらくオンボードGPUで起きうる)
→これを逆に理解した上で利用することで、
 統合型GPUに対する最適な処理を書くことが可能ともいえそうです

・CPUでメッシュのスキニングをやりたい場合は
 上記理由より、モデル毎に頂点情報を重複して保持することになる
 (のでGPUスキニングに移そうと思います)

■教訓
・D3D11_MAP_WRITE_DISCARDフラグはGPU側は全領域更新を想定しているため
 Map,Unmapで操作したい情報はCPUで保持して書き換える
・VisualStudioのグラフィックスデバッグで最初から頂点情報が不正である場合、
 前段階でこういった事象がおきていないか疑う

やっとSurfaceBook2のGTX1060が使えそうです...

5
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
bregade

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
5
Help us understand the problem. What is going on with this article?