タグ付けされた質問 「directx」

DirectXは、主にゲーム開発者を対象としたMicrosoftのマルチメディアAPIのセットです。DirectXコレクション内の人気のあるAPIには、Direct3D、XInput、およびXAudioが含まれます。

2
別々のスレッドで更新してレンダリングする
シンプルな2Dゲームエンジンを作成しています。スプライトをさまざまなスレッドで更新してレンダリングし、その方法を学びたいと思います。 更新スレッドとレンダリングスレッドを同期する必要があります。現在、2つのアトミックフラグを使用しています。ワークフローは次のようになります。 Thread 1 -------------------------- Thread 2 Update obj ------------------------ wait for swap Create queue ---------------------- render the queue Wait for render ------------------- notify render done Swap render queues ---------------- notify swap done この設定では、レンダリングスレッドのFPSを更新スレッドのFPSに制限しています。さらにsleep()、レンダリングと更新の両方のスレッドのFPSを60に制限するために使用するので、2つの待機関数はそれほど待機しません。 問題は: 平均CPU使用率は約0.1%です。場合によっては、25%に達することがあります(クアッドコアPCの場合)。これは、待機関数がテストおよび設定関数を使用したwhileループであり、whileループがすべてのCPUリソースを使用するため、スレッドが他のスレッドを待機していることを意味します。 私の最初の質問は:2つのスレッドを同期する別の方法はありますか?私は気づいたstd::mutex::lock、それは、whileループではないので、リソースをロックするために待っている間、CPUを使用しないでください。どのように機能しますか?std::mutex1つのスレッドでロックし、別のスレッドでロック解除する必要があるため、使用できません。 他の質問です。プログラムは常に60 FPSで実行されるため、CPU使用率が25%に急上昇することがあるのはなぜですか。(2つのスレッドはどちらも60fpsに制限されているため、理想的には多くの同期は必要ありません)。 編集:すべての返信をありがとう。まず、レンダリングのためにフレームごとに新しいスレッドを開始しないようにしたいと思います。最初に、更新とレンダーループの両方を開始します。マルチスレッディングで時間を節約できると思います。FastAlg()とAlg()という関数があります。Alg()は私の更新objとrender objの両方であり、Fastalg()は私の「レンダーキューを「レンダラーに送信」」しています。シングルスレッドでは: Alg() //update FastAgl() Alg() //render 2つのスレッド: Alg() //update while …

3
画面の一部のみを詳細にレンダリングする
グラフィックスが大きな視野角でレンダリングされる場合(非常に大きなテレビやVRヘッドセットなど)、ビューアは実際には画像全体に焦点を合わせることができず、その一部だけに焦点を合わせることができません。(実際、これは通常サイズの画面にも当てはまります。) 視聴者の目を追跡する方法(ほとんどの場合VRで実行可能です)と組み合わせると、理論的にこれを活用して、グラフィックスを視聴者の焦点から遠ざけ、徐々に細部と解像度を下げて、知覚される品質を失うことなくパフォーマンスを得ることができます。 これを利用できる、または現在開発中のテクニックはありますか?

