游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2625|回复: 7

有关HLSL在SVP和HVP之间不正确的问题,请高手指点

[复制链接]

13

主题

74

帖子

74

积分

注册会员

Rank: 2

积分
74
发表于 2006-6-28 11:32:00 | 显示全部楼层 |阅读模式
问题是这样的,我写了一个非常简单的HLSL,在Software Vertex Processing下是正确的,但是一旦使用Hardware Vertex Processing就不能正确显示了,看结果应该是Shader没有执行(虽然设置了使用HLSL来渲染,但实际还是执行的固定管线的渲染),以下是简单的HLSL代码:
请教高手,为什么会是这样?

const float2 QUAD_TEXCOORD[4] =
{
    float2(0.0f, 0.0f),
    float2(1.0f, 0.0f),
    float2(0.0f, 1.0f),
    float2(1.0f, 1.0f),
};

const float4 PP[4] =
{
    float4(0.0f, 0.0f, 0.0f, 1.0f),
    float4(0.5f, 0.0f, 0.0f, 1.0f),
    float4(0.0f, 0.5f, 0.0f, 1.0f),
    float4(0.5f, 0.5f, 0.0f, 1.0f),
};

struct VS_INPUT
{
        float4 position0 : POSITION0;
        float4 color0 : COLOR0;
        float2 texcoord0 : TEXCOORD0;
        float4 index : BLENDINDICES;       
};

struct VS_OUTPUT
{
   float4 position : POSITION;
   float4 color0 : COLOR0;
   float2 texcoord0 : TEXCOORD0;
};

VS_OUTPUT vs_main(VS_INPUT vs_in)
{
    VS_OUTPUT vs_out;
    int vert_index[4];

    float4 pos;
    float2 t;
   
    int4 vv = D3DCOLORtoUBYTE4(vs_in.index);
    vert_index = (int[4])vv;

   
  
    vs_out.position = PP[vert_index[1]];
    vs_out.color0 = float4(1.0f, 1.0f, 1.0f, 1.0f);
    vs_out.texcoord0 = QUAD_TEXCOORD[vert_index[1]];
   
    return vs_out;
}

technique t0
{
        pass p0
        {
                VertexShader = compile vs_2_0 vs_main();
                PixelShader  = null;       
        }
}

18

主题

573

帖子

573

积分

高级会员

Rank: 4

积分
573
发表于 2006-6-28 13:17:00 | 显示全部楼层

Re:有关HLSL在SVP和HVP之间不正确的问题,请高手指点

你的显卡支持VS2。0吗?VertexShader = compile vs_2_0 vs_main();看你用的是2。0编译的。在SVP下可以模拟VS到3。0的,但是HVP下就必须要你的显卡支持了。所以改成1。1试试吧!

121

主题

2029

帖子

2034

积分

金牌会员

Rank: 6Rank: 6

积分
2034
QQ
发表于 2006-6-28 20:35:00 | 显示全部楼层

Re:有关HLSL在SVP和HVP之间不正确的问题,请高手指点

显卡很老了。。。

13

主题

978

帖子

978

积分

高级会员

Rank: 4

积分
978
发表于 2006-6-28 21:20:00 | 显示全部楼层

Re:有关HLSL在SVP和HVP之间不正确的问题,请高手指点

An ancient display card……

13

主题

74

帖子

74

积分

注册会员

Rank: 2

积分
74
 楼主| 发表于 2006-6-29 00:02:00 | 显示全部楼层

Re:有关HLSL在SVP和HVP之间不正确的问题,请高手指点

显卡当然是支持vs2。0的。各位如果曾经写过类似的hlsl应该都会碰到此类问题。这是一个奇怪的现象,在svp下的执行结果竟然和hvp下不同。最主要的是shader的代码本身非常简单,没有逻辑错误。而最终的结果是在hvp下,这段vertex shader竟然没有被执行(注意!这里是没有被执行,但也没有报错,也就是说directx好像直接使用了固定管线的方式直接做了T&L的转换)。如果再加上pixel shader,会发现pixel shader却是执行了。

最后标注一下,这段hlsl的本意是:在屏幕中画4个点组成的一个矩形(2个三角形)。输入的数据源不再使用vertex buffer的数据,而是使用通过常量寄存器动态传入的数据(包括位置,颜色,uv坐标等)。

22

主题

274

帖子

274

积分

中级会员

Rank: 3Rank: 3

积分
274
发表于 2006-6-29 13:48:00 | 显示全部楼层

Re:有关HLSL在SVP和HVP之间不正确的问题,请高手指点

把CONST前面加STATIC看看.
我一般不直接使用HLSL,我会用FXC.EXE编译他为VSO和PSO直接使用,如果不加STATIC,就不会生成DEF CX,X,X,X,X指令,这样就必须用SETVERTEXSHADRECONSTF(..)设置CONST.

你试试,我也不知道,直接使用HLSL引发的BUG不好找,最好用HLSL写SHADER再编译成VSO和PSO.

59

主题

984

帖子

1200

积分

金牌会员

Rank: 6Rank: 6

积分
1200
发表于 2006-6-30 01:48:00 | 显示全部楼层

Re:有关HLSL在SVP和HVP之间不正确的问题,请高手指点

使用HVP时,硬件不支持的功能会直接跳过,而且不会报错
另外你应该检查常量寄存器中的值是否正确
有时寄存器中的值不正确,程序也会直接跳过,且不报错

13

主题

74

帖子

74

积分

注册会员

Rank: 2

积分
74
 楼主| 发表于 2006-6-30 15:17:00 | 显示全部楼层

Re:有关HLSL在SVP和HVP之间不正确的问题,请高手指点

To moremoretime,
      非常感谢你的建议,确实如你所说,加上static是必要的。

问题已经解决了,问题出在Effect上,我在渲染和设置寄存器参数的时候,都是通过ID3DXEffect来执行的,而上面这段shader代码在HVP模式下,由Effect执行无法获得正确的结果(也不会报错!!!)。而由fxc编译成vertex shader的指令,是可以正确执行的,这个问题让我对D3DXEffect产生了某种莫名的排斥,看来以后还是尽量用VS,PS,少用Efx。



感谢 moremoretime, clayman和所有回帖的朋友 :)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-24 20:37

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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