像素着色器奇怪的编译错误

时间:2010-03-22 18:13:04

标签: directx pixel shader

我正在使用着色器,我不断得到这个奇怪的编译错误让我疯狂!

以下像素着色器代码段:

            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;” line,即让'LightStrFactor'值成为上面计算的结果,它无法编译着色器。

LightStrFactor是一个浮点数 LightVal& f4Light [i]是float4 所有其余的都是float3。

我的问题是,除了为什么不编译之外,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;

任何帮助表示赞赏 谢谢!!! :

3 个答案:

答案 0 :(得分:0)

不要忘记着色器在编译时会得到很多优化。这可能是您在对值进行硬编码时不会失败的原因。

当你为一个方程式分配一个方程式后对它进行硬编码时,整个方程式会被优化掉,而你只能在最终分配时被遗漏。

答案 1 :(得分:0)

像素着色器不支持C ++风格的强制转换 - 在您的示例中为float( ... )。由于它完全是多余的,你可以摆脱它,但如果你想要一个演员,请使用{C

中的(float)

答案 2 :(得分:0)

从你的着色器片段看起来,你正在迭代一些灯光,积累他们的贡献。

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

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

如果可能的应用程序硬件目标,只需碰撞着色器配置文件版本将允许着色器使用更多的指令槽,并编译没有错误。任何ps_3_0 / ps_2_a / ps_2_b都应该能够编译着色器。 (2_a / b配置文件是sorta bastard,但官方支持,基础2_0配置文件的NV / ATI扩展)

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