[DX11] Probleme beim erstellen von Geometrie

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Grubenlord
Beiträge: 48
Registriert: 14.02.2010, 22:23

Re: [DX11] Probleme beim erstellen von Geometrie

Beitrag von Grubenlord »

Hm, ja etwas dergleichen dachte ich mir schon, nur bin ich mir bei den einzelnen Zuweisungen immernoch recht unsicher.

Bei

Code: Alles auswählen

	V( pd3dImmediateContext->Map( g_pVertexBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource ) );
    D3D11_SUBRESOURCE_DATA* bla = ( D3D11_SUBRESOURCE_DATA* )MappedResource.pData;
    bla->pSysMem = vertices;
	bla->pSysMem = rot;
    pd3dImmediateContext->Unmap( g_pVertexBuffer, 0 );
mag er meinen pVertexBuffer nicht, erzeuge ich mir einen BUFFER_DESC kann er nicht zu einer SUBRESOURCE konvertieren. Irgendwie verwirrt mich das alles :oops:

Gibt es nicht ein Möglichkeit den Buffer vorab zu befüllen mit allen meinen quads, sowas wie z.B. Pseudocode:

Code: Alles auswählen

 D3D11_SUBRESOURCE_DATA alle_meine_schoenen_quads;
alle_meine_schoenen_quads.pSysMem = {verticesEins, verticesZwei, ...};
pd3dDevice->CreateBuffer( &bd, alle_meine_schoenen_quads, &g_pVertexBuffer ) )
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [DX11] Probleme beim erstellen von Geometrie

Beitrag von Krishty »

Grubenlord hat geschrieben:Bei (code) mag er meinen pVertexBuffer nicht, erzeuge ich mir einen BUFFER_DESC kann er nicht zu einer SUBRESOURCE konvertieren.
MappedResource.pData zeigt bereits auf einen Speicherbereich, den du entsprechend umgestalten musst. Z.b. deine Quads per ::memmove() dahinkopieren, oder am besten direkt darauf operieren.

Code: Alles auswählen

Vertex * alle_meine_schoenen_quads = reinterpret_cast<Vertex *>(MappedResource.pData);
Grubenlord hat geschrieben:Gibt es nicht ein Möglichkeit den Buffer vorab zu befüllen mit allen meinen quads, sowas wie z.B. Pseudocode:

Code: Alles auswählen

 D3D11_SUBRESOURCE_DATA alle_meine_schoenen_quads;
alle_meine_schoenen_quads.pSysMem = {verticesEins, verticesZwei, ...};
pd3dDevice->CreateBuffer( &bd, alle_meine_schoenen_quads, &g_pVertexBuffer ) )
Ja, ziemlich genau so geht das.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Grubenlord
Beiträge: 48
Registriert: 14.02.2010, 22:23

Re: [DX11] Probleme beim erstellen von Geometrie

Beitrag von Grubenlord »

Krishty hat geschrieben:
Grubenlord hat geschrieben:[...]
Grubenlord hat geschrieben:Gibt es nicht ein Möglichkeit den Buffer vorab zu befüllen mit allen meinen quads, sowas wie z.B. Pseudocode:

Code: Alles auswählen

 D3D11_SUBRESOURCE_DATA alle_meine_schoenen_quads;
alle_meine_schoenen_quads.pSysMem = {verticesEins, verticesZwei, ...};
pd3dDevice->CreateBuffer( &bd, alle_meine_schoenen_quads, &g_pVertexBuffer ) )
Ja, ziemlich genau so geht das.
Das war eines der ersten Sachen die ich versucht hatte, nur bekomme ich da nur einen (den letzteren)Quad und ein Polygon der letzten beiden Koordinaten zum Ursprung. Ich nehme an der überschreibt das erste quad und sieht dann im leeren Bereich nur Nullen. Wie kann ich das überschreiben verhindern?
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [DX11] Probleme beim erstellen von Geometrie

Beitrag von Krishty »

http://msdn.microsoft.com/en-us/library/ee422116.aspx
Edit: Der dritte Schritt ist dort fehlerhaft beschrieben, man sollte natürlich die Größe des Puffers aus Schritt zwei angeben, nicht die Größe eines einzelnen Vertex. Das Codebeispiel ist aber korrekt.

