游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3162|回复: 8

请熟悉cg 语言的朋友来解答

[复制链接]

32

主题

377

帖子

378

积分

中级会员

Rank: 3Rank: 3

积分
378
发表于 2009-7-5 12:03:00 | 显示全部楼层 |阅读模式
以下是一段cg函数,在FragmentProgram中调用,使用的cg profile是ps_3_0。该函数能够通过编译,但在运行时会造成输出的图像不正常。这种“不正常”不是指由算法计算错误引发的错误的效果(跟函数本身的输出没什么关系),看起来更像是“使用显存随机数据填充的图像”(换句话说就是乱的,像是某种GPU运行异常的结果)。

希望熟悉cg的朋友帮忙看下,为什么会出现这种情况?

是因为在ps3.0下有循环操作的限制造成的GPU运行异常吗?我查阅了资料,没有找到相关说明。


float function(sampler2D directionsfield, sampler2D depthfield, int size, int steps, float2 depthClipper, float2 screenSpaceCoord)
{
        float singleCoord = 1.0f / float(size);
        float singleStep = 1.0f / float(steps);
        float occlusion = 0.0f;
        float scale = 1.0f / 16.0f;

        float2 coord = float2(0.0f, 0.0f);

        for(int hsize=0; hsize<size; ++hsize)
        {
                for(int vsize=0; vsize<size; ++vsize)
                {
                        float3 direction = tex2D(directionsfield, coord);
                        direction = normalize(direction);
                        direction /= direction.z;
                        direction *= singleStep;

                        bool detected = false;
                        float2 depthfieldCoord = screenSpaceCoord;
                float stepDepth = 0.0f;
                        for( int step=0; step<steps; ++step)
                        {
                                float depth = tex2D(depthfield, depthfieldCoord).r;
                                depth = 1.0f - (depth*depthClipper.x + depthClipper.y) / depth;

                                if(!detected && depth>=stepDepth )
                                {
                                        occlusion +=  1.0f - stepDepth;
                                        detected = true;
                                }
                                depthfieldCoord += direction.xy;
                                stepDepth += singleStep;
                        }
                        coord.y += singleCoord;
                }
                coord.x += singleCoord;
        }

        return occlusion * scale;
}

1

主题

16

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2009-7-5 15:36:00 | 显示全部楼层

Re:请熟悉cg 语言的朋友来解答

我也用过循环生成过二维纹理,没有问题,不过没你这个复杂

1

主题

5

帖子

27

积分

注册会员

Rank: 2

积分
27
发表于 2009-7-5 15:42:00 | 显示全部楼层

Re:请熟悉cg 语言的朋友来解答

不了解,路过

32

主题

377

帖子

378

积分

中级会员

Rank: 3Rank: 3

积分
378
 楼主| 发表于 2009-7-5 16:46:00 | 显示全部楼层

Re: Re:请熟悉cg 语言的朋友来解答

forregister: Re:请熟悉cg 语言的朋友来解答

我也用过循环生成过二维纹理,没有问题,不过没你这个复杂


我做Paralax map也是用的cg,虽然实现了,但编写过程也遇到过类似的问题。由于没有系统学习过cg的教程(其实最近下了个看了看,教程上也没讲什么特别的),所以一直以来只是把cg当类c语言用,一般的算法编写都没有问题,主要就是循环。

另外我觉得,cg确实存在很多问题,比如在运行时刻编译上有一些明显的错误不会报,而且好像也得不到具体的编译错误信息。这一点来看,HLSL要好很多。

227

主题

1793

帖子

1866

积分

金牌会员

Rank: 6Rank: 6

积分
1866
发表于 2009-7-6 08:49:00 | 显示全部楼层

Re:请熟悉cg 语言的朋友来解答

我说楼主
你啥显卡

32

主题

377

帖子

378

积分

中级会员

Rank: 3Rank: 3

积分
378
 楼主| 发表于 2009-7-6 15:20:00 | 显示全部楼层

Re: Re:请熟悉cg 语言的朋友来解答

oz01: Re:请熟悉cg 语言的朋友来解答

我说楼主
你啥显卡



8800GT, 支持Shader Model4.0,我想不是它上面的问题吧?

不过我的确没有在其他显卡上试过。

227

主题

1793

帖子

1866

积分

金牌会员

Rank: 6Rank: 6

积分
1866
发表于 2009-7-7 12:25:00 | 显示全部楼层

Re:请熟悉cg 语言的朋友来解答

看起来更像是“使用显存随机数据填充的图像”(换句话说就是乱的,像是某种GPU运行异常的结果)。

这个一般来说是代码错误导致的
可你这个还能通过编译
那就应该是硬件不支持
可你的显卡支持sm4.0……这我就真不知道啥问题了
八成还是和编译的某些设置有关
你去掉循环肯定就正常了

32

主题

377

帖子

378

积分

中级会员

Rank: 3Rank: 3

积分
378
 楼主| 发表于 2009-7-7 19:57:00 | 显示全部楼层

Re: Re:请熟悉cg 语言的朋友来解答

oz01: Re:请熟悉cg 语言的朋友来解答

看起来更像是“使用显存随机数据填充的图像”(换句话说就是乱的,像是某种GPU运行异常的结果)。

这个一...


问题就是这个循环啊。 我找不出问题出在哪里(除非是cg语言的问题)?所以才来发帖希望熟悉的朋友能够解答。

32

主题

377

帖子

378

积分

中级会员

Rank: 3Rank: 3

积分
378
 楼主| 发表于 2009-7-11 14:51:00 | 显示全部楼层

Re:请熟悉cg 语言的朋友来解答

我又试了下,发现似乎是循环嵌套太多了(三层)。至于cg或者sm3.0对循环嵌套有要求,我只是在一本介绍shader asm的书中找到相关提及,如下:

   1. VS,PS 2.0-3.0x 中循环最大次数是255。循环不允许嵌套。(不过这段说明是针对rep指令的,我假设loop指令跟它拥有一样的限制条件)
   2. call(转入指定代码段,类似function call)指令,最大嵌套层数是4.
   3. if, 最大嵌套数是24层。
   4.如果我没有弄错,采样tex是不可以放在分支中的(比如if)。

如果我总结有误,请大家提出来。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-19 19:48

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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