备案 控制台
学习
实践
活动
专区
工具
TVP
写文章
专栏首页 逍遥剑客的游戏开发 一个HLSL的常量数组问题
3 0

海报分享

一个HLSL的常量数组问题

在RenderMonkey里写了RNM的demo:

  1. float fUvScale;
  2. sampler2D diffuseMap;
  3. sampler2D normalMap;
  4. sampler2D lightMap1;
  5. sampler2D lightMap2;
  6. sampler2D lightMap3;
  7. const float3 bumpBasis[3] =
  8. {
  9. {sqrt(2.0 / 3.0), 0.0, 1.0 / sqrt(3.0)},
  10. {-1.0 / sqrt(6.0), -1.0 / sqrt(2.0), 1.0 / sqrt(3.0)},
  11. {-1.0 / sqrt(6.0), 1.0 / sqrt(2.0), 1.0 / sqrt(3.0)},
  12. };
  13. struct PS_INPUT
  14. {
  15. float2 Texcoord0 : TEXCOORD0;
  16. float3 Texcoord1 : TEXCOORD1;
  17. };
  18. float4 ps_main( PS_INPUT Input ) : COLOR0
  19. {
  20. float3 normal = normalize((tex2D(normalMap, Input.Texcoord0).xyz * 2.0f) - 1.0f );
  21. normal.y = -normal.y;
  22. float3 dp;
  23. dp.x = saturate(dot(normal, bumpBasis[0]));
  24. dp.y = saturate(dot(normal, bumpBasis[1]));
  25. dp.z = saturate(dot(normal, bumpBasis[2]));
  26. dp *= dp;
  27. float sum = dot(dp, float3(1.0, 1.0, 1.0));
  28. dp *= 2.0;
  29. Input.Texcoord1 *= fUvScale;
  30. float3 diffuseLighting = dp.x * tex2D(lightMap1, Input.Texcoord1) +
  31. dp.y * tex2D(lightMap2, Input.Texcoord1) +
  32. dp.z * tex2D(lightMap3, Input.Texcoord1);
  33. diffuseLighting /= sum;
  34. float4 diffuse = tex2D(diffuseMap, Input.Texcoord0);
  35. diffuse.xyz = diffuseLighting;
  36. return diffuse;
  37. }

效果在这里面是正确的. 然后转到引擎里发现竟然变成这样了:

检查了贴图没问题, 那么只可能是bumpBasis的问题了. 把下面的引用换成float3(...)这种写死的表达式, 果然效果正确了:

要说环境有什么不同, 引擎里是写在.fx文件里的. 难道编译的时候被当成了外部传入的参数? 查了一下HLSL的说明, 发现有个修饰词:

static

Mark a local variable so that it is initialized one time and persists between function calls. If the declaration does not include an initializer, the value is set to zero. A global variable marked static is not visible to an application.

把const float3 bumpBasis[3]改成static const float3 bumpBasis[3], 果然问题没有了!

问题又来了, 为啥在RM里就是好的....而且以前我自己写类似功能时候也没有加static啊-_-

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!
本文分享自作者个人站点/博客: http://blog.csdn.net/xoyojank 复制
如有侵权,请联系 cloudcommunity@tencent.com 删除。