2014-10-24 12 views
7

Eğitmenlerim/laboratuvar asistanlarım kadar kesinlikle güvendim. Nedense hatası X8000: D3D11 İç Derleyici hatası: Geçersiz Bayt kodu: opcode # 86 işleneni # 1 için geçersiz işlenen türü (sayımlar 1 tabanlı)

aşağıdaki HLSL kod çıktı penceresinde bu döndürüyor: Burada

error X8000 : D3D11 Internal Compiler error : Invalid Bytecode: Invalid operand type for operand #1 of opcode #86 (counts are 1-based). 

soruna neden HLSL işlevi var:

// Projects a sphere diameter large in screen space to calculate desired tesselation factor 
float SphereToScreenSpaceTessellation(float3 p0, float3 p1, float diameter) 
{ 
float3 centerPoint = (p0 + p1) * 0.5f; 

float4 point0 = mul(float4(centerPoint,1.0f) , gTileWorldView); 

float4 point1 = point0; 
point1.x += diameter; 

float4 point0ClipSpace = mul(point0, gTileProj); 
float4 point1ClipSpace = mul(point1, gTileProj); 

point0ClipSpace /= point0ClipSpace.w; 
point1ClipSpace /= point1ClipSpace.w; 

point0ClipSpace.xy *= gScreenSize; 
point1ClipSpace.xy *= gScreenSize; 

float projSizeOfEdge = distance(point0ClipSpace, point1ClipSpace); 

float result = projSizeOfEdge/gTessellatedTriWidth; 

return clamp(result, 0, 64); 
} 

Ben aşağı daralmış ettik intrinsik "mul" olabileceği noktaya kadar. Biz kod herşeyi alınır ve bunun gibi geçici bir değişken dışarı dönmeye çalıştı ve iyi çalışıyor ettik: herkes

float SphereToScreenSpaceTessellation(float3 p0, float3 p1, float diameter) 
{ 

float temp = 0; 

float3 centerPoint = (p0 + p1) * 0.5f; 

float4 point0 = mul(float4(centerPoint,1.0f) , gTileWorldView); 

float4 point1 = point0; 
point1.x += diameter; 

float4 point0ClipSpace = mul(point0, gTileProj); 
float4 point1ClipSpace = mul(point1, gTileProj); 

point0ClipSpace /= point0ClipSpace.w; 
point1ClipSpace /= point1ClipSpace.w; 

point0ClipSpace.xy *= gScreenSize; 
point1ClipSpace.xy *= gScreenSize; 

float projSizeOfEdge = distance(point0ClipSpace, point1ClipSpace); 

float result = projSizeOfEdge/gTessellatedTriWidth; 

return temp; 
//return clamp(result, 0, 64); 
} 

merak varsa:

gTileWorldView, gTileProj are float4x4's in a .hlsli file 
gScreenSize is a float2 in a .hlsli file. 
gTessellatedTriWidth is a float in a .hlsli file. 

aşağıdaki fonksiyon devletler gibidir 2011 NVidia gölgelendiricisinde: http://dx11-xpr.googlecode.com/svn/trunk/XPR/Media/Effects/TerrainTessellation.fx

Çözümlerini değişkenlerini değiştirerek yukarıdakiler arasında kopyalayıp yapıştırmayı denedim ve listelenen aynı hata oluştu.

Bu görevi yapmak için kesinlikle güldüm ve yardıma ihtiyacım var, lütfen yardım edin.

+0

Araç zincirinin burada nasıl çalıştığını bilmiyorum, ancak HLSL bir dış derleyici tarafından derlendiyse, DirectX'te okuduğunuzda bu ayrı HLSL derleyicisinin çok eski veya yeni olması ihtimali var mıdır? Bu bir Microsoft derleyici tarafından derlenmişse, derleyicisinde bir hata olup olmadığını öğrenmek için bir destek olayı başlatmaya değecektir - özellikle NVidia'nın örnek kodunu derlemeyeceğini gösterebilirseniz? – Rup

+0

Seçeneklerin tükeniyor olması nedeniyle, bunu desteklemek için tekmelemek zorunda kalabilirim. En son HLSL ve Shader Model 5.0'ı kullanıyorum, bu yüzden modası geçmiş şeylerin problem olacağını düşünmüyorum. Yardım için teşekkürler ^^ – JMazzola

+0

Sorun muhtemelen bu çağrıyı yapan gölgelendiricide olacaktır. Sanırım bir gövde gölgelendirici mi yapıyorsun? Gövde gölgelendiricilerindeki 'çıkış' parametrelerinin genellikle iç derleyici hatalarına yol açtığını, ancak semantiklerle dönen yapıların iyi olduğunu buldum. – lcsondes

cevap

0

Kontrol dışarı bu satırı:

point0ClipSpace.xy * = gScreenSize;

gScreenSize bir float2 mı? Scalar herhangi bir vec tipi tarafından bir vec çarpabilirsiniz inanıyorum.

İlgili konular