游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4072|回复: 9

各位大虾:问个问题,D3DFVF_XYZRHW | D3DFVF_TEX1 的搭配画背景

[复制链接]

13

主题

101

帖子

101

积分

注册会员

Rank: 2

积分
101
发表于 2005-8-22 17:26:00 | 显示全部楼层 |阅读模式
我家里的机器上可以看见背景(ATI的显卡), 公司的就不行,公司的是Intel的集成显卡845g的。 除了家里的机器支持硬件顶点运算, 公司的不支持, 可是和这个有联系吗? 谢谢
typedef struct sbackground
{
        float x, y, z, rhw;
        float u, v;
}sBackGroundVertex;
sBackGroundVertex g_BkGdVertex[4] =
{
    {   0.0f,   0.0, 1.0, 1.0f, 0.0f, 0.0f },
    { 640.0f,   0.0, 1.0, 1.0f, 1.0f, 0.0f },
    {   0.0f, 480.0, 1.0, 1.0f, 0.0f, 1.0f },
    { 640.0f, 480.0, 1.0, 1.0f, 1.0f, 1.0f }

};

#define D3DFVF_BKGNDVERTEX (D3DFVF_XYZRHW | D3DFVF_TEX1)
if(NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
  return E_FAIL;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
DWORD desiredWidth = 640;
DWORD desiredHeight = 480;
RECT clientRect, wndRect;
GetClientRect(g_hwnd, &clientRect);
GetWindowRect(g_hwnd, &wndRect);
DWORD wndWidth = (wndRect.right-wndRect.left) - clientRect.right + desiredWidth;
DWORD wndHeight = (wndRect.bottom - wndRect.top) - clientRect.bottom + desiredHeight;
MoveWindow(g_hwnd, wndRect.left, wndRect.top, wndWidth, wndHeight, true);

D3DDISPLAYMODE d3ddm;
ZeroMemory(&d3ddm, sizeof(d3ddm));
g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm);

d3dpp.BackBufferWidth = desiredWidth;
d3dpp.BackBufferHeight = desiredHeight;
d3dpp.BackBufferFormat = d3ddm.Format;
d3dpp.Windowed = true;
d3dpp.EnableAutoDepthStencil = true;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;

if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pD3DDevice)))
    return E_FAIL;

if(FAILED(g_pD3DDevice->CreateVertexBuffer(sizeof(g_BkGdVertex), 0, D3DFVF_BKGNDVERTEX, D3DPOOL_DEFAULT, &g_pVB, NULL)))
                return E_FAIL;
VOID * pData;
if(FAILED(g_pVB->Lock(0, 0, &pData, 0)))
    return E_FAIL;
memcpy(pData, g_BkGdVertex, 4*sizeof(sBackGroundVertex));
g_pVB->Unlock();
if(FAILED(D3DXCreateTextureFromFile(g_pD3DDevice, "d:\\backdrop.bmp", &g_pTex)))
    return E_FAIL;

HRESULT hr;
hr = g_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_RGBA(0,0,64, 255), 1.0f, 0);
hr = g_pD3DDevice->BeginScene();
hr = g_pD3DDevice->SetFVF(D3DFVF_BKGNDVERTEX);
hr = g_pD3DDevice->SetStreamSource(0, g_pVB, 0, sizeof(sBackGroundVertex));
hr = g_pD3DDevice->SetTexture(0, g_pTex);

hr = g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
hr = g_pD3DDevice->EndScene();
hr = g_pD3DDevice-&gtresent(NULL,NULL,NULL,NULL);

85

主题

824

帖子

878

积分

高级会员

Rank: 4

积分
878
QQ
发表于 2005-8-22 17:54:00 | 显示全部楼层

Re:各位大虾:问个问题,D3DFVF_XYZRHW | D3DFVF_TEX1 的搭配画

一些老显卡(特别是板载显卡)不支持长宽不等的纹理,
必须显式指定纹理大小

13

主题

101

帖子

101

积分

注册会员

Rank: 2

积分
101
 楼主| 发表于 2005-8-22 18:05:00 | 显示全部楼层

