DirectX VB.NET -> C#

Konstantin Gross

Erfahrenes Mitglied
Hallo,
ich versuche gerade einen VB.NET Code nach C# zu übersetzten habe es auch übersetzt und der Code macht auch keine Probleme, aber später sobald er die Device erstellen will kommt ein Fehler und ich denke er hat was damit zu tun.

VB.NET:
Code:
If D3DCaps.DeviceCaps.SupportsHardwareTransformAndLight() And _
        D3DCaps.DeviceCaps.SupportsPureDevice Then
      CreateFlgs = CreateFlags.HardwareVertexProcessing Or _
        CreateFlags.PureDevice
    ElseIf D3DCaps.DeviceCaps.SupportsHardwareTransformAndLight() Then
      CreateFlgs = CreateFlags.HardwareVertexProcessing
    Else
      CreateFlgs = CreateFlags.SoftwareVertexProcessing
    End If
    CreateFlgs = CreateFlgs Or CreateFlags.MultiThreaded

Mein übersetzter C# Code:
Code:
if(D3DCaps.DeviceCaps.SupportsHardwareTransformAndLight)
			{
				CreateFlgs = CreateFlags.HardwareVertexProcessing;
				
			}
			else if(D3DCaps.DeviceCaps.SupportsPureDevice)
			{
				CreateFlgs = CreateFlags.SoftwareVertexProcessing;
			}			
			CreateFlgs = CreateFlags.MultiThreaded;

Ich denke meine Variante ist falsch, weil ich das mit den || in VB.net nicht ganz verstehe, bitte helft mir :)
 
Ahja, als Fehler Meldung kommt:

An unhandled exception of type 'System.ObjectDisposedException' occurred in system.windows.forms.dll

Additional information: Auf das verworfene Objekt "frmMain" kann nicht zugegriffen werden.
 
Code:
if(D3DCaps.DeviceCaps.SupportsHardwareTransformAndLight() && D3DCaps.DeviceCaps.SupportsPureDevice) {
    CreateFlgs = CreateFlags.HardwareVertexProcessing || CreateFlags.PureDevice
}
else if(D3DCaps.DeviceCaps.SupportsHardwareTransformAndLight()) {
    CreateFlgs = CreateFlags.HardwareVertexProcessing
}
else {
      CreateFlgs = CreateFlags.SoftwareVertexProcessing
}
CreateFlgs = CreateFlgs Or CreateFlags.MultiThreaded
Ohne Gewähr, weil ich nicht den ganzen Code kenne und es auch nicht ausprobiert habe. Müsste aber funktionieren.
Ansonsten solltest Du einfach mal die Zeile posten, die der Compiler bemängelt. ;)

Bei der Übersetzung von VB.net nach C# gilt:
|| ist Or
&& ist And
 
Sorry, aber deine Methode hatte ich auch schon ;) und das mit den || weiß ich schon was das bedeutet nur in VB.NET kann man folgendes machen:

CreateFlgs = CreateFlags.HardwareVertexProcessing || CreateFlags.PureDevice

sowas klappt in C# einfach nicht. Da kommt folgender Fehler:
Der Operator '||' kann nicht auf Operanden des Typs 'Microsoft.DirectX.Direct3D.CreateFlags' und 'Microsoft.DirectX.Direct3D.CreateFlags' angewendet werden.

Und wenn ich das so mache wie bei mir siehe weiter oben mein Beitrag, kommt der Fehler beim InitDevice:
Code:
private bool InitDevice(PresentParameters pp)
{
	Caps D3DCaps = Manager.GetDeviceCaps(0,DeviceType.Hardware);
	CreateFlags CreateFlgs = CreateFlags.SoftwareVertexProcessing;

	pp.AutoDepthStencilFormat = DepthFormat.D16;
	pp.EnableAutoDepthStencil = true;

	/*if(D3DCaps.DeviceCaps.SupportsHardwareTransformAndLight && D3DCaps.DeviceCaps.SupportsPureDevice)
	{
		CreateFlgs = CreateFlags.HardwareVertexProcessing || CreateFlags.PureDevice;
	}
	else if(D3DCaps.DeviceCaps.SupportsHardwareTransformAndLight)
	{
		CreateFlgs = CreateFlags.HardwareVertexProcessing;
	}
	else
	{
		CreateFlgs = CreateFlags.SoftwareVertexProcessing;
	}
			
	CreateFlgs = CreateFlgs || CreateFlags.MultiThreaded;*/
	if(D3DCaps.DeviceCaps.SupportsHardwareTransformAndLight)
	{
		CreateFlgs = CreateFlags.HardwareVertexProcessing;
	}
	else if(D3DCaps.DeviceCaps.SupportsPureDevice)
	{
		CreateFlgs = CreateFlags.SoftwareVertexProcessing;
	}			
	CreateFlgs = CreateFlags.MultiThreaded;

	try
	{
		p_D3DDevice = new Device(0,DeviceType.Hardware,p_Target,CreateFlgs,pp);
	}
	catch(Microsoft.DirectX.DirectXException dxerr)
	{
		MessageBox.Show(dxerr.ToString(),"test");
		return false;
	}
	return true;
}

Der Fehler kommt beim Try mit folgender Message:
An unhandled exception of type 'System.ObjectDisposedException' occurred in system.windows.forms.dll

Additional information: Auf das verworfene Objekt "frmMain" kann nicht zugegriffen werden.

Und frmMain ist das Fenster, wo es gerendert werden soll.

// Edit von Alex: Code ein wenig ausgebessert, zuviele Tabs =)
 
Zuletzt bearbeitet von einem Moderator:
Hi.

CreateFlgs = CreateFlags.HardwareVertexProcessing || CreateFlags.PureDevice

sowas klappt in C# einfach nicht. Da kommt folgender Fehler:
Der Operator '||' kann nicht auf Operanden des Typs 'Microsoft.DirectX.Direct3D.CreateFlags' und 'Microsoft.DirectX.Direct3D.CreateFlags' angewendet werden.

|| und && sind Logische Boolesche Operatoren
| und & hingegen sind Logische Bitoperatoren

CreateFlags ist wohl eine Enumeration, bei der das Flags Attribut gesetzt ist, damit man mehrere Werte verknüpfen kann.
Dieses Verknüpfen läuft auf Bit-Ebene, und deswegen brauchst du die Logische Bitoperatoren.

Also:
Code:
CreateFlgs = CreateFlags.HardwareVertexProcessing | CreateFlags.PureDevice

Mfg,
Alex
 
Hey Alexander,
klasse es geht und danke für die Erklärung mit dem | und & wusste nicht das sowas auch geht. Und den anderen Fehler habe ich auch rausgefunden denke ich, und zwar muss man den Render auf einen unmanaged (or non window form) window handle legen. Laut DX, aber was meint es damit? Muss ich einfach eine andere leere Form angeben?
 

Neue Beiträge

Zurück