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

1

17.05.2014, 01:08

[DX11] DirectXmath: __declspec(align(16)) wird nicht ausgerichtet.

Hallo,
Ich habe mich die letzten Tage mit der DirectXmath aus dem Windows SDK beschäftigt.
Aber leider kann ich nichtmal eine struktur verwenden, weder XMMATRIX noch XMVECTOR oder sonst irgendwas.
Wenn ich z.B. XMMATRIX in einer Klasse verwende bekomme ich folgende fehler:

C-/C++-Quelltext

1
2
error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'world'
error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.


und wenn ich XMMATRIX als parameter übergebe, bekomme ich zwei neue fehler:

C-/C++-Quelltext

1
2
error C2511: 'bool Material::SetShaderParameters(DirectX::XMMATRIX)': Überladene Memberfunktion nicht in 'Material' gefunden
error C2719: 'world': Formeller Parameter mit __declspec(align('16')) wird nicht ausgerichtet


Natürlich habe ich dannach gegoogelt und versucht die Klasse so zu definieren:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
__declspec(align(16)) class Material
{
private:
    ...
    
public:
    ...

};


was das Problem eigentlich lösen sollte.
Aber ich bekomme es leider nicht hin.

Habe jetzt schon 2 Tage nach dem fehler gesucht, aber nichts gefunden.
Vielleicht könnt ihr mir ja helfen.


-Grashaufen :)

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

2

17.05.2014, 08:40

Grundsätzlich solltest du in deinen Klassen als Member XMFLOAT3 und XMFLOAT4X4 verwenden, um dieses Problem nicht zu haben. Es gibt ja Konvertierungsmethoden, falls du irgendwo XMVECTOR oder so nutzen möchtest. So gehe ich damit um und das klappt wunderbar.

3

17.05.2014, 14:06

Hallo,
Danke für deine Atwort.
Ich habe jetzt XMFLOAT4X4 anstatt XMMATRIX verwendet, zwar ist der "__declspec" error weg aber
ich bekomme einen weiteren error:

C-/C++-Quelltext

1
error C2061: Syntaxfehler: Bezeichner 'XMFLOAT4X4'


Sieht auf dem ersten Blick so aus als hätte ich "DirectXMath.h" nicht includiert, habe ich aber im Vorkompillierten Header StdAfx gemacht.
Natürlich auch bevor ich Material includiere.
Ich habe auch schon versucht DirectXMath.h direkt in der Material.h zu includieren, geht aber trotzdem nicht.

4

17.05.2014, 14:25

Sobald du dir sicher bist, dass die DirectXMath.h inkludiert und gefunden wird, zeig uns doch mal bitte mehr code. In dem codeausschnitt den du uns gezeigt hast, wird ja nicht einmal der Bezeichner "XMFLOAT4x4" oder "XMMATRIX" oder "world" verwendet.

Für XMMATRIX als Funktionsparameter solltest du References nutzen, bzw. deren Fixes (FXMATRIX):

C-/C++-Quelltext

1
XMMATRIX MyClass::DoSomething(const XMMATRIX& mtx);
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

5

17.05.2014, 14:58

Das mit dem Ausrichten per __declspec (align) klappt nur richtig, wenn der Speicher auf dem Stack allokiert wird.
Deswegen sind XMMATRIX und XMVECTOR meistens schlecht als Felder von Objekten, da man die gerne per new anlegt.
Um mit dynamisch allokierten Speicher das alignment zu beachten müsstest du eh mit _aligned_malloc und inplace new rumhantieren ...
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

6

17.05.2014, 16:07

Ok, dann zeig ich einfach mal den Code:

Hier einmal die StdAfx.h:

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
// STDAFX_H //
#ifndef STDAFX_H
#define STDAFX_H


// DEFINES
#define WIN32_LEAN_AND_MEAN

// PRAGMAS
#pragma comment(lib, "d3d11.lib")
#pragma comment(lib, "dxgi.lib")
#pragma comment(lib, "D3DCompiler.lib")

// EXTERN INCLUDES
#include <Windows.h>
#include <d3d11.h>
#include <d3dcompiler.h>
#include <DirectXColors.h>
#include <DirectXMath.h>

// INTERN INCLUDES
#include "Memory.h"
#include "Material.h"
#include "GraphicsDevice.h"

// USINGS
using namespace DirectX;


#endif //STDAFX_H


Dann habe ich eine Material Klasse erstellt:

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
// MATERIAL_H //
#ifndef MATERIAL_H
#define MATERIAL_H


class Material
{
private:
    ID3D11Device *m_pDevice;
    ID3D11DeviceContext *m_pDeviceContext;

    ID3D11VertexShader *m_pVertexShader;
    ID3D11PixelShader *m_pPixelShader;
    ID3D11InputLayout *m_pLayout;
    ID3D11Buffer *m_pMatrixBuffer;
    
public:
    Material(ID3D11Device *pDevice);

    bool Initialize();
    bool SetShaderParameters(XMFLOAT4X4 *worldViewProj);

    void Set();

    void Release();

};


#endif //MATERIAL_H


Im Konstruktor setze ich alle Member auf null und übergebe das Device.
SetShaderParameters ist noch leer, steht nur ein "return true;" drin.
Die anderen funktionen sind irrelevant.
In Initialize erstelle ich das vertexLayout und Kompilliere den shader den ich jeweils in einem ID3DBlob abspeichere.
Set ist noch leer und in Release gebe ich natürlich den Speicher wieder frei.

Natürlich ist die Klasse noch nicht fertig.

7

17.05.2014, 16:14

shit, wie blöd kann man sein, sorry, ich habe den fehler gefunden, natürlich muss ich "using namespace DirectX" vor den "INTERN INCLUDES" definieren.
Trotzdem Danke.

Werbeanzeige