2012-02-23 25 views
5

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.

cevap

1

Pekala, bir tanesi için, 0..1 aralığı dışındaki doku koordinatları kenetleniyor. Doku koordinatlarının da olacağı -1 ile +1 arasında boşluk bırakarak bunu varsaymaktan vazgeçtim. Durum böyle değil, hala 0.0 ile 1.0 arasında.

Piksel gölgelendiricisindeki kodun çalışmasının nedeni, bu doku koordinatlarının otomatik olarak üzerine yazmak için x, y, z koordinatlarını kullanmasıydı; Benim açımdan bir gözetim. Bununla birlikte, piksel gölgelendirici kodu, tam ekranda 'dörtlü' bir doku uzamasıyla sonuçlanır, bu yüzden birileri için yararlı olabilir;)

1

Köşe tipiniz için hangi semantikleri belirliyorsunuz? Köşelerinizle ve aynı zamanda gölgelendiricinizle düzgün bir şekilde hizalanmış mı? Bir D3DXVECTOR4, D3DXVECTOR3 kurulumu (VS kodunuzda gösterildiği gibi) kullanıyorsanız, bu CreateVertex() bir D3DXVECTOR3, D3DXVECTOR2 yapısını döndürürse bir sorun olabilir. Piksel gölgelendirici kodunuzu da görmek güven verici olur.

+0

Güncellenmiş soru, henüz nasıl göründüğüne benzemiyorum bu ortamda uzun süre çalışmak. – Jay

+0

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

+0

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