Texturen funktionieren nicht [DirectX, Visual Studio, C++]
-
Hallo,
ich habe eine kleine GameEngine entwickelt und hänge seit mehreren Wochen bei einem Problem fest: Und zwar funktionieren keine Texturen, bzw. die Polygone bleiben einfach weiß.So lade ich die Textur in den Shader: (stark vereinfacht)
D3DX11CreateShaderResourceViewFromFile(d3d->m_device, L"WoodCrate01.dds", NULL, NULL, &conductor->textureBuffer, NULL); d3d->textureBuffer->SetResource(conductor->textureBuffer); //d3d->textureBuffer ist die passende Effekt Variable
Und so verarbeite ich sie im PixelShader: (wieder nur das nötigste)
Texture2D textureMap; SamplerState samAnisotropic { Filter = ANISOTROPIC; MaxAnisotropy = 4; AddressU = WRAP; AddressV = WRAP; }; struct PixelInputType { float4 posH : SV_POSITION; float3 posW : POSITION; float3 normal : NORMAL; float2 tex : TEXCOORD0; }; void PS(PixelInputType input, out float4 output : SV_TARGET, uniform bool textured) { output = textureMap.Sample(samAnisotropic, input.tex); }
Wäre echt super wenn ihr mir da weiterhelfen könntet.
Wenn ihr denkt es könnte an was anderem liegen, kann ich ja auch noch mehr Code posten.LG lonol15
-
Ich hab mit D3D11 noch nix gemacht (nur D3D9), aber grundsätzlich...
lonol15 schrieb:
Texture2D textureMap;
Woher soll
textureMap
wissen welches "seine" Textur ist? Ist ja nicht so als ob es nur eine Textur geben könnte.
-
Das habe ich über die effect library geregelt: (in der vorletzten Zeile hole mir den textureBuffer)
//---- Create Shader ----// ID3D10Blob* errorMessage; ID3D10Blob* shaderBuffer; errorMessage = 0; shaderBuffer = 0; effect = 0; WCHAR* fxFilename = L"Shader/default.fx"; result = D3DX11CompileFromFile(fxFilename, NULL, NULL, 0, "fx_5_0", NULL, NULL, NULL, &shaderBuffer, &errorMessage, NULL); if (FAILED(result)) { ShowCursor(TRUE); MessageBox(NULL, buf, L"Error!", MB_ICONEXCLAMATION | MB_OK); return false; } //---- Create effect ----// result = D3DX11CreateEffectFromMemory(shaderBuffer->GetBufferPointer(), shaderBuffer->GetBufferSize(), 0, m_device, &effect); if (FAILED(result)) { ShowCursor(TRUE); MessageBox(NULL, L"Failed to create shader!", L"Error!", MB_ICONEXCLAMATION | MB_OK); return false; } textureBuffer = 0; //---- Create techniques ----// basicTechnique = effect->GetTechniqueByName("ColorTech"); //---- Create effect buffers ----// matrixBuffer = effect->GetVariableByName("wvpMatrix")->AsMatrix(); lightBuffer = effect->GetVariableByName("pointLight"); eyePosBuffer = effect->GetVariableByName("eyePos"); textureBuffer = effect->GetVariableByName("textureBuffer")->AsShaderResource(); materialBuffer = effect->GetVariableByName("mat");
Und mit:
textureBuffer->SetResource(conductor->textureBuffer);
weise ich dem Shader dann die Resource , also die Textur zu.
-
OK. Dann würd ich mal anfangen den Fehler etwas einzugrenzen.
Also z.B. erstmal ne fixe Farbe nach "output" rausschreiben.
Wenn das geht kannst du den Teil schonmal ausschliessen.Dann gucken ob die Texturkoordinaten stimmen, z.B. indem du die Texturkoordinaten einfach mal als Farbe interpretierst.
Wenn das geht kannst du die Texturkoordinaten ausschliessen.
-
Das funktioniert. Hier die Texturkoordinaten farblich auf die Polygone projeziert:
http://imgur.com/cZg9YF9
-
Returnwert von D3DX11CreateShaderResourceViewFromFile prüfen?
Bzw. biste schonmal durchgesteppt und hast geguckt ob auch wirklich alles gut aussieht, z.B. ob conductor->textureBuffer auch wirklich != null ist?
-
Nein, hab ich auch schon ausprobiert.
Vielen Dank übrigens für deine Hilfe.
-
Gerne, wobei ... Hilfe war's ja nicht, bisher bloss der Versuch
Und ich bin dann auch bald mit meinem Latein am Ende - wie gesagt, mit D3D11 hab' ich noch nix gemacht.
Ich würde vermutlich als nächstes mal gucken ob die Textur richtig geladen werden konnte. Also ob der Grund nicht vielleicht einfach ist dass D3DX11CreateShaderResourceViewFromFile aus irgend einem Grund einen vollständig weissen Texture-Buffer zurückgibt.
Bzw. mal probieren ob es nen Unterschied macht wenn du die Textur mittels
": register t0"
fix an ein Register bindest und dann ggf. noch die Textur für das Register setzt statt über dieGetVariableByName("textureBuffer")->AsShaderResource()
Sache.
-
Schon die Rückgabewerte geprüft, z.B. von "textureBuffer->SetResource" ?
Kenne mich mit DirectX nicht so aus, aber kann es sein dass du "PSSetShaderResources" nutzen musst um Resourcen zu setzen ?
Und wo setzt du die eigentliche Textur, also "textureMap" ?
-
@hustbaer:
Das mit den Registern würde das Problem dennoch nicht lösen, da ich gerne mit der effect library arbeiten würde.@DarkShadow44:
Genial!Mit diesem Code:
HRESULT result = d3d->textureBuffer->SetResource(conductor->textureBuffer); if (FAILED(result)) { ShowCursor(TRUE); MessageBox(NULL, L"failed to set resource", L"Error!", MB_ICONEXCLAMATION | MB_OK); return false; }
wird dann die Fehlermeldung ausgegeben. Jetzt können wir das ganze immerhin schon eingrenzen.
Edit: Jedoch sind "conductor->textureBuffer" und "d3d->textureBuffer" nicht null
Edit#2: Genauer gesagt gibt SetResource E_FAIL zurück. Im doc steht dazu folgendes: "Attempted to create a device with the debug layer enabled and the layer is not installed."
-
(schon seite einer Stunde unfassbar den Kopf schüttelnd):
Im Shader habe ich die Textur "textureMap" genannt und wo ich den Buffer kreiere "textureBuffer".
Es sind oft die einfachsten DingeVielen Dank nochmal für eure Hilfe.
LG lonol15
-
lonol15 schrieb:
Im Shader habe ich die Textur "textureMap" genannt und wo ich den Buffer kreiere "textureBuffer".
DarkShadow44 schrieb:
Und wo setzt du die eigentliche Textur, also "textureMap" ?
Genau das hatte ich auch vermutet, aber gut dass es jetzt klappt.
-
Ich finde es irgendwie komisch dass bei GetVariableByName in so einem Fall überhaupt was zurückkommt.