Directx 像素着色器编译错误

Directx 像素着色器编译错误,directx,pixel,shader,Directx,Pixel,Shader,我在使用着色器时遇到了一些问题,我不断遇到这种奇怪的编译错误,这让我发疯 以下像素着色器代码片段: DirectionVector = normalize(f3LightPosition[i] - PixelPos); LightVec = PixelNormal - DirectionVector; // Get the light strenght factor LightStrFactor =

我在使用着色器时遇到了一些问题,我不断遇到这种奇怪的编译错误,这让我发疯

以下像素着色器代码片段:

            DirectionVector = normalize(f3LightPosition[i] - PixelPos);
            LightVec = PixelNormal - DirectionVector;

            // Get the light strenght factor
            LightStrFactor = float(abs((LightVec.x + LightVec.y + LightVec.z) / 3.0f));

            // TEST!!!
            LightStrFactor = 1.0f;

            // Add this light to the total light on this pixel
            LightVal += f4Light[i] * LightStrFactor;
工作非常完美,但只要我删除“LightStrFactor=1.0f;”行,即让“LightStrFactor”值作为上述计算的结果,它就无法编译着色器

LightStrFactor是一个浮点数 LightVal和f4Light[i]是浮动的4 其余的都是浮动的

我的问题是,除了它为什么不编译之外,DX编译器为什么关心浮点值?即使我的值不正确,它不应该是运行时的吗? 着色器编译代码如下所示:

/* Compile the bitch */
if (FAILED(D3DXCompileShaderFromFile(fileName, NULL, NULL, "PS_MAIN", "ps_2_0", 0, &this->m_pCode, NULL, &this->m_constantTable)))
    GraphicException("Failed to compile pixel shader!");  // <-- gets here :(

if (FAILED(g_D3dDevice->CreatePixelShader( (DWORD*)this->m_pCode->GetBufferPointer(), &this->m_hPixelShader )))
    GraphicException("Failed to create pixel shader!");

this->m_fLoaded = true;
/*编译该程序*/
if(失败(D3DXCompileShaderFromFile(fileName,NULL,NULL,“PS\u MAIN”,“PS\u 2\u 0”,0,&this->m\u pCode,NULL,&this->m\u constantTable)))
GraphicException(“未能编译像素着色器!”);//CreatePixelShader((DWORD*)this->m_pCode->GetBufferPointer(),&this->m_hPixelShader)))
GraphicException(“未能创建像素着色器!”);
这->m_fLoaded=true;
谢谢你的帮助
谢谢!!!:]

不要忘记着色器在编译时会得到很多优化。这可能就是为什么在硬编码值时不会失败


当您在分配一个等式后立即对一个值进行硬编码时,整个等式将得到优化,而您只剩下最后的赋值。

像素着色器不支持C++样式的强制转换--
浮点(
)。由于它是完全冗余的,您可以将其去掉,但是如果您想要进行强制转换,请使用
(float)
,就像在C中一样,从着色器代码片段中,看起来您正在迭代许多灯光,积累它们的贡献

我的猜测是,当编译器使用实际的明暗处理计算展开循环时,编译的着色器使用的算术指令槽比ps_2_0配置文件支持的多(最多64条指令)

当您将计算替换为LightStrFactor=1时,编译器会完全优化前面的三行代码,这会导致测试着色器显著缩短,因此适合分配的64条指令

如果应用程序硬件目标可能的话,只需切换着色器配置文件版本,着色器就可以使用更多指令槽,并且编译时不会出错。任何ps_3_0/ps_2_a/ps_2_b都应该能够编译着色器。(2_a/b配置文件是基本2_0配置文件的NV/ATI扩展部分,但得到官方支持)


(如另一个回复中所述,花时间捕获并打印编译错误是值得的。)

错误信息是什么?花点时间获取错误并在编译时输出它们,这将节省时间。实际上他们允许这样做。至少在我使用的版本中。但是无论如何,谢谢你,如果你完全移除演员阵容会发生什么?整个代码表现得非常伏都教,并且有许多无法解释的错误。在你提到“优化”之后,我突然想起我有很多无用的测试代码和变量,显然它们占用了我卡上的所有空间。清除它们并重新编写所有内容更有效地解决了问题。谢谢:)