Wenn damit immernoch was falsch gerendert wird, ist wieder mal das Input-Layout oder einer der Parameter z.B. für Draw() inkorrekt.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Grubenlord
Beiträge: 48
Registriert: 14.02.2010, 22:23

Re: [DX11] Probleme beim erstellen von Geometrie

Beitrag von Grubenlord »

Ich habe den Eindruck wir haben uns gerade im Kreis gedreht. Naja, ich werde ersteinmal noch etwas ausprobieren und dann stelle ich vielleicht nochmal die Frage präziser.
Ich hoffe auf etwas Nachsicht, denn mich beschäftigt gerade noch eine weitere Frage, die mir die Samples und die Doku nicht verständlich machen konnten. Ich möchte meinem quad gerne jetzt noch eine einfarbige Textur zuweisen und mit dieser rendern lassen.
Ich habe mir also eine Textur erstellt (s.u.), doch wie sage ich der Textur, wie sie aussehen soll? Wie sage ich, wo die hinsoll?

Code: Alles auswählen

	DXGI_SAMPLE_DESC sd;
	sd.Count = 1;
	sd.Quality = 0;

	D3D11_TEXTURE2D_DESC white;
	white.Height = 256;
	white.Width = 256;
	white.MipLevels = 0;
	white.ArraySize = 1;
	white.Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
	white.SampleDesc = sd;
	white.Usage = D3D11_USAGE_DEFAULT;
	white.BindFlags = 0;
	white.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
	white.MiscFlags = 0;

//InitData ist atm eine Subresource von meinen quad was aber imho quatsch ist, k.a. was der haben will		
pd3dDevice->CreateTexture2D(&white, &InitData, &texWhite);
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [DX11] Probleme beim erstellen von Geometrie

Beitrag von Krishty »

Du initialisierst die Subresource-Data, die du übergibst, so, dass ihr pSysMem jeweils auf die Pixeldaten zeigt, die du angelegt hast und das SysMemPitch-Member die Distanz zwischen zwei übereinanderliegenden Pixeln, in Bytes, angibt (also üblicherweise white.Width * sizeof(Pixel), in deinem R32G32B32A32_FLOAT-Beispiel white.Width * 4 * sizeof(float)).

Das musst du aber für jedes Mip-Level machen. Dein white.MipLevels steht auf 0 (erzeuge soviele wie möglich), d.h. du erzeugst entweder für jedes Mip-Level passende Pixeldaten und ein Array von D3D11_SUBRESOURCE_DATA, die jeweils auf eins dieser Mip-Levels zeigen, das du dann übergibst oder du setzt white.MipLevels auf 1 und gibst dich erstmal mit einem Level zufrieden.

Weiterhin hast du D3D11_CPU_ACCESS_WRITE angegeben, was es unmöglich macht, die Textur auf der GPU zu benutzen (das Flag bezieht sich auf das Laufzeitverhalten – die Initialisierung geschieht immer mit Daten aus dem RAM, egal, was da angegeben wird) (und auch in Kombination mit D3D11_USAGE_DEFAULT unmöglich ist). Stell das also auf D3D11_USAGE_IMMUTABLE um, dann kannst du die Textur erstmal nicht verändern, dynamische Texturen sind aber für den Anfang auch viel zu kompliziert. Eigentlich ist alles andere als D3DX-Funktionen zum Laden zu benutzen für den Anfang zu kompliziert … und wenn man das als Profi selber machen muss, vergräbt man das in eigenen Hilfsklassen.

Ich habe hier noch ein altes Beispiel aus meinem Sternenartikel, wie man eine Textur aus Arbeitsspeicher erzeugt. Ist nur einfarbig und winzig klein, aber die Benutzung der Klassen kommt rüber … der Code nutzt D3D10, es lässt sich aber 1:1 auf D3D11 übertragen. (Um den Willen der Lesbarkeit und Kosmetik müsste man für jedes Mip-Level ein eigenes Array anlegen und tüchtig mit sizeof arbeiten, aber der Code ist uralt, war für andere Zwecke bestimmt und ich habe keinen Bock, ihn zu verbessern.)
Grubenlord hat geschrieben:Wie sage ich, wo die hinsoll?
Mit Texturkoordinaten (in der unteren Hälfte erklärt).
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Grubenlord
Beiträge: 48
Registriert: 14.02.2010, 22:23

Re: [DX11] Probleme beim erstellen von Geometrie

