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

11

08.07.2010, 16:45

Wenn ich mit dem UINT Format (also für R, G, B, und A nur ein Byte) arbeite, ist die Farbe die im Shader ankommt einfach nur leer, also schwarz.
Mit floats (4 Byte pro Farb Komponente) geht's. Ich arbeite aber lieber mit unsigned bytes, weil mehr als 256 Werte pro Farb Komponente gibt's sowieso nicht. Und negativ kann die Farbe auch nicht werden, also brauch ich erst gar nicht mit floats anfangen. Bei 10000 Vertices machen sich die zusätzlichen 12 Bytes auch ganz schön bemerkbar.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

12

08.07.2010, 16:47

Und du bist sicher dass da alles stimmt? Ich hab z.B. dein Eindruck dass die Reihenfolge von Farbe und Texcoords in deinen Vertices anders rum ist als in deinem InputLayout...

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

13

08.07.2010, 16:53

Für DX11 will ich "oglColor" verwenden. d3d9Color ist nur da, weil DX9 nur dieses blöde ARGB Format kennt. Zum Glück hat sich DX11 dahin gehend verbessert und das RGBA Format eingeführt.
Also müsste die Reihenfolge doch eigentlich stimmen.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

14

08.07.2010, 16:58

Warum die Speicherverschwendung? Aynway, deine Offsets stimmen dann so aber nicht. Das Offset musst du vor den Texcoords hochzählen und außerdem hat ein DWORD 4 Byte und nicht 8...

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

15

08.07.2010, 17:08

Stimmt das habe ich vergessen. Ich habe das übersprungen, weil ich im Moment mit der Float Variante arbeite. Die 4 Byte überspringe ich schon nach "NORMAL". Da steht nämlich 16 (12 von der Normale + 4 von "d3d9Color").
Ich hab' meinen Post aktualisiert, aber so wie's da steht klapt's bei mir trotzdem nicht :-(
Ich hoffe ich mach da noch irgendwas falsch. Ansonsten wäre es schade, wenn das nur mit floats geht.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

16

08.07.2010, 17:23

Sehr merkwürdig. Das geht jedenfalls sicher nicht nur mit float, debugg vielleicht mal durch ob auch wirklich gescheite Werte in deinen Vertices stehen.
Was das Updaten von Ressourcen angeht: Das macht man je nachdem entweder mit UpdateSubresource() oder indem man die Resource Mapped...

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

17

09.07.2010, 11:36

Ok ich hab jetzt herausgefunden, dass es mit DXGI_FORMAT_R8G8B8A8_UNORM funktioniert. Aber mit DXGI_FORMAT_R8G8B8A8_UINT definitiv nicht ?(
Steht "UNORM" für 'Umformen' weil das Format für die Shader in floats umgewandelt werden muss??

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

18

09.07.2010, 11:45

Achso klar, sry das hab ich total übersehen^^
Das UNORM steht für Unsigned NORMalized integer, d.h. die einzelnen Werte werden in den Bereich 0..1 normalisiert, was natürlich genau das is was du brauchst...

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

19

09.07.2010, 20:51

Jetzt habe ich mich an die Texturen begeben und auch gleich das nächste Problem vor mir.
Das Beispiel auf dieser Seite funktioniert bei mir nicht so richtig.
Mit "ID3D11Device::CreateTexture2D" will ich eine 2D Texture erstellen. Das klappt bei mir aber nur, wenn ich noch keine Bild Daten zur Initialisierung mit geben.

C-/C++-Quelltext

1
2
3
Device->CreateTexture2D(&TextureDesc, 0, &MyD3DTexture2D); // Funktioniert

Device->CreateTexture2D(&TextureDesc, &ResourceData, &MyD3DTexture2D); // Funktioniert nicht


Das ganze sieht so aus:

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
/* unsigned char* ImageBuffer = ... */

/* Initialize resource data description */
D3D11_SUBRESOURCE_DATA ResourceData;

ResourceData.pSysMem            = (const void*)ImageBuffer;
ResourceData.SysMemPitch        = Width * 4;
ResourceData.SysMemSlicePitch   = Height * ResourceData.SysMemPitch;

/* Initialize texture description */
D3D11_TEXTURE2D_DESC TextureDesc;

TextureDesc.Width               = Width;
TextureDesc.Height              = Height;
TextureDesc.MipLevels           = 0; // Generate MipMaps automatically
TextureDesc.ArraySize           = 1;
TextureDesc.Usage               = D3D11_USAGE_DEFAULT;
TextureDesc.Format              = DXGI_FORMAT_R8G8B8A8_UNORM;
TextureDesc.CPUAccessFlags      = 0;
TextureDesc.MiscFlags           = 0;
TextureDesc.SampleDesc.Count    = 1;
TextureDesc.SampleDesc.Quality  = 0;
TextureDesc.BindFlags           = D3D11_BIND_SHADER_RESOURCE;

/* Create the 2D texture */
Device->CreateTexture2D(&TextureDesc, &ResourceData, &Texture2D); // Error: Invalid Arguments (E_INVALIDARG)


Eigentlich kann man bei der SubResourceData ja nicht so viel falsch machen ?(

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

20

10.07.2010, 12:21

Das Problem aus meinem letzten Post habe ich jetzt nur umgangen in dem ich die Texture uninitialisiert erstelle und die Bild Daten nachträglich mit "UpdateSubresource" übertrage.
Allerdings sieht die gemappte Texture jetzt so aus, als währe sie nur 1 dimensional:


(Link)


Hier mein Shader (Shader Model 4):

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
Texture2D Tex;
SamplerState SamplerLinear;

cbuffer ConstantBuffer
{
    float4x4 World;
    float4x4 View;
    float4x4 Projection;
}

/* === Vertex Shader === */

struct VertexOutput
{
    float4 Pos : SV_POSITION;
    float4 Color : COLOR0;
    float3 TexCoord : TEXCOORD0;
};

VertexOutput VertexMain(float4 Pos : POSITION, float4 Color : COLOR, float3 TexCoord : TEXCOORD0)
{
    VertexOutput Output;
    
    Output.Pos = mul(Pos, World);
    Output.Pos = mul(Output.Pos, View);
    Output.Pos = mul(Output.Pos, Projection);
    
    Output.Color = Color;
    
    Output.TexCoord = TexCoord;
    
    return Output;
}

/* === Pixel Shader === */

float4 PixelMain(VertexOutput Input) : SV_Target
{
    return Tex.Sample(SamplerLinear, Input.TexCoord.xy) * Input.Color;
}


Kann mir jemand sagen was ich falsch mache??

Die Texture Koordinaten stimmen definitiv. Das habe ich schon getestet.

Werbeanzeige