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

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

1

14.08.2012, 10:42

GL und D3D sollen nicht auf Intel HD Graphics zurückgreifen

Hallo,
auf dem Laptop meines Bruders greift meine 3D Engine immer auf die Intel HD Graphics zurück, aber die ist ja eigentlich nur für den Standardbetrieb gedacht.
Bei grafisch aufwändigeren Anwendungen sollte dann allerdings die NVIDIA Karte anspringen. Das passiert aber anscheinend nicht auf allen Rechnern automatisch.
Auf meinem Desktop schon und da habe ich auch eine Intel HD Graphics Einheit drin.
Wie kann ich das also mit OpenGL, Direct3D 9/ 11 oder direkt mit C++ über's OS erzwingen?
In Direct3D 11 - und in 9 glaube ich auch - kann man zumindest die Grafik-Adapter enumerieren (mit "CreateDXGIFactory" und "EnumAdapters").

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

14.08.2012, 10:50

Für OpenGL kannst du die Extensions WGL_nv_gpu_affinity oder wgl_gpu_association verwenden.
@D13_Dreinig

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

3

14.08.2012, 11:31

Über das OS wirst du das nicht erzwingen können. Du musst einfach den "stärksten" Adapter wählen. Wirst wohl alle durchgehen müssen. In Nvidia CUDA gibt es dafür ein Flag zum auswählen des besten Adapters - bei Direct3D9 meines Wissens nicht.

Ansonsten kannst du auch als workaround sagen, welcher Adapter beim starten der Anwendung verwendet werden soll - ist bei meinem Asus-Laptop auch so in den Grafikoptionen einstellbar.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

14.08.2012, 12:10

Über das OS wirst du das nicht erzwingen können. Du musst einfach den "stärksten" Adapter wählen. Wirst wohl alle durchgehen müssen. In Nvidia CUDA gibt es dafür ein Flag zum auswählen des besten Adapters - bei Direct3D9 meines Wissens nicht.


Bei DirectX9/11 kann beim erzeugen des Device der Adapter manuell angegeben werden. Für OpenGL gibts Extensions (siehe oben).
@D13_Dreinig

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

14.08.2012, 13:11

Über EnumDisplayDevices() kannst du die Grafikkarten und Monitore auflisten. Über den so gefundenen Device Name kannst du dann einen DC und in weiterer Folge einen OpenGL Context für diese Grafikkarte erzeugen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
  DISPLAY_DEVICEW dev;
  dev.cb = sizeof(dev);
  EnumDisplayDevicesW(nullptr, 1, &dev, 0);

  HDC hdc = CreateDCW(dev.DeviceName, dev.DeviceName, nullptr, nullptr);

  DeleteDC(hdc);

  return 0;
}

Du kannst diesen DC allerdings nicht zum Zeichnen benutzen. Du musst also trotzdem noch ein Fenster erzeugen, das auf dem jeweiligen Device liegt und bei wglMakeCurrent() dann einen DC für dieses Fenster angeben...

EDIT: Das da oben ist nur mal reine Spekulation meinerseits, habs nicht ausprobiert. Abgesehen davon, sollte es auch möglich sein, einen OpenGL 3.x+ Context zu machen, der keinen Default Framebuffer hat...

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (14.08.2012, 14:20)


LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

6

14.08.2012, 16:59

Ok, danke für eure Antworten. Ich werde mir mal diese Extensions anschauen.

Werbeanzeige