Beitrag von Grubenlord »

Ich habe mir mal wie in dem Artikel beschrieben eine Textur erstellt, aber leider schwarz :-( Wird das falsch initialisiert oder einfach nicht an den Shader übergeben, bzw. ich Shader nicht verarbeitet? Bei letzterem, was bekommt der Shader?

Code: Alles auswählen

float l_pTextureData[][4] = {
        // Mip-Level 0
        ( 0.9f, 0.1f, 0.1f, 1.0f ),     ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),
        ( 0.9f, 0.1f, 0.1f, 1.0f ),     ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),
        ( 0.9f, 0.1f, 0.1f, 1.0f ),     ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),
        ( 0.9f, 0.1f, 0.1f, 1.0f ),     ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),
        ( 0.9f, 0.1f, 0.1f, 1.0f ),     ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),
        ( 0.9f, 0.1f, 0.1f, 1.0f ),     ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),
        ( 0.9f, 0.1f, 0.1f, 1.0f ),     ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),
        ( 0.9f, 0.1f, 0.1f, 1.0f ),     ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),
        // Mip-Level 1
        ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),     ( 0.9f, 0.1f, 0.1f, 1.0f ),     ( 0.9f, 0.1f, 0.1f, 1.0f ),
        ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),     ( 0.9f, 0.1f, 0.1f, 1.0f ),     ( 0.9f, 0.1f, 0.1f, 1.0f ),
        ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),     ( 0.9f, 0.1f, 0.1f, 1.0f ),     ( 0.9f, 0.1f, 0.1f, 1.0f ),
        ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),     ( 0.9f, 0.1f, 0.1f, 1.0f ),     ( 0.9f, 0.1f, 0.1f, 1.0f ),
        // Mip-Level 2
        ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),
        ( 0.9f, 0.1f, 0.1f, 1.0f ),      ( 0.9f, 0.1f, 0.1f, 1.0f ),
};

	DXGI_SAMPLE_DESC sd;
	sd.Count = 1;
	sd.Quality = 0;

	D3D11_TEXTURE2D_DESC white;
	white.Height = 8;
	white.Width = 8;
	white.MipLevels = 3;
	white.ArraySize = 1;
	white.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; //DXGI_FORMAT_R8_UNORM;
	white.SampleDesc = sd;
	white.Usage = D3D11_USAGE_IMMUTABLE;
	white.BindFlags = D3D11_BIND_SHADER_RESOURCE;
	white.CPUAccessFlags = 0;
	white.MiscFlags = 0;

	D3D11_SUBRESOURCE_DATA texSubsource[3] = {
        { &l_pTextureData[ 0][0], white.Width * 4 * sizeof(float), 0, },
        { &l_pTextureData[64][0], (white.Width * 4 * sizeof(float))/2, 0, },
	{ &l_pTextureData[80][0], (white.Width * 4 * sizeof(float))/4, 0, },};

pd3dDevice->CreateTexture2D(&white, &texSubsource[3], &texWhite);

	D3D11_SHADER_RESOURCE_VIEW_DESC l_SRVDesc = { white.Format, D3D11_SRV_DIMENSION_TEXTURE2D, 0, white.MipLevels, };

	pd3dDevice->CreateShaderResourceView(texWhite, &l_SRVDesc, &m_pTextureView);

//im Framerenderer nach der Shaderinitialisierung
	pd3dImmediateContext->PSSetShaderResources(0,1,&m_pTextureView);
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [DX11] Probleme beim erstellen von Geometrie

Beitrag von Krishty »

Du musst &texSubresource[0] (oder gleichwertig einfach texSubresource) übergeben statt &texSubresource[3].
Dass man vier floats mit runden Klammern initialisieren kann, glaube ich nicht. Die gehören eckig (wie schon bei den Vertices).
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: [DX11] Probleme beim erstellen von Geometrie

Beitrag von Aramis »

Code: Alles auswählen

( 0.9f, 0.1f, 0.1f, 1.0f )
Das ist weder eine Initialisierungsliste noch eine Schreibweise für ein Tupel, sondern der oftmals unterschätzte „Sequential Evaluation Operator“. Er evaluiert alle Einzelausdrücke (im Beispiel vier einzelne Fließkomma-Literale, also rvalues ohne Nebeneffekte) von links nach rechts und gibt den rechtsstehenden Ausdruck zurück. Obige Zeile ist also syntaktisch äquivalent zu einem einfachen 1.f. Gemäß den Regeln für die Array-Initialisierung wird in deinem Code nur das jeweils erste Element jedes RGBA-Tupels initialisiert, die restlichen verbleiben undefiniert.

