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

xiaolizi 2006-06-28 11:31:02
问题是这样的,我写了一个非常简单的HLSL,在Software Vertex Processing下是正确的,但是一旦使用Hardware Vertex Processing就不能正确显示了,看结果应该是Shader没有执行(虽然设置了使用HLSL来渲染,但实际还是执行的固定管线的渲染),以下是简单的HLSL代码:
请教高手,为什么会是这样?


// test.fx
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;
}
}

...全文
303 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
cywater2000 2006-07-04
  • 打赏
  • 举报
回复
什么?居然有这种事?!
xiaolizi 2006-07-01
  • 打赏
  • 举报
回复
OK , 问题已经解决了,之前使用ID3DXEffect来执行的,结果不正确。改成直接使用VertexShader就正确了。应该是ID3DXEffect的问题。也可能是我使用的Dx9C的版本比较老(2005年7月的,都很久没更新了。:)
xiaolizi 2006-06-30
  • 打赏
  • 举报
回复
硬件是肯定支持vs2.0的。
To Analyst:SetStreamSource()肯定是设置的,其他的渲染状态也是设置的,要不SVP下就不会正确了,在HVP下显示的三角形位置和在初始化VB时候填充的数据一致。

我把fx的文件输出到vs指令,出来的asm指令显示里面并没有dcl_position,不知道硬件针对没有dcl_position的vs能否执行。。。

如下:

//
// Generated by Microsoft (R) D3DX9 Shader Compiler 9.07.239.0000
//
// fxc /T vs_2_0 /E vs_main /Fx ok.txt par_dmgnum.fx
//
//
// Parameters:
//
// float4 PP[4];
// float2 QUAD_TEXCOORD[4];
//
// struct
// {
// float2 pos;
// float4 color;
// float num_id;
//
// } _item[128];
//
//
// Registers:
//
// Name Reg Size
// ------------- ----- ----
// _item c0 384
// QUAD_TEXCOORD c384 4
// PP c388 4
//
//
// Default values:
//
// QUAD_TEXCOORD
// c384 = { 0, 0, 0, 0 };
// c385 = { 1, 0, 0, 0 };
// c386 = { 0, 1, 0, 0 };
// c387 = { 1, 1, 0, 0 };
//
// PP
// c388 = { 0, 0, 0, 1 };
// c389 = { 0.1, 0, 0, 1 };
// c390 = { 0, 0.1, 0, 1 };
// c391 = { 0.1, 0.1, 0, 1 };
//

vs_2_0
def c392, 255.001953, 765.005859, 0, 0
dcl_blendindices v0
mul r0.xy, v0.yzzw, c392
mova a0.xy, r0.yxzw
mov oPos, c388[a0.y]
mov oD0, c1[a0.x]
mov oT0.xy, c384[a0.y]

// approximately 5 instruction slots used
chenlee 2006-06-30
  • 打赏
  • 举报
回复
验证了一下,没有dcl_position的VS,硬件也可以正常执行.

Shader和你的很相似,只是简化了一些。

VS:
vs_2_0
def c4, 255.001953, 0, 0, 0
def c0, 0, 0, 0, 1
def c1, 0.5, 0, 0, 1
def c2, 0, 0.5, 0, 1
def c3, 0.5, 0.5, 0, 1
dcl_blendindices v0
mov r0.w, v0.x
mova a0.w, r0.w
mov r0.xyw, c0[a0.w]
mul oPos, r0.xyxw, c0.wwzw

PS:
ps_2_0
def c0, 1, 0, 0, 0
mov r0, c0.x
mov oC0, r0

VERTEX DECL:
D3DVERTEXELEMENT9 format[] =
{
{ 0, 0, D3DDECLTYPE_FLOAT1, 0, D3DDECLUSAGE_POSITION, 0 },
{ 0, 4, D3DDECLTYPE_FLOAT1, 0, D3DDECLUSAGE_BLENDINDICES, 0 },
D3DDECL_END()
};

VB:
const float vb[] = { 0, 0, 0, 1, 0, 2, 0, 3 };


DRAW:
dev->DrawPrimitiveUP( D3DPT_TRIANGLESTRIP, 2, vb, sizeof(float)*2 );
cywater2000 2006-06-29
  • 打赏
  • 举报
回复
同意楼上的
但也可能是硬件不支持hw
Analyst 2006-06-28
  • 打赏
  • 举报
回复
不是shader的问题,把你的渲染代码贴上来。有一个可能的原因是你没有用VertextBuffer来渲染。
Bobby136 2006-06-28
  • 打赏
  • 举报
回复

要写 PixelShader ,你的shader没有起作用

8,303

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