Question

D'accord, j'utilise d'abord:

  • DirectX 10
  • C ++

D'accord, c'est un peu bizarre pour moi, je ne poserais généralement pas la question, mais j'ai été forcé par les circonstances. J'ai deux triangles (pas un quad pour des raisons dans lesquelles je n'entre pas!) Full écran, aligné pour dépister le fait qu'ils ne sont pas transformés.

Dans la déclaration DirectX Vertex, je passe un flotteur à 3 composants (POS X, Y, Z) et 2 Float de composant (Texcoord X, Y). TexCoord Z est réservé aux tableaux Texture2D, que je défaut actuellement à 0 dans le shader du pixel.

J'ai écrit ceci pour réaliser la tâche simple:

float fStartX = -1.0f;
float fEndX = 1.0f;
float fStartY = 1.0f;
float fEndY = -1.0f;
float fStartU = 0.0f;
float fEndU = 1.0f;
float fStartV = 0.0f;
float fEndV = 1.0f;
vmvUIVerts.push_back(CreateVertex(fStartX, fStartY, 0, fStartU, fStartV));
vmvUIVerts.push_back(CreateVertex(fEndX, fStartY, 0, fEndU, fStartV));
vmvUIVerts.push_back(CreateVertex(fEndX, fEndY, 0, fEndU, fEndV));
vmvUIVerts.push_back(CreateVertex(fStartX, fStartY, 0, fStartU, fStartV));
vmvUIVerts.push_back(CreateVertex(fEndX, fEndY, 0, fEndU, fEndV));
vmvUIVerts.push_back(CreateVertex(fStartX, fEndY, 0, fStartU, fEndV));

IA Layout: (mise à jour)

D3D10_INPUT_ELEMENT_DESC ieDesc[2] = {
    { "POSITION",   0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 },
    { "TEXCOORD",   0, DXGI_FORMAT_R32G32B32_FLOAT, 0,12, D3D10_INPUT_PER_VERTEX_DATA, 0 }
};

Les données atteignent le vertex shader dans le format suivant: (mise à jour)

struct VS_INPUT
{ 
    float3 fPos          :POSITION;
    float3 fTexcoord     :TEXCOORD0;
}

Dans mon sommet et mon shader Pixel, il ne se passe pas grand-chose pour cet appel de dessin particulier, le pixel shader fait la majeure partie du travail d'échantillonnage à partir d'une texture à l'aide des coordonnées UV spécifiées. Cependant, cela ne fonctionne pas tout comme prévu, il semble que je reçois Seulement 1 pixel de la texture échantillonnée.

La solution de contournement était dans le shader de Pixel pour effectuer ce qui suit: (mise à jour)

sampler s0                      : register(s0);
Texture2DArray<float4> meshTex  : register(t0);
float4 psMain(in VS_OUTPUT vOut) : SV_TARGET
{
    float4 Color;
    vOut.fTexcoord.z = 0;
    vOut.fTexcoord.x = vOut.fPosObj.x * 0.5f;
    vOut.fTexcoord.y = vOut.fPosObj.y * 0.5f;
    vOut.fTexcoord.x += 0.5f;
    vOut.fTexcoord.y += 0.5f;
    Color = quadTex.Sample(s0, vOut.fTexcoord);
    Color.a = 1.0f;
    return Color;
}

Il convient également de noter que cela a fonctionné avec la structure VS Out suivante définie dans les shaders:

struct VS_OUTPUT
{
    float4 fPos          :POSITION0; // SV_POSITION wont work in this case
    float3 fTexcoord    :TEXCOORD0;
}

Maintenant, j'ai une texture qui est étendue pour s'adapter à l'écran entier, les deux triangles couvrent déjà cela, mais pourquoi les UV de texture ne sont-ils pas utilisés comme prévu?

Pour clarifier, j'utilise un échantillonneur ponctuel et j'ai essayé à la fois la pince et l'enveloppe des UV.

J'étais un peu curieux et j'ai trouvé une solution / solution de contournement mentionnée ci-dessus, mais je préférerais ne pas avoir à le faire si quelqu'un sait pourquoi cela se produit?

Pas de solution correcte

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top