游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2872|回复: 5

DirectX 9 Shader编程问题

[复制链接]

23

主题

64

帖子

64

积分

注册会员

Rank: 2

积分
64
发表于 2011-6-9 17:26:00 | 显示全部楼层 |阅读模式
各位大大们,遇到一个很诡异的问题,不知道为什么,请各位大大看下。代码如下:
for(int iLight=0; iLight < NUM_LIGHTS; iLight++)
        {
                float3 vLightToPoint = ViewPos - LightPos[iLight];
                float LenSq = dot(vLightToPoint, vLightToPoint);
                float Len = sqrt(LenSq);
                vLightToPoint = normalize(vLightToPoint);
               
                float Attenuation = Atten0 + Atten1 * Len + Atten2 * LenSq;
               
                float Angle = dot(normalize(LightDir[iLight]), vLightToPoint);
                if(Angle > cos(Phi/2))
                {
                        // 漫反射计算 其中diffContrib为漫反射分量, D为光线方向,ViewNormal为法线,
                        // Diffuse 为两个不变量的乘积(材质漫反射乘上光照漫反射分量)
                        float3 diffContrib = saturate(dot(ViewNormal, -vLightToPoint)) * MatColor * LightColor[iLight] ;
                       
                        //镜面反射计算
                        if(Ks > EPISILON)
                        {
                                 // 镜面反射计算 R为反射向量, specContrib为镜面反射分量, Ks为镜面反射在整个光照中所占比重
                                float3 vReflect = reflect(vLightToPoint, ViewNormal);
                                float fPhongValue = saturate(dot(vReflect, vPointToEye));
                                float3 specContrib = Ks * pow(fPhongValue, SpecExpon) * MatSpecular * LightColor[iLight];
                       
                                // 总的光照效果就等于漫反射、镜面反射与环境光的叠加效果,
                                // 因为我们在第一次渲染时已经渲染过环境光效果,所以这里只需要将漫反射与镜面反射效果叠加即可。
                                I += specContrib + tex2D(samScene, Tex).xyz * diffContrib;
                        }
                        else
                        {
                                I += tex2D(samScene, Tex).xyz * diffContrib;
                        }
                               
                        if(Angle < cos(Theta/2))
                        {
                                float Coef = (Angle - cos(Phi/2)) / (cos(Theta/2) - cos(Phi/2));
                                Coef = pow(Coef, Falloff);
                       
                                I *= Coef;
                        }
                }
                I /= Attenuation;
        }
问题是:如果有这个循环,这个shader就是错误的,没有这个循环shader就能正常运行,各位大大知道为什么吗?现在很纠结啊。

1

主题

19

帖子

19

积分

新手上路

Rank: 1

积分
19
发表于 2011-6-10 13:15:00 | 显示全部楼层

Re:DirectX 9 Shader编程问题

debug看调试信息啊。。。

23

主题

64

帖子

64

积分

注册会员

Rank: 2

积分
64
 楼主| 发表于 2011-6-12 16:29:00 | 显示全部楼层

Re: Re:DirectX 9 Shader编程问题

494588416: ReirectX 9 Shader编程问题

debug看调试信息啊。。。

那个,如何debug FX文件呢

10

主题

55

帖子

55

积分

注册会员

Rank: 2

积分
55
发表于 2011-6-22 09:49:00 | 显示全部楼层

Re:DirectX 9 Shader编程问题

你的NUM_LIGHTS定义的多少。在shader里,现在最好的显卡最大的循环次数仅支持到16次。
如果你想要计算超过16个灯光的话,最好把循环分成若干个次数小于16的循环,然后再做叠加

23

主题

64

帖子

64

积分

注册会员

Rank: 2

积分
64
 楼主| 发表于 2011-11-1 22:00:00 | 显示全部楼层

Re: Re:DirectX 9 Shader编程问题

sanxcoo: ReirectX 9 Shader编程问题

你的NUM_LIGHTS定义的多少。在shader里,现在最好的显卡最大的循环次数仅支持到16次。
如果你想要计算超过16个灯光的话,最好把循环分成若干个次数小于16的循环,然后再做叠加

我仅仅定义了6个灯...

0

主题

769

帖子

1052

积分

金牌会员

Rank: 6Rank: 6

积分
1052
发表于 2011-11-7 12:54:00 | 显示全部楼层

Re:DirectX 9 Shader编程问题

看你的shader model版本是多少的
如果是2.0 那么PS是语句上限就爆了自然就过不去了
试下把版本改成3.0看看是不是就跑起来

如果是的话 检查下代码 看下那些是重复计算 那些是可以优化的
看下能否优化成2.0
毕竟效率不是一级的 尽量用低版本的
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-8 23:44

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表