ошибка X8000: D3D11 Внутренняя ошибка компилятора: Неверный байт-код: Неверный тип операнда для операнда № 1 из кода операции № 86 (количество основано на 1)

Я абсолютно в замешательстве, как и мои инструкторы / лаборанты.

По какой-то причине следующий код HLSL возвращает это в окне вывода:

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

Вот функция в HLSL, вызывающая проблему:

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

Я сузил его до такой степени, что он может быть внутренним «мул». Мы вынули все из кода и попытались вернуть временную переменную, подобную этой, и она отлично работает:

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

Если кому-то интересно

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.

Следующая функция как состояния в шейдере NVidia 2011 года: http://dx11-xpr.googlecode.com/svn/trunk/XPR/Media/Effects/TerrainTessellation.fx

Я попытался скопировать и вставить их решение, заменив их переменными на приведенные выше, и произошла та же самая ошибка.

Я в полном замешательстве, и мне нужна помощь, чтобы выполнить это задание, пожалуйста, помогите.

7

Решение

Проверьте эту строку:

point0ClipSpace.xy * = gScreenSize;

Является ли gScreenSize float2? Я не верю, что вы можете скалярно умножить vec на любой тип vec.

0

Другие решения


По вопросам рекламы [email protected]