(Geschweifte Klammern sollten das Problem lösen :-))
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [DX11] Probleme beim erstellen von Geometrie

Beitrag von Krishty »

Aramis hat geschrieben:der oftmals unterschätzte „Sequential Evaluation Operator“.
Weitestgehend unbekannt und missverstanden, aber bestimmt nicht unterschätzt … hat nur zwei oder drei Existenzberechtigungen in der Sprache, und wird, wenn bekannt, tendenziell eher zu oft eingesetzt. Was ich damit schon für Code gesehen habe wäre was für den IOCCC :D
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Grubenlord
Beiträge: 48
Registriert: 14.02.2010, 22:23

Re: [DX11] Probleme beim erstellen von Geometrie

Beitrag von Grubenlord »

Ach ja, ja, ich hatte anfänglich bei der Initialisierung einen Fehler und hatte idiotischer weise den Klammern die Schuld gegeben. Soweit funktioniert es ganz gut und mittlerweile bin ich mal wieder ein Problem weiter :-)

Ich poste einfach gerade mal. Ich möchte meinen Shadern nun gerne eine Variable übergeben, aber wenn ich die übergebe wie die anderen kann er sofort nicht mehr kompilieren :-(

Code: Alles auswählen

struct CB_VS_PER_FRAME
{
    D3DXVECTOR3 m_vLightDir;
    float       m_fTime;
    D3DXVECTOR4 m_LightDiffuse;
	float		m_shootPos; //<-- das ist der Übeltäter
};

    D3D11_MAPPED_SUBRESOURCE MappedResource;
    V( pd3dImmediateContext->Map( g_pcbVSPerFrame11, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource ) );
    CB_VS_PER_FRAME* pVSPerFrame = ( CB_VS_PER_FRAME* )MappedResource.pData;
    pVSPerFrame->m_vLightDir = D3DXVECTOR3( 0,0.707f,-0.707f );
    pVSPerFrame->m_fTime = (float)fTime;
    pVSPerFrame->m_LightDiffuse = D3DXVECTOR4( 1.f, 1.f, 1.f, 1.f );
	pVSPerFrame->m_shootPos = 0.5f;      //<-- das ist der Übeltäter
    pd3dImmediateContext->Unmap( g_pcbVSPerFrame11, 0 );
    pd3dImmediateContext->VSSetConstantBuffers( 1, 1, &g_pcbVSPerFrame11 );

//in der hlsl
cbuffer cbPerFrame : register( b1 )
{
    float3              g_vLightDir             : packoffset( c0 );
    float               g_fTime                 : packoffset( c0.w );
    float4              g_LightDiffuse          : packoffset( c1 );
    float				g_shootPos; //:packoffset( c2.x ) //<-- das ist der Übeltäter
};

// in der fx
float    g_fTime;                   // App's time in seconds
float4x4 g_mWorld;                  // World matrix for object
float4x4 g_mWorldViewProjection;    // World * View * Projection matrix
float g_shootPos; //<-- das ist der Übeltäter
Ansonsten nochmal vielen Dank für die Hilfe bisher, hat mir wirklich geholfen
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [DX11] Probleme beim erstellen von Geometrie

Beitrag von Krishty »

Ohne die Fehlermeldung des Compilers kein Rat ;) Ehrlich, ist nur Hilfe zur Selbsthilfe wenn wir dich zwingen, Fehlermeldungen verstehen zu lernen.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Grubenlord
Beiträge: 48
Registriert: 14.02.2010, 22:23

Re: [DX11] Probleme beim erstellen von Geometrie

Beitrag von Grubenlord »

Die Fehlermeldung
Line 316 ErrorCode: E_FAIL (0x80004005) Calling D3DX11CompileFromFile(str, NULL, NULL, "RenderSceneVS", "vs5_0", dwShaderFlags, 0, NULL, &pVertexShaderBuffer, NULL, NULL)

sagt mir nur, dass mein Shaderprogramm fehlerhaft ist aber nicht was :?
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [DX11] Probleme beim erstellen von Geometrie