Re:各位大虾:问个问题,D3DFVF_XYZRHW | D3DFVF_TEX1 的搭配画

谢谢你,不过我的纹理的bmp是256*256的,而且我将顶点数据改成了下面也是不行:
typedef struct sbackground
{
        float x, y, z, rhw;
        float u, v;
}sBackGroundVertex;
sBackGroundVertex g_BkGdVertex[4] =
{
        {   0.0f,   0.0, 1.0, 1.0f, 0.0f, 0.0f },
    { 480.0f,   0.0, 1.0, 1.0f, 1.0f, 0.0f },
    {   0.0f, 480.0, 1.0, 1.0f, 0.0f, 1.0f },
    { 480.0f, 480.0, 1.0, 1.0f, 1.0f, 1.0f }

};
#define D3DFVF_BKGNDVERTEX (D3DFVF_XYZRHW | D3DFVF_TEX1)

请问 显示指定纹理大小是不是我上面的修改顶点的数据?

85

主题

824

帖子

878

积分

高级会员

Rank: 4

积分
878
QQ
发表于 2005-8-22 19:20:00 | 显示全部楼层

Re:各位大虾:问个问题,D3DFVF_XYZRHW | D3DFVF_TEX1 的搭配画

尝试以下解决办法
1.D3DXCreateTextureFromFileEx(pD3DDevice, "d:\\backdrop.bmp",  D3DX_DEFAULT, D3DX_DEFAULT,D3DX_DEFAULT, 0, d3ddm.Format, D3DPOOL_MANAGED, D3DX_FILTER_NONE, D3DX_FILTER_NONE, 0, NULL, NULL, &g_pTex)
2.打开光照
3.更改后台缓存颜色格式

13

主题

101

帖子

101

积分

注册会员

Rank: 2

积分
101
 楼主| 发表于 2005-8-22 19:38:00 | 显示全部楼层

Re:各位大虾:问个问题,D3DFVF_XYZRHW | D3DFVF_TEX1 的搭配画

谢谢你,我今天晚上回去看看。

13

主题

101

帖子

101

积分

注册会员

Rank: 2

积分
101
 楼主| 发表于 2005-8-23 09:59:00 | 显示全部楼层

Re:各位大虾:问个问题,D3DFVF_XYZRHW | D3DFVF_TEX1 的搭配画

shenguhan: 刚才我试了你的方法,发现还是不行, 我发现问题在于:

DrawPrimitive(D3DPT_TRIANGLESTRIP)上面出了问题。
我办公室的电脑当DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 1);的时候是可以看见背景texture的, 也就是说是它不能情况4个顶点用来表示两个面的情况, 所以我估计是不是需要加上index buffer?

我还需要验证一下。同时这个问题我还认为可能D3DFVF_XYZRHW无关。其他的顶点格式如果DrawPrimitive(D3DPT_TRIANGLESTRIP)也应该会出现类似的问题, 也需要验证一下。

呵呵, 感觉像回到了学生时代, 哈哈。

13

主题

101

帖子

101

积分

注册会员

Rank: 2

积分
101
 楼主| 发表于 2005-8-23 11:45:00 | 显示全部楼层

Re:各位大虾:问个问题,D3DFVF_XYZRHW | D3DFVF_TEX1 的搭配画

经过验证: 我公司的破机器采用如下方式的index buffer 后依然不能显示背景。。。
郁闷阿。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
typedef struct sbackground
{
        float x, y, z, rhw;
        float u, v;
}sBackGroundVertex;
sBackGroundVertex g_BkGdVertex[] =
{
        {   0.0f,   0.0, 1.0, 1.0f, 0.0f, 0.0f },
        { 640.0f,   0.0, 1.0, 1.0f, 1.0f, 0.0f },
        {   0.0f, 480.0, 1.0, 1.0f, 0.0f, 1.0f },
    { 640.0f, 480.0, 1.0, 1.0f, 1.0f, 1.0f }
/*
        {   0.0f,        0.0,        1.0,        1.0f, 0.0f, 0.0f },
        {        640.0f,        0.0,        1.0,        1.0f, 1.0f, 0.0f },
        {        0.0f,        240.0f,        1.0f,        1.0f, 0.0f, 0.5f },*/
//        {        640.0f,        240.0f, 1.0f,        1.0f, 1.0f,        0.5f },
//        {   0.0f,        480.0,        1.0,        1.0f, 0.0f, 1.0f },
//        {        640.0f, 480.0,        1.0,        1.0f, 1.0f, 1.0f }
};