1
グラフィックの状態とコンポーネントを管理していますか?
グラフィックスを扱うとき、私はしばしば多くの時期尚早な最適化を行う傾向があります。私が常に従おうとするいくつかの原則があります。 D3Dコンポーネントの数を最小限に抑えます。(レンダリング状態、バッファー、シェーダーなど) どうしても必要な場合にのみコンポーネントをバインドします。(まだバインドされていないなど) コンポーネントをできる限り専門化します。(必要なBindFlagsのみを設定するなど) これにより、作成されたコンポーネントと現在のパイプライン状態を管理するための非常に手の込んだラッパーを構築することになりました。これは私の貴重な開発時間の多くを消費するだけでなく、複雑さをさらに大きくします。 そして最悪の事態: 場合、それがすべてトラブルに値するかどうかさえ知りません。 私の最適化の考慮事項のいくつかは、すでに下位レベルで実装されている可能性があり、それらを複製しているだけで、CPUの時間をさらに浪費しています。パフォーマンスへの影響は無視できるため、他の考慮事項は完全に不要な場合があります。 だから私の質問は: 上記のガイドラインのうちどれが有効で、どの程度遵守する必要がありますか? GPUは状態の変化をどのように処理しますか? 使用されていない状態を変更するとどうなりますか?(アクティブな間は、描画呼び出しは行われません。) さまざまな異なるコンポーネントをバインドするための実際のパフォーマンスペナルティは何ですか? 他にどのようなパフォーマンスの考慮事項を行う必要がありますか? 実際の制限に達するまでは、パフォーマンスについて気にしないでください。それは明らかに実用的な見地からは真実ですが、私は主に理論に興味があります。どういうわけか、最適なグラフィックスフレームワークを構築するという衝動と闘う必要がありますが、通常の「時期尚早の最適化講義」ではそれを実現できないと思います。 コンポーネントの管理 現在、SlimDXをマネージラッパーとして使用して、DirectX 11アプリケーションをC#で作成しています。これは非常に低レベルのラッパーであり、私の現在の抽象化はその上に構築されています。 Direct3D抽象化を使用する場合、いくつかの明らかな利点があります。環境の設定、シェーダーの読み込み、定数の設定、メッシュの描画は、はるかに簡単で、使用するコードが大幅に少なくなります。また、ほとんどのコンポーネントの作成と破棄を管理するため、どこでも自動的に再利用でき、メモリリークをほぼ完全に回避できます。 通常、すべてのグラフィックコンポーネントとリソースをどのように管理しますか? 以下の私の例と同様のことを行うマネージラッパーを推奨できますか? これが私の現在の実装例です。インターフェースにとても満足しています。私のニーズに対して十分な柔軟性があり、使用および理解が非常に簡単です。 // Init D3D environment var window = new RenderForm(); var d3d = new Direct3D(window, GraphicsSettings.Default); var graphics = new GraphicsManager(d3d.Device); // Load assets var mesh = GeometryPackage.FromFile(d3d, "teapot.gp"); …

4
HLSLシェーダーは実際にレンダー出力にどのように影響するのですか?
私はHLSLの構文を理解しています。たとえば、これを自分のHLSLであるとしましょう。 struct VOut { float4 position : SV_POSITION; float4 color : COLOR; }; VOut VShader(float4 position : POSITION, float4 color : COLOR) { VOut output; output.position = position; output.position.xy *= 0.7f; // "shrink" the vertex on the x and y axes output.color = color; return output; } float4 PShader(float4 position …
11 directx  hlsl 

2
Table.drawDebugはlibGDXでは非推奨であるため、代わりに何を使用する必要がありますか?
私は「Learning LibGDX Game Development」の本に従ってシンプルなゲームを作成しています。私は、ステージを作成してデバッグ境界線でレンダリングするメニュー作成セクションにいます。 本は使用するように言っていますTable.drawDebug(stage)が、この静的メソッドはフレームワークTableクラスから完全に削除されたようです。 インポートしていcom.badlogic.gdx.scenes.scene2d.ui.Tableます。以下は私のコードです: @Override public void render(float deltaTime) { Gdx.gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); if (debugEnabled) { debugRebuildStage -= deltaTime; if (debugRebuildStage <= 0) { debugRebuildStage = DEBUG_REBUILD_INTERVAL; rebuildStage(); } } stage.act(deltaTime); stage.draw(); Table.drawDebug(stage); } 最後の行にTable.drawDebug(stage);はコンパイルエラーがあります"The method drawDebug(ShapeRenderer) in the type Table is not applicable for the …

3
2DゲームでDX10 / 11を使用することに何か利点はありますか?
私はDX10 / 11クラスのハードウェアによって導入された機能セットに完全に精通していません。ジオメトリシェーダー、計算シェーダー、新しいテッセレーションステージなど、プログラム可能なグラフィックスパイプラインに追加された新しいステージについては、漠然と精通しています。しかし、これらのどれが2Dゲームの違いを大きく変えるかはわかりません。 2DゲームをDX10 / 11(またはOpenGLの同等物)に切り替える説得力のある理由はありますか、または市場のかなりのシェアが古い技術(例: 2012年2月のSteam調査では、約17%のユーザーがまだWindows XPを使用していると回答しています)?
10 2d  graphics  directx 