Beitrag von Krishty »

Okay, mit dem Effects-Framework kenne ich mich nicht aus. Es gibt aber mit Sicherheit eine Möglichkeit, an die Fehlermeldung zu kommen … guck mal, ob das hier hilft: http://msdn.microsoft.com/en-us/library ... ing_Errors
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Grubenlord
Beiträge: 48
Registriert: 14.02.2010, 22:23

Re: [DX11] Probleme beim erstellen von Geometrie

Beitrag von Grubenlord »

Lieder gibt mir der Code aus der Hilfe auch nichts aus. Interessant hierbei auch dass es scheinbar keine ID3D11Blob*, nur ID3DBlob*, gibt :? . Ebenfalls interessant dass ich die .fx file gar nicht brauche und dass ich die hlsl nicht mit HRESULT CompileShaderFromFile kompilieren kann. In einem anderen Sample funktioniert das so.
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [DX11] Probleme beim erstellen von Geometrie

Beitrag von Krishty »

Grubenlord hat geschrieben:Lieder gibt mir der Code aus der Hilfe auch nichts aus.
Kann ich irgendwie schlecht glauben … aber okay: Mach das packoffset bei der neuen Variable wieder rein, man kann keine Variablen mit und ohne packoffset in einem Puffer kombinieren. Pass auf, dass du nicht das Semikolon dahinter vergisst. Und geh sicher, dass die Größe des Puffers ein Vielfaches von 16 Bytes ist (pack die Variable also entweder in den Alpha-Teil der vorausgehenden Farbe oder füg hinter ihr drei weitere floats als Puffer ein).
Grubenlord hat geschrieben: Interessant hierbei auch dass es scheinbar keine ID3D11Blob*, nur ID3DBlob*, gibt :?
Ja, die Blobs wurden vor ein paar SDK-Revisionen zusammengelegt und die Doku hat es noch nicht überall übernommen.
Grubenlord hat geschrieben:Ebenfalls interessant dass ich die .fx file gar nicht brauche und dass ich die hlsl nicht mit HRESULT CompileShaderFromFile kompilieren kann. In einem anderen Sample funktioniert das so.
Öhm, ohne FX kannst du afaik nur pure Shader kompilieren und das dürfte nicht in deinem Interesse sein … also lass es erstmal, wie es ist, bis der Shader funktioniert.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Grubenlord
Beiträge: 48
Registriert: 14.02.2010, 22:23

Re: [DX11] Probleme beim erstellen von Geometrie

Beitrag von Grubenlord »

Krishty hat geschrieben:
Grubenlord hat geschrieben:Lieder gibt mir der Code aus der Hilfe auch nichts aus.
Kann ich irgendwie schlecht glauben … aber okay: Mach das packoffset bei der neuen Variable wieder rein, man kann keine Variablen mit und ohne packoffset in einem Puffer kombinieren. Pass auf, dass du nicht das Semikolon dahinter vergisst. Und geh sicher, dass die Größe des Puffers ein Vielfaches von 16 Bytes ist (pack die Variable also entweder in den Alpha-Teil der vorausgehenden Farbe oder füg hinter ihr drei weitere floats als Puffer ein).
Pro Komponente werden ja 4 floats gespeichert und wenn man das so zusammenrechnet hat

Code: Alles auswählen

float3 g_vLightDir
3 floats belegt

Code: Alles auswählen

float g_fTime
einen und

Code: Alles auswählen

float4 g_LightDiffuse
4, wodurch ja eigentlich c2.x der erste freie speicherplatz sein sollte. Aber selbst wenn ich meine Variable an späterer Stelle platziere, klappts nicht. Die Zuweisung ist ja eig auch nur optional, aber auch alles automatisch zuweisen lassen bringt keinen Erfolg :cry: :(
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [DX11] Probleme beim erstellen von Geometrie

Beitrag von Krishty »

Grubenlord hat geschrieben:Pro Komponente werden ja 4 floats gespeichert und wenn man das so zusammenrechnet hat

Code: Alles auswählen

float3 g_vLightDir
3 floats belegt

Code: Alles auswählen

float g_fTime
einen und

Code: Alles auswählen

float4 g_LightDiffuse
4, wodurch ja eigentlich c2.x der erste freie speicherplatz sein sollte.
Jaja, das stimmt. Trotzdem verlangt D3D von dir, dass immer komplette Register in C-Buffers übergeben werden – du musst also den Puffer bei der Erzeugung genau zwölf Komponenten groß machen, nicht neun. Mit dem Shader selber hat das nicht viel zu tun (dort kannst du alles, was nach c2.x kommt gern weglassen), aber wenn der Shader funktioniert ist das die nächste Stelle, an der es kracht.

Ich habe hier zwar nur einen Ausschnitt des HLSL-Codes, aber bei mir hat er gemeckert dass das packoffset ausgeklammert war und, als das wieder drin war, dass dahinter ein Semikolon fehlte. Danach funktionierte es.

Finde die Fehlermeldung ;)
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Grubenlord
Beiträge: 48
Registriert: 14.02.2010, 22:23

