Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

BlazeX

Alter Hase

  • »BlazeX« ist der Autor dieses Themas

Beiträge: 478

Wohnort: DD

Beruf: Maschinenbau-Student

  • Private Nachricht senden

1

19.01.2010, 22:51

[Erledig][D3D10] Auflösungen? Multisampling? -> ConfigDia

Hi Leute!
Edit: Wen's nicht interessiert, überspringt bitte diesen ersten Absatz.
Ich habe mich entschieden auf D3D10 umzusatteln, weil ich es satt habe, dass andauernd Leute zu mir kommen und sagen: Deine Programme laufen bei mir nicht! Mach doch mal was für meinen (schwachen, 3dgrafiknichtunterstützenden) PC.
Jedenfalls habe ich so einige Probleme vor allem mit den Grafikfunktionen.
Ich frage ja extra: Schafft das deine Graka? -> Ja glaub schon...
Und dann werden nicht mal die ordentlichen RTT-Formate unterstützt! :evil:
Deshalb will ich umsatteln! D3D10 setzt schonmal Mindestvoraussetzungen an die Graka. Sehr gut! Natürliche Auslese!
Jetzt wird keiner kommen mit: glaub schon, dass die D3D10 "kann".
Win7 (bzw. Vista) ist eh im kommen. Was spricht also dagegen?
Ja gut, es gibt D3D11. Aber ich habe nicht vor mir selbst jetzt schon ne neue Graka zu gönnen. Ich bin mit meiner 9800GX² BlackPearl sehr zufrieden.

Edit: hier geht's los:

Ich habe vor mir so einen Config-Dialog zusammenzubasteln.
Da D3D10 standardmäßig den Standard-Adapter benutzt (und ich da nichts dagegen habe) will ich den auch automatisch benutzen. Aber da fängt es schon an.
Von D3D9 kennt man ja: für jeden Bildschirm einen Adapter mit verschiedenen Video Modes (Auflösungen).
DXGI sagt Adapter (Graka) mit Outputs (Monitor) mit vielen VideoModes.

Lange Reder kurzer Sinn: Wie schreibe ich einen Config-Dialog für D3D10?
Ich will nicht wissen, wie man einen Dialog schreibt!
Das hier müsste ich alles unterbringen:
- Auflösung + Frequenz (in einem Punkt)
- MSAA
- AF
- Fullscreen (sollte klar sein)
- VSync

Bin ich mit dieser DXGI-Geschichte (Factory, Adapter, Output) auf dem richtigen Weg?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

20.01.2010, 10:46

Re: [D3D10] Auflösungen? Multisampling? -> ConfigDialog?

Zitat von »"BlazeX"«

Ja gut, es gibt D3D11. Aber ich habe nicht vor mir selbst jetzt schon ne neue Graka zu gönnen.


Brauchst du nicht. Ich würde dir empfehlen gleich D3D11 zu verwenden. Die API ist praktisch identisch mit D3D10, einziger Unterschied ist dass alle 10er zu 11er werden :p (ein D3D10 Programm nach D3D11 zu konvertieren geht also praktisch mit der suchen/ersetzen Funktion). Gut natürlich hat man die neue Trennung von Device und Context drin aber auch das is schnell umgebaut. Neue Hardware brauchst du nicht da D3D11 feature levels einführt. D3D11 lauft sogar wieder auf D3D9 Hardware nur halt mit einem entsprechend begrenztem (aber definiertem!) Satz an Features. Die D3D11 Features (Tesselation, Dynamic Shader Linkage) hast du natürlich nur auf D3D11 Hardware zur Verfügung, wobei die neuen Compute Shader zum Teil auch auf D3D10 Hardware laufen, allerdings nur unter Windows 7.

Zitat von »"BlazeX"«

Bin ich mit dieser DXGI-Geschichte (Factory, Adapter, Output) auf dem richtigen Weg?


Ja

BlazeX

Alter Hase

  • »BlazeX« ist der Autor dieses Themas

Beiträge: 478

Wohnort: DD

