Domanda

Va bene, prima sto usando:

  • DirectX 10
  • C ++

Ok, questo è un po 'bizzarro per me, di solito non farei la domanda, ma sono stato costretto dalle circostanze. Ho due triangoli (non un quad per ragioni in cui non andrò a schermo intero, allineato allo schermo attraverso il fatto che non sono trasformati.

Nella dichiarazione DirectX Vertex sto passando un float a 3 componenti (POS X, Y, Z) e 2 Float componente (Texcoord X, Y). TexCoord Z è riservato per le matrici di Texture2D, che attualmente sono inadempiente a 0 nello shader pixel.

L'ho scritto per ottenere il semplice compito:

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));

Layout IA: (Aggiornamento)

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 }
};

I dati raggiungono lo shader Vertex nel seguente formato: (Aggiornamento)

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

All'interno del mio vertice e pixel shader non sta accadendo molto per questa particolare chiamata di sorteggio, lo shader pixel fa la maggior parte del campionamento di lavoro da una trama usando le coordinate UV specificate. Tuttavia, questo non funziona come previsto, sembra che sto ottenendo Solo 1 pixel della trama campionata.

La soluzione alternativa era nello shader pixel per fare quanto segue: (Aggiornamento)

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;
}

Vale anche la pena notare che questo ha funzionato con la seguente vs out struct definita negli shader:

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

Ora ho una trama che si estende per adattarsi all'intero schermo, entrambi i triangoli coprono già questo, ma perché la consistenza UV non si è usata come previsto?

Per chiarire, sto usando un campionatore di punti e ho provato sia un morsetto che avvolgendo UV.

Ero un po 'curioso e ho trovato una soluzione / alternativa menzionata sopra, tuttavia preferirei non doverlo farlo se qualcuno sa perché sta accadendo?

Nessuna soluzione corretta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top