Re: [DX11] Probleme beim erstellen von Geometrie

Beitrag von Grubenlord »

Mein Buffer ist eigentlich in der Größe angepasst :(

Code: Alles auswählen

	    D3D11_BUFFER_DESC cbDesc;
    ZeroMemory( &cbDesc, sizeof(cbDesc) );
    cbDesc.Usage = D3D11_USAGE_DYNAMIC;
    cbDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
    cbDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;

    cbDesc.ByteWidth = sizeof( CB_VS_PER_OBJECT );
    V_RETURN( pd3dDevice->CreateBuffer( &cbDesc, NULL, &g_pcbVSPerObject11 ) );

[...]
    V( pd3dImmediateContext->Map( g_pcbVSPerFrame11, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource ) );
[...]
Aber ich habe immerhin mal (die) eine Fehlermeldung :
D3D11: CORRUPTION: ID3D11DeviceContext::Map: First parameter is corrupt or NULL. [ MISCELLANEOUS CORRUPTION #13: CORRUPTED_PARAMETER1 ]
Eine Ausnahme (erste Chance) bei 0x766cb727 in Pogramm.exe: 0x0000087D: 0x87d.
Unbehandelte Ausnahme bei 0x766cb727 in Pogramm.exe: 0x0000087D: 0x87d.
Das Programm "[4544] Pogramm.exe: Systemeigen" wurde mit Code 2173 (0x87d) beendet.

Gut, ich weiss leider wirklich nicht was an meine, buffer falsch sein soll
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [DX11] Probleme beim erstellen von Geometrie

Beitrag von Krishty »

Was macht V_RETURN? Sieht nämlich wirklich danach aus, dass die Erzeugung des Puffers fehlgeschlagen ist.

sizeof(CB_VS_PER_OBJECT) muss eine durch 16 teilbare Zahl sein.

Edit: Die Initialisierung, die du da zeigst, ist für die per-object-Daten, aber der Buffer, den du da mappst, ist der per-frame-Buffer?
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Grubenlord
Beiträge: 48
Registriert: 14.02.2010, 22:23

Re: [DX11] Probleme beim erstellen von Geometrie

Beitrag von Grubenlord »

hm, also es ist scheinbar egal, welche Größe ich meinem Buffer gebe, es will nicht funktionieren.
Das mit dem CreateBuffer war nur ein copy-paste Fehler, denn ich habe 2 Buffer g_pcbVSPerObject11 und g_pcbVSPerFrame11. Aber sonst stimmen alle Zuweisungen.
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [DX11] Probleme beim erstellen von Geometrie

Beitrag von Krishty »

Die Frage bleibt: Was macht V_RETURN? Was gibt CreateBuffer() für einen Fehler zurück? Was zeigt die Debug-Runtime an?
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Grubenlord
Beiträge: 48
Registriert: 14.02.2010, 22:23

Re: [DX11] Probleme beim erstellen von Geometrie

Beitrag von Grubenlord »

V_RETURN:
#define V_RETURN(x) { hr = (x); if( FAILED(hr) ) { return DXUTTrace( __FILE__, (DWORD)__LINE__, hr, L#x, true ); } }

Ok, ich hab mich scheinbar selber ausgetrickst indem ich einen falschen Error-output benutzt hab (da wo in der doku steht "cast to char*") hm, ich glaub jetzt scheint es so zu funktionieren wie ich es vor einiger Zeit versucht hab ... ärgerlich. Es lag laut debug wirklch daran, dass sizeof(CB_VS_PER_OBJECT) nicht durch 16 teilbar war.
Antworten