6
Visual Studio 2012とゲーム開発[終了]
閉まっている。この質問はトピックから外れています。現在、回答を受け付けていません。 この質問を改善してみませんか? 質問を更新して、ゲーム開発スタック交換のトピックになるようにします。 5年前休業。 わかりました。簡単な質問だと思いますが、いくつかの回答を見つけるのが難しくなりました。 XNAはVisual Studio 2012にはないことを既に読みました。最近XNAの使用方法を学びましたが、ゲームで作業したいので、Visual Studio 2012でC#を使用してゲームを開発する方法があるかどうか知りたいです。 、またはC ++とDirect3Dを使用してすべてをもう一度学ぶ必要がある場合はどうなりますか? C#は私が大好きな言語なので、C#でそれを行う方法がなくても、ゲーム開発にJavaを使用するのが非常に簡単なものであれば、私も興味があります。 どうもありがとう!
10 xna  c#  3d  directx  .net 

3
DirectX 10からDirectX 11への移行
DirectX 9を使用して妥当な数の小さな趣味のプロジェクトを実行しましたが、ここでDirectX 11に移行する時が来ました。 私は、DirectX 10を使用した3Dプログラミングに関するFrank Luna'aの本を持っていますが、DirectX 11には何もありません。それらはかなり似ていると思いますが、知っておく必要があるコードレベルで主な違いを列挙できるかどうか疑問に思っていました(または既存のソースをポイントします)。
10 directx 


1
2D水上面プロファイル
頂点フラグメントシェーダーを使用して、水面の厚さの効果を作成しようとしています。 私は3Dゲーム環境にいますが、それはスクロールビューなので、「2D」ビューです。 以下は、フラグメントシェーダーを使用して実際の2Dでこのような効果を作成するための優れたチュートリアルです。 しかし、これは私の場合には使用できないと思います。今のところ、屈折を適用するのは平面だけです。 そして、水厚効果を適用したいです。しかし、私はそれを行う方法がわかりません。 現時点では、頂点を使用して水の変形/変位を作成しようとはしていません。これはポイントではありません。 シンプルなクワッドで可能かどうかはわかりませんが、このようなオブジェクトを使用する必要があるかもしれません。 下記は用例です。 この効果をどのように作成するかについては、私にはまったくわかりません。 どうもありがとう ! [ 編集 ]レイマンウォーターエフェクトが追加され、エフェクトの参照が改善されました。

2
D3D / DXGIは全画面遷移を処理します
D3D11アプリケーションがあり、適切なフルスクリーンサポートを追加したい。これで、DXGIでウィンドウを全画面表示に切り替えることができます。スワップチェーンをブリットする代わりに、フロントチェーンとバックバッファーをフリップするために必要なすべてをDXGIが処理するという印象を受けました。 ただし、DXGIにスイッチを実行させると、マルチモニターセットアップでは信頼性が低いようです。切り替え後のセカンダリ画面は、明確な理由やパターンがないため、長時間にわたって完全に真っ黒のままです。 フルスクリーンウィンドウと残りのデスクトップが他の画面に表示されるまで、数回切り替えて切り替える必要があります。 どうやら私はこれだけではないようですが、Battlefield 3とWoWには多くの人にとって同様の問題があるようです。 さて、実際の質問:これらのAAAゲーム開発会社でさえこれを機能させることができないので、私の最大の望みは、どういうわけか自分でフルスクリーンに切り替えることです。 ウィンドウ/スワップチェーンを適切なバッファフリッピングフルスクリーンモードに上げるためにできることはありますか?