Beruf: Maschinenbau-Student

  • Private Nachricht senden

3

20.01.2010, 16:40

Um nochmal auf diese DXGI-Geschichte zurückzukommen:
Da gibt es Adapter (Graka), die "rendern" und Outputs(Monitor) auf den ausgegeben wird.
Beim erstellen eines Adapters, kann ich eine SwapChain gleich mit erzeugen lassen. Wie kann ich dieser Swap-Chain einen Monitor (Output) zuweisen?

Kennt jemand ne Skizze, die Device, DeviceContext, SwapChain, und das ganze zum Rendern mal in einen ordentlichen, begreifbaren Zusammenhang bringt?


Noch was: Kann ich jetzt HDR und AA nutzen?
Ich gehe mal vom DX10 Feature Level aus.

BlazeX

Alter Hase

  • »BlazeX« ist der Autor dieses Themas

Beiträge: 478

Wohnort: DD

Beruf: Maschinenbau-Student

  • Private Nachricht senden

4

20.01.2010, 20:29

Na los Leute! Sagt bitte was ihr wisst. Oder bin ich hier der einzige, der sich über D3D9 hinausgetraut hat?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

20.01.2010, 20:53

Zitat von »"BlazeX"«

Um nochmal auf diese DXGI-Geschichte zurückzukommen:
Da gibt es Adapter (Graka), die "rendern" und Outputs(Monitor) auf den ausgegeben wird.
Beim erstellen eines Adapters, kann ich eine SwapChain gleich mit erzeugen lassen. Wie kann ich dieser Swap-Chain einen Monitor (Output) zuweisen?


Eine Swapchain ist, wie in D3D9, an ein Fenster gebunden. Um die auf einen bestimmten Output zu tun platzierst du einfach das Fenster dort.
Adapter an sich kannst du nicht "erstellen", du meinst wohl das D3D Device da geht das und wenn du das tust funktioniert im Prinzip alles gleich wie in D3D9. Ein Hinweis vielleicht noch: Wenn du mit DXGI rumspielst verwend unbedingt für alles die selbe IDXGIFactory Instanz außer du hast einen genauen Grund es nicht zu tun. Wenn du D3D11 verwendest musst du übrigens DXGI 1.1 verwenden (also die IDXGIFactory1 etc.)

Zitat von »"BlazeX"«

Kennt jemand ne Skizze, die Device, DeviceContext, SwapChain, und das ganze zum Rendern mal in einen ordentlichen, begreifbaren Zusammenhang bringt?


Kenn ich keine aber im Prinzip is das eigentlich genau gleich wie in D3D9.
Eine Swapchain is im Prinzip ein Display wo du hinrenderst (also die Backbuffer und der Frontbuffer). Das was früher in einem Device Objekt zusammen war ist jetzt aufgeteilt auf den Device und den DeviceContext. Der Device ist die Schnittstelle die sich um die Ressourcenverwaltung kümmert (also Ressourcen erstellen etc.) und der Context ums Rendern (DrawPrimitive() etc). Das hat den Sinn dass du mehrere Contexts haben kannst um in mehreren Threads parallel zu rendern. Erstmal sollte es wohl reichen wenn du einfach den Device (Ressourcenverwaltung) und den Immediate Context (Rendern) verwendest. Den Immediate Context liefert dir schon das CreateDevice bzw du bekommst ihn mit Device->GetImmediateContext().


Zitat von »"BlazeX"«

Noch was: Kann ich jetzt HDR und AA nutzen?

Ja

BlazeX

Alter Hase

  • »BlazeX« ist der Autor dieses Themas

Beiträge: 478

Wohnort: DD

Beruf: Maschinenbau-Student

  • Private Nachricht senden

6

20.01.2010, 21:19

Selbst in D3D9 hab ich nicht mit SwapChains gearbeitet.
Da hatte ich immer 1 Fenster mit fester Fenstergröße, 1 Backbuffer und daran hat sich nichts geändert.
Man konnte das Fenster also nicht skalieren (warum auch?).
Deshalb hatte ich auch ein paar Probleme mit dem Verständnis.
Ich hab aber mal ne Übersicht erstellt, die ausbauen will.
Ist das so in Ordnung?

