Tamam İlk kadar koordinatları:DirectX Klip boşluk doku kullanıyorum
- DirectX 10
- C++
Tamam bu bana tuhaf birinin biraz, ben genellikle olmaz soruyu sor, ama şartla zorlandım. Ben dönüştürülmez aslında aracılığıyla ekrana hizalanmış tam ekran, iki üçgen var (içine girmeyeceğim nedenlerle bir dörtlü).
DirectX köşe bildirimi beyanında 3 bileşenli bir float (Pos x, y, z) ve 2 bileşenli float (Texcoord x, y) geçiriyorum. Texcoord z, şu anda piksel gölgelendiricide 0 olarak varsayılan olduğum texture2d dizileri için ayrılmıştır.
Ben bu basit görevi başarmak için yazdı:
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 Düzen: (Güncelleme)
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 }
};
Veri aşağıdaki biçimde tepe tarayıcı ulaşır: (Güncelleme)
struct VS_INPUT
{
float3 fPos :POSITION;
float3 fTexcoord :TEXCOORD0;
}
Vertex ve Pixel shader'ım içinde, bu özel çizim çağrısı için pek bir şey gerçekleşmiyor, piksel gölgelendirici, belirtilen UV koordinatlarını kullanarak bir dokudan işin çoğunu yapıyor. Ancak, bu beklendiği gibi çalışmıyor, örneklenen doku yalnızca 1 piksel alıyorum. Geçici çözüm aşağıdakileri yapmak için piksel gölgelendiricideki
oldu:
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;
}
Ayrıca bu şu VS ile çalıştı belirterek değerdi (Güncelleme) dışarı yapı shader tanımlanan:
struct VS_OUTPUT
{
float4 fPos :POSITION0; // SV_POSITION wont work in this case
float3 fTexcoord :TEXCOORD0;
}
Artık tüm ekrana sığacak şekilde uzatılmış bir doku var, her iki üçgen de bunu zaten kaplıyor, ancak doku UV'si neden beklendiği gibi kullanılmadı?
Netleştirmek için nokta örnekleyici kullanıyorum ve hem kelepçe hem de sarma UV denediniz.
Biraz merak ettim ve yukarıda bahsedilen bir çözüm/çözüm buldum, ancak bunun neden olduğunu bilen biri varsa bunu yapmak zorunda kalmamayı tercih ediyorum.
Güncellenmiş soru, henüz nasıl göründüğüne benzemiyorum bu ortamda uzun süre çalışmak. – Jay
CreateVertex özel bir şey yapmaz, istediğimi döndürür. Farklı olabilecek tek şey, texcoord Z'nin kullanılmadığı ve gelecekte doku dizilerini kullanmaya bırakılmış olmasıdır. – Jay
Hizalama doğrudur, adım 24 baytlık doğru değerdir (16 baytlık bir sayı değil, ancak yine de dx auto pads olarak çalışmalıdır) – Jay