3
Windows 8は引き続きDirectX 9をサポートしていますか?
Windows 8はDirectX 9をサポートしていますか?私は、Windows 8のために作られたC ++とDirectX 9で書かれたいくつかのサンプルを見ていたのでそれは私がここに(一見それを知っていたようではない、ということhttp://directxtutorial.com/Lesson.aspx?lessonid=111-4-2)。たとえば、COMでのDirectXの初期化: ComPtr<ID3D11Device1> dev; ComPtr<ID3D11DeviceContext1> devcon; 私は古い方法でそれを知っているので、それはただ奇妙です。 ID3D11Device *dev; ID3D11DeviceContext *devcon; (私が伝えたいことをご理解いただければ幸いです) 彼らがリリースした新しいOSのために、それが完全に変わっていないことを願っています。
9 c++  directx  windows 

1
gluLookAtはどのように機能しますか?
私の理解から、 gluLookAt( eye_x, eye_y, eye_z, center_x, center_y, center_z, up_x, up_y, up_z ); 以下と同等です。 glRotatef(B, 0.0, 0.0, 1.0); glRotatef(A, wx, wy, wz); glTranslatef(-eye_x, -eye_y, -eye_z); しかし、ModelViewマトリックスを出力すると、への呼び出しがglTranslatef()正しく機能していないようです。コードスニペットは次のとおりです。 #include <stdlib.h> #include <stdio.h> #include <GL/glut.h> #include <iomanip> #include <iostream> #include <string> using namespace std; static const int Rx = 0; static const int Ry …

2
シーン内の多くのライトを処理する(シェーダーを使用)
シーンで多くのライトを処理する方法に興味があります。ダンジョン(ライトがそこにある)などのロールプレイングゲームの非常に大きなマップを考えると、遅延照明については知っていますが、それは多くのライトをレンダリングする方法にしか答えません。しかし、私の質問は次のとおりです。多くのライトをレンダリングしない方法。シーンに影響を与えるライトのみをレンダリングすることが明らかに望ましいですが、これをアーカイブするためのテクニック/アルゴリズムはわかりません。地図のどこかにあるからといって、500のポイントライトをレンダリングすることを望んだり、レンダリングしたりすることはできません。しかし、光からプレーヤーまで直線を取り、その間に何かがあるかどうかをテストすることはできません。距離も良い指標のようには見えません。(日光?) tl; dr:どのライトがシーンに影響を与えてそれらをレンダリングするだけなのか、どうしたらわかりますか?

4
フルスクリーンクワッドでレンダーターゲットにピクセルパーフェクトレンダリング
一連の値をレンダーターゲットにレンダリングするときに問題が発生します。値が、希望する正確な範囲になることはありません。基本的に、フルスクリーンクワッドとピクセルシェーダーを使用してレンダーターゲットテクスチャにレンダリングし、テクスチャー座標をシェーダーでのいくつかの計算の基礎として使用するつもりです。左上隅の(0,0)から右下隅の(1,1)までのクワッド範囲のテクスチャ座標...問題は、補間後、これらの値がピクセルシェーダーに到達しないことです。 。 例: 4x4テクスチャにレンダリングし、この場合のシェーダーは、赤と緑のチャネルでテクスチャ座標(u、v)を出力するだけです。 return float4(texCoord.rg, 0, 1); そこから取り出したいのは、左上のピクセルがRGB(0,0,0)であり、したがって黒であるテクスチャであり、右上のピクセルがRGB(255,0,0)であり、したがって明るい赤と左下のピクセルはRGB(0,255,0)-明るい緑です。 しかし、代わりに私はこれをここの右側に取得します: (直線四角形レンダリング、補正なし) 左上のピクセルは黒ですが、他のコーナーでは比較的濃い赤と濃い緑しか表示されません。それらのRGB値は(191,0,0)と(0,191,0)です。私はそれがクワッドのサンプリング位置に関係していると強く思います:左上のピクセルはクワッドの左上隅を正しくサンプリングし、UV座標として(0,0)を取得しますが、他のコーナーのピクセルはクワッドの他のコーナー。左の画像でこれを示しました。四角形を表す青いボックスと、上部のサンプリング座標を表す白いドットです。 これで、Direct3D9で画面揃えのクワッドをレンダリングするときに座標に適用する必要があるハーフピクセルオフセットについて知っています。これからどのような結果が得られるか見てみましょう: (DX9のハーフピクセルオフセットでレンダリングされたクワッド) 赤と緑が明るくなりましたが、まだ正しくありません。赤または緑のカラーチャネルで取得できる最大値は223です。しかし今、私はもう純粋な黒すら持っていませんが、代わりにRGB(32,32,0)の暗い黄色がかった灰色です! 私が実際に必要とするのは、この種のレンダリングです。 (ターゲットレンダー、縮小されたクワッドサイズ) 最初の図と比較して、クワッドの右と下の境界線を1ピクセル上および左に移動する必要があるようです。次に、右側の列と一番下の行のピクセルはすべて、クワッドの境界から正しくUV座標を取得します。 VertexPositionTexture[] quad = new VertexPositionTexture[] { new VertexPositionTexture(new Vector3(-1.0f, 1.0f, 1f), new Vector2(0,0)), new VertexPositionTexture(new Vector3(1.0f - pixelSize.X, 1.0f, 1f), new Vector2(1,0)), new VertexPositionTexture(new Vector3(-1.0f, -1.0f + pixelSize.Y, 1f), new Vector2(0,1)), new …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.