(Link)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

21.01.2010, 00:26

jo schaut gut aus^^

BlazeX

Alter Hase

  • »BlazeX« ist der Autor dieses Themas

Beiträge: 478

Wohnort: DD

Beruf: Maschinenbau-Student

  • Private Nachricht senden

8

21.01.2010, 11:23

Sehr gut. Das SwapChain Problem wäre geklärt.
Aber wiedre zurück zum eigentlichen Problem: Der Settings-Dialog

Für D3D9 habe ich schon einen ordentlich funktionierenden Settings-Dialog geschrieben. Hier ein Screenshot:

(Link)

Und genau so einen will ich auch für D3D11 schreiben. Aber wie?
Entscheidend ist dabei:
:arrow: Adapter wählen ist klar.
:arrow: Auflösung auflisten. Wie geht das? Wie löse ich das Problem mit den verschiedenen Outputs?
:arrow: Wie liste ich MultiSampling-Typen auf?
:arrow: Anisotropy geht (ist festgelegt worden) bis zu 16x.
:arrow: Wie erreiche ich VSync? (Ist eher für die Device-Erstellung interessant

BlazeX

Alter Hase

  • »BlazeX« ist der Autor dieses Themas

Beiträge: 478

Wohnort: DD

Beruf: Maschinenbau-Student

  • Private Nachricht senden

9

21.01.2010, 13:08

Auflösungen hab ich geschafft!
Ich werde den Dialog in etwa so aufbauen:

Quellcode

1
2
3
4
5
6
7
[Adapter - Name wie 9800 GX2] [Output - ID+1 (müsste Nr. des Monitors sein?)]
[Fullscreen]
[Resolution]
[VSync]

[MSAA]
[Anisotropy]


Wieso bin ich nicht gleich drauf gekommen, beides angeben zu lassen!

Ist es wirklich nötig IDXGIFactory1 zu benutzen? Mich stört nur immer diese 1 am Ende. Und beim schreiben, weiß ich nie so richtig, ob da ne 1 dahinter kommt oder nicht.

Ach ja. Hier mal mein Beispielprogramm zum enumerieren von Auflösungen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include<windows.h>
#include<list>
#include<sstream>
#include<D3D11.h>
#pragma comment(lib, "D3D11.lib")
#pragma comment(lib, "DXGI.lib")

//Eine Auflösung beschreiben

struct Resolution
{
    DWORD dwX, dwY;
};

//Eine ganze Liste von Auflösungen

typedef std::list<Resolution> ResolutionList;

//Utils zum Auflösung sortieren

BOOL operator == (const Resolution & a, const Resolution & b)
{
    return(a.dwX == b.dwX && a.dwY == b.dwY);
}
BOOL operator < (const Resolution & a, const Resolution & b)
{
    return(a.dwX == b.dwX ? a.dwY < b.dwY : a.dwY < b.dwY);
}

//Die zentrale Funktion, um Auflösungen zu enumerieren

void EnumResolutions(IDXGIFactory1 * pFactory, DWORD dwAdapter, DWORD dwOutput, ResolutionList * pToFill)
{
    //Adapter und Output holen

    IDXGIAdapter1 * pAdapter;
    pFactory->EnumAdapters1(dwAdapter, &pAdapter);
    IDXGIOutput * pOutput;
    pAdapter->EnumOutputs(dwOutput, &pOutput);

    //Anzahl der VideoModes abfragen

    DWORD dwNumModes;
    pOutput->GetDisplayModeList(DXGI_FORMAT_R8G8B8A8_UNORM, 0, (UINT*)&dwNumModes, NULL);

    //Speicher für alle VideoModes reservieren und alle abragen

    DXGI_MODE_DESC * pVideoModes= new DXGI_MODE_DESC[dwNumModes];
    pOutput->GetDisplayModeList(DXGI_FORMAT_R8G8B8A8_UNORM, 0, (UINT*)&dwNumModes, pVideoModes);

    //Alle VideoModes durchgehen und in der Liste speichern

    for(DWORD dwMode= 0; dwMode < dwNumModes; dwMode++)
    {
        //Neuen Eintrag hinzufügen

        Resolution Entry;
        Entry.dwX= pVideoModes[dwMode].Width;
        Entry.dwY= pVideoModes[dwMode].Height;
        pToFill->push_back(Entry);
    }

    //Alle doppelten raus und sortieren

    pToFill->unique();
    pToFill->sort();

    //Alles freigeben

    delete[] pVideoModes;
    pOutput->Release();
    pAdapter->Release();
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, char * pcCommandLine, int iShowCommand)
{
    //Alle Auflösungen enumerieren

    //Vorgabe: Adapter 0, Output 0, Format R8G8B8A8_UNORM

    IDXGIFactory1 * pFactory;
    HRESULT hResult= CreateDXGIFactory1(__uuidof(IDXGIFactory), (void**)(&pFactory) );

    //Auflösungen aufzählen

    ResolutionList Resolutions;
    EnumResolutions(pFactory, 0, 0, &Resolutions);

    //Verpacken und ausgeben

    std::stringstream Message;
    Message<<"Adapter=0, Output=0\n\n";
    for(ResolutionList::iterator Iter= Resolutions.begin(); Iter != Resolutions.end(); Iter++)
    {
        Message<<Iter->dwX<<" x "<<Iter->dwY<<std::endl;
    }
    MessageBoxA(NULL, Message.str().c_str(), "Auflösungen", MB_OK|MB_ICONINFORMATION);

    //Alles freigeben

    pFactory->Release();
    return(0);
}


:arrow: Für Multisampling werde ich dann jedes mal ein Dummy-Device erstellen müssen.
:arrow: Wie erreiche ich VSync? :oops:

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

21.01.2010, 13:17

Zitat von »"BlazeX"«

Auflösung auflisten. Wie geht das? Wie löse ich das Problem mit den verschiedenen Outputs?


Nunja, das hängt davon ab was du machen willst. Wenn du mehrere Adapter und Outputs hast musst du dich halt entscheiden auf welchen du was anzeigen willst (könnten ja auch mehrere sein). Du kannst auch einfach hergehen und sagen du nimmst immer Output 0 von Adapter 0.
Mit IDXGIFactory::EnumAdapters() bekommst du alle Adapter und mit IDXGIAdapter::EnumOutputs() bekommst du alle an diesen Adapter angeschlossenen Outputs. Und mit IDXGIOutput::GetDisplayModeList() bekommst du dann eben alle Displaymodes die dieser Adapter unterstützt.[/quote]

Zitat von »"BlazeX"«

Wie liste ich MultiSampling-Typen auf?


Da gibt es keinen direkten Weg die aufzulisten afaik. Jedes D3D10 Device muss sowieso 4x Multisampling für alle Formate außer R32G32B32A32 und R32G32B32 unterstützten. Was du machen kannst ist z.b. ID3D11Device::CheckMultisampleQualityLevels() für 4, 8, 16, 32 aufzurufen und zu schauen ob es unterstützt wird oder nicht.

Zitat von »"BlazeX"«

Wie erreiche ich VSync? (Ist eher für die Device-Erstellung interessant


Entweder über den ersten Parameter von IDXGISwapChain::Present() oder du wartest selber auf den Blank indem du IDXGIOutput::WaitForVBlank() aufrufst.

Wenn du allerdings nur eine einfache Anwendung hast solltest du dich fragen ob du das alles auch wirklich brauchst. Denn DXGI übernimmt für dich automatisch das wechseln zwischen Windowed und Fullscreenmode per Alt + Enter und sucht für den Fullscreen automatisch einen möglichst passenden Display Mode. Natürlich kannst du das alles auch abschalten und dich selber drum kümmern...

Werbeanzeige