short BackGroundIndexs [] =
{
        0, 1, 2,
        2, 1, 3
};
#define D3DFVF_BKGNDVERTEX D3DFVF_XYZRHW | D3DFVF_TEX1

if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_WARE_VERTEXPROCESSING , &d3dpp, &g_pD3DDevice)))
                return E_FAIL;
if(FAILED(g_pD3DDevice->CreateVertexBuffer(sizeof(g_BkGdVertex), 0, D3DFVF_BKGNDVERTEX, D3DPOOL_DEFAULT, &g_pVB, NULL)))
                return E_FAIL;
VOID * pData;
if(FAILED(g_pVB->Lock(0, sizeof(g_BkGdVertex), &pData, 0)))
        return E_FAIL;
memcpy(pData, g_BkGdVertex, sizeof(g_BkGdVertex));
g_pVB->Unlock();

HRESULT hr;
hr = g_pD3DDevice->CreateIndexBuffer(sizeof(BackGroundIndexs), 0, D3DFMT_INDEX16, D3DPOOL_DEFAULT, &g_pIndexBuffer, NULL);
VOID * pIndexData =        NULL;
hr = g_pIndexBuffer->Lock(0, sizeof(BackGroundIndexs), &pIndexData, 0);
memcpy(pIndexData, BackGroundIndexs, sizeof(BackGroundIndexs));
hr = g_pIndexBuffer->Unlock();

hr = D3DXCreateTextureFromFileEx(g_pD3DDevice, "d:\\temp\\backdrop.bmp", D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, 0, d3ddm.Format, D3DPOOL_MANAGED, D3DX_FILTER_NONE, D3DX_FILTER_NONE, 0, NULL, NULL, &g_pTex);

HRESULT hr;
hr = g_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_RGBA(0,0,64, 255), 1.0f, 0);
hr = g_pD3DDevice->BeginScene();
hr = g_pD3DDevice->SetStreamSource(0, g_pVB, 0, sizeof(sBackGroundVertex));
hr = g_pD3DDevice->SetTexture(0, g_pTex);
hr = g_pD3DDevice->SetFVF(D3DFVF_BKGNDVERTEX);
hr = g_pD3DDevice->SetIndices(g_pIndexBuffer);
hr = g_pD3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLESTRIP, 0, 0, 4, 0, 2);

18

主题

573

帖子

573

积分

高级会员

Rank: 4

积分
573
发表于 2005-8-24 01:06:00 | 显示全部楼层

Re:各位大虾:问个问题,D3DFVF_XYZRHW | D3DFVF_TEX1 的搭配画

你还是更新显卡的驱动先吧!我记得intel的驱动已经有更新了!

13

主题

101

帖子

101

积分

注册会员

Rank: 2

积分
101
 楼主| 发表于 2005-8-24 10:15:00 | 显示全部楼层

Re:各位大虾:问个问题,D3DFVF_XYZRHW | D3DFVF_TEX1 的搭配画

好的, 谢谢william9527同学

13

主题

101

帖子

101

积分

注册会员

Rank: 2

积分
101
 楼主| 发表于 2005-8-25 12:37:00 | 显示全部楼层

Re:各位大虾:问个问题,D3DFVF_XYZRHW | D3DFVF_TEX1 的搭配画

我已经发现问题的原因了:
  经过几天的奋战, 发现原来是zbuffer搞的鬼!!!
  结论:
       条件:     1.在软件顶点处理模式下
                     2.zbuffer处于enable状态
                     3.顶点格式采用了d3dfvf_xyzrhw
                     4.如果你的顶点的z值等于1.0f
                     4.clear的时候初始化zbuffer为1.0f或小于1.0f
       后果:     那么这些顶点会被clear的颜色挡住。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-27 13:36

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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