前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一个HLSL的常量数组问题

一个HLSL的常量数组问题

作者头像
逍遥剑客
发布2018-05-23 16:01:59
2K0
发布2018-05-23 16:01:59
举报

在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;  

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

检查了贴图没问题, 那么只可能是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啊-_-

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2010年10月02日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档