游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1414|回复: 4

一个弱弱的问题,关于shader

[复制链接]

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2007-6-11 12:05:00 | 显示全部楼层 |阅读模式
刚静下心来搞搞shader,是不是shader的全局参数一定要参与output里面的计算,否则程序里面就不能够获取全局参数?

以下是个很基本的漫反射着色的shader

matrix ViewMatrix;
matrix ViewProjMatrix;

vector AmbientMtrl;
vector DiffuseMtrl;

vector LightDirection;


vector DiffuseLightIntensity = {0.0f, 0.0f, 1.0f, 1.0f};
vector AmbientLightIntensity = {0.0f, 0.0f, 0.2f, 1.0f};


struct VS_INPUT
{
    vector position : POSITION;
    vector normal   : NORMAL;
};

struct VS_OUTPUT
{
    vector position : POSITION;
    vector diffuse  : COLOR;
};



VS_OUTPUT Main(VS_INPUT input)
{
    // zero out all members of the output instance.
    VS_OUTPUT output = (VS_OUTPUT)0;

    output.position = mul(input.position, ViewProjMatrix);
    LightDirection.w = 0.0f;
    input.normal.w   = 0.0f;
    LightDirection   = mul(LightDirection, ViewMatrix);
    input.normal     = mul(input.normal,   ViewMatrix);

    float s = dot(LightDirection, input.normal);


    if( s < 0.0f )
        s = 0.0f;
        
    output.diffuse = (AmbientMtrl * AmbientLightIntensity) +
                     (s  * (DiffuseLightIntensity * DiffuseMtrl));
                     //我如果把这里的s该成0.1f,随便的一个数,也就是屏蔽了光照的计算,那么程序里面的LightDirection就无法通过GetConstantByName获取了
    return output;
}

31

主题

249

帖子

259

积分

中级会员

Rank: 3Rank: 3

积分
259
发表于 2007-6-11 12:37:00 | 显示全部楼层

Re:一个弱弱的问题,关于shader

不仅仅是全局参数,所有变量都一样,如果不参与计算就会被屏蔽掉。你可以用跟踪调试看看的,被屏蔽的变量都只有显示"*",没有数字。这样就减少了大量数据传输。
我猜测Shader编译器是倒着编译的,只编译队最终结果会产生影响的那部分代码(不过是我猜测的)。

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
 楼主| 发表于 2007-6-11 13:47:00 | 显示全部楼层

Re:一个弱弱的问题,关于shader

明白了,原来是这样,好奇怪的编译原理
那有的时候为了调试想屏蔽一些功能,外面的参数调用都要受很大的影响了

36

主题

1047

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
发表于 2007-6-11 21:39:00 | 显示全部楼层

Re:一个弱弱的问题,关于shader

编译 shader 时指定 D3DXSHADER_SKIPOPTIMIZATION 标志。

31

主题

249

帖子

259

积分

中级会员

Rank: 3Rank: 3

积分
259
发表于 2007-6-11 22:50:00 | 显示全部楼层

Re:一个弱弱的问题,关于shader

指定 D3DXSHADER_SKIPOPTIMIZATION 标志后,调试时仍然看不到屏蔽掉的变量的值。这个标志在调试时使用,发布Release版本时要去掉,不然会影响程序效率。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-26 04:32

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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