错误 X8000 : D3D11 内部编译器错误:无效字节码。操作码#86的操作码#1的操作码类型无效(计数是基于1)

问题描述 投票:8回答:2

我和我的指导老师实验室助理一样,完全被难住了。

出于某种原因,下面的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);
}

我把范围缩小到可能是 "mul "的固有函数的程度 我们把代码中的所有内容都删掉,然后尝试返回一个临时变量,结果工作正常。

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.

下面的函数在2011年的NVidia着色器中是这样写的..: http:/dx11-xpr.googlecode.comsvntrunkXPRMediaEffectsTerrainTessellation.fx。

我试着复制并粘贴他们的解决方案,用上面的变量替换他们的变量,但同样的错误发生了。

我完全被绊住了,我需要帮助,以做这个任务,请帮助。

c++ hlsl opcode operand
2个回答
0
投票

查看这一行。

point0ClipSpace.xy *= gScreenSize;

gScreenSize是一个float2吗? 我不相信你可以用任何类型的vec对vec进行标量乘法。

© www.soinside.com 2019 - 2024. All rights reserved.