游戏开发论坛

 找回密码
 立即注册
搜索
12
返回列表 发新帖
楼主: flyue

不用ID3DXSprite以及D3DFVF_XYZRHW, 如何做游戏UI?

[复制链接]

14

主题

59

帖子

59

积分

注册会员

Rank: 2

积分
59
发表于 2009-5-9 18:07:00 | 显示全部楼层

Re:不用ID3DXSprite以及D3DFVF_XYZRHW, 如何做游戏UI?

至于如何用shader做ui?
其实只要明白dx中都是把顶点映射到x(-1,1),y(-1,1),z(0,1)裁减空间中,
在顶点缓存中预计算把屏幕空间坐标映射到上述裁减空间中,然后在vs shader中直接把坐标传递给ps shader。我就是这么做得。
用这种方式有很大的好处,可以加些乱七八糟的效果上去,比如用法线贴图做ui加光照效果。
当然有个不好的地方是,如果我让这种ui旋转,那么看上去就会变形,我还在考虑如何解决这个问题。

59

主题

404

帖子

404

积分

中级会员

Rank: 3Rank: 3

积分
404
 楼主| 发表于 2009-5-9 18:12:00 | 显示全部楼层

Re:不用ID3DXSprite以及D3DFVF_XYZRHW, 如何做游戏UI?

哦,你这么一说我大概知道了...

不过没有个实例还是不太好理解.

能不能发一个用shader做UI的教程的链接?

说实话, "用shader做ui" 这个关键字搜索, 什么都搜不到..

14

主题

59

帖子

59

积分

注册会员

Rank: 2

积分
59
发表于 2009-5-9 18:15:00 | 显示全部楼层

Re:不用ID3DXSprite以及D3DFVF_XYZRHW, 如何做游戏UI?

// ui shader : no texture
uniform extern float4x4 g_matTrans;
uniform extern float4 g_mtrDif;

struct VS_OUTPUT0
{
  float4 m_v4Pos : POSITION0;
  float4 m_v4Color : COLOR0;
};

VS_OUTPUT0 vs_main0( float3 _v3Pos : POSITION0 )
{
   VS_OUTPUT0 _vsOut;
   _vsOut.m_v4Pos = float4(_v3Pos.xyz, 1.0f);
   _vsOut.m_v4Color = g_mtrDif;
   return _vsOut;
}

float4 ps_main0(float4 _v4Color : COLOR0) : COLOR0
{
        return _v4Color;
}

59

主题

984

帖子

1200

积分

金牌会员

Rank: 6Rank: 6

积分
1200
发表于 2009-5-9 23:14:00 | 显示全部楼层

Re:不用ID3DXSprite以及D3DFVF_XYZRHW, 如何做游戏UI?

你可以用reflector看看xna中的spriteBatch类的实现,这里是相关的shader:
//-----------------------------------------------------------------------------
// SpriteBatch.fx
//
// Microsoft XNA Community Game Platform
// Copyright (C) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------

// Input parameters.
float2   ViewportSize    : register(c0);
float2   TextureSize     : register(c1);
float4x4 MatrixTransform : register(c2);
sampler  TextureSampler  : register(s0);

// Vertex shader for rendering sprites on Windows.
void SpriteVertexShader(inout float4 position : POSITION0,
                                                  inout float4 color    : COLOR0,
                                                inout float2 texCoord : TEXCOORD0)
{
    // Apply the matrix transform.
    position = mul(position, transpose(MatrixTransform));
   
        // Half pixel offset for correct texel centering.
        position.xy -= 0.5;

        // Viewport adjustment.
        position.xy /= ViewportSize;
        position.xy *= float2(2, -2);
        position.xy -= float2(1, -1);

        // Compute the texture coordinate.
        texCoord /= TextureSize;
}

// Pixel shader for rendering sprites (shared between Windows and Xbox).
void SpritePixelShader(inout float4 color : COLOR0, float2 texCoord : TEXCOORD0)
{
    color *= tex2D(TextureSampler, texCoord);
}

technique SpriteBatch
{
        pass
        {
                VertexShader = compile vs_1_1 SpriteVertexShader();
                PixelShader  = compile ps_1_1 SpritePixelShader();
        }
}

59

主题

984

帖子

1200

积分

金牌会员

Rank: 6Rank: 6

积分
1200
发表于 2009-5-9 23:19:00 | 显示全部楼层

Re: Re:不用ID3DXSprite以及D3DFVF_XYZRHW, 如何做游戏UI?

无名剑: Re:不用ID3DXSprite以及D3DFVF_XYZRHW, 如何做游戏UI?

一些显卡会一些不会,我见过的X300显卡都会把雾弄没
所以不通用


那是因为有些程序用了ff的雾,有些没有
ID3DXSprite渲染之后,如果不更改state,ff的雾就会被影响

0

主题

769

帖子

1052

积分

金牌会员

Rank: 6Rank: 6

积分
1052
发表于 2009-5-9 23:23:00 | 显示全部楼层

Re: Re: Re:不用ID3DXSprite以及D3DFVF_XYZRHW, 如何做游戏UI?

clayman: Re: Re:不用ID3DXSprite以及D3DFVF_XYZRHW, 如何做游戏UI?



那是因为有些程序用了ff的雾,有些没有
ID3DXSprite渲染之后,如果不更改state,ff的雾就会被影响


我用了stateblock将渲染Sprite之前的渲染状态恢复了都无效...
FF的雾比较特别?[em24]

59

主题

404

帖子

404

积分

中级会员

Rank: 3Rank: 3

积分
404
 楼主| 发表于 2009-5-10 09:58:00 | 显示全部楼层

Re:不用ID3DXSprite以及D3DFVF_XYZRHW, 如何做游戏UI?

非常感谢 TARGET_MG42 和 clayman !

其实我都是用Direct3D来做2D的, 毕竟做3D, 一个人的力量远远不够. 所以我决定先从2D做起.

1

主题

51

帖子

72

积分

注册会员

Rank: 2

积分
72
发表于 2009-6-11 20:59:00 | 显示全部楼层

Re: 不用ID3DXSprite以及D3DFVF_XYZRHW, 如何做游戏UI?

WorldMatrix = ViewMatrix = IdentityMatrix;
ProjectMatrix =
Matrix(2/ViewX,0,0,0,
0,-2/ViewY,0,0,
0,0,1,0,
-1,1,0,1);

D3DFVF_XYZ:设置成屏幕坐标就可.

1

主题

51

帖子

72

积分

注册会员

Rank: 2

积分
72
发表于 2009-6-11 21:00:00 | 显示全部楼层

Re:不用ID3DXSprite以及D3DFVF_XYZRHW, 如何做游戏UI?

如果要考虑像素中心对齐的问题,
ProjectMatrix =
Matrix(1,0,0,0,
0,1,0,0,
0,0,1,0,
0.5,0.5,0,1)
*
Matrix(2/ViewX,0,0,0,
0,-2/ViewY,0,0,
0,0,1,0,
-1,1,0,1);
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-20 01:01

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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