游戏开发论坛

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

各位大哥快来帮帮我,我被这个问题整惨了

[复制链接]

52

主题

103

帖子

103

积分

注册会员

Rank: 2

积分
103
发表于 2009-10-11 20:28:00 | 显示全部楼层 |阅读模式
先上代码

void render(void)
{
        D3DXMATRIX world,view,proj;
        D3DXVECTOR3 pos,at,up;
        static int r=0;
        if(++r>360)
                r=0;
       
        pd3dDevice->GetRenderTarget(0,&pOld);

        pTex->GetSurfaceLevel(0,&pNew);
        pd3dDevice->SetRenderTarget(0,pNew);

        pd3dDevice->SetRenderState(D3DRS_ZENABLE,FALSE);

        pd3dDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);

        pd3dDevice->Clear( 0, NULL,0,0x44555566, 1.0f, 0 );

        pd3dDevice->BeginScene();
       
        pd3dDevice->SetTransform(D3DTS_WORLD,&world);
        pos=D3DXVECTOR3(0,2,-1.5);
        at=D3DXVECTOR3(0,0,0);
        up=D3DXVECTOR3(0,1,0);
        D3DXMatrixLookAtLH(&view,&pos,&at,&up);
        pd3dDevice->SetTransform(D3DTS_VIEW,&view);
        D3DXMatrixPerspectiveFovLH(&proj,D3DX_PI*0.5f,(float)640/(float)480,1,1000);
        pd3dDevice->SetTransform(D3DTS_PROJECTION,&proj);
        pMesh->DrawSubset(0);

        pd3dDevice->EndScene();

        pd3dDevice->SetRenderTarget(0,pOld);
        pd3dDevice->SetRenderState(D3DRS_ZENABLE,TRUE);

        pNew->Release();
        D3DXMatrixIdentity(&world);
        D3DXMatrixIdentity(&view);
        D3DXMatrixIdentity(&proj);
        pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, 0x11223344, 1.0f, 0 );

        pd3dDevice->BeginScene();

        pd3dDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID);
        D3DXMatrixIdentity(&world);
        pd3dDevice->SetTransform(D3DTS_WORLD,&world);
        pos=D3DXVECTOR3(0,0,-5);
        at=D3DXVECTOR3(0,0,0);
        up=D3DXVECTOR3(0,1,0);
        D3DXMatrixLookAtLH(&view,&pos,&at,&up);
        pd3dDevice->SetTransform(D3DTS_VIEW,&view);
        D3DXMatrixOrthoLH(&proj,20,20,1,1000);
        pd3dDevice->SetTransform(D3DTS_PROJECTION,&proj);

        pd3dDevice->SetStreamSource(0,pVB,0,sizeof(CUSVERTEX));
        pd3dDevice->SetFVF(FVF);
        pd3dDevice->SetTexture(0,pTex);
        pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);


        D3DXMatrixRotationY(&world,D3DXToRadian(r));
        pd3dDevice->SetTransform(D3DTS_WORLD,&world);
        pos=D3DXVECTOR3(0,1,-3);
        at=D3DXVECTOR3(0,0,0);
        up=D3DXVECTOR3(0,1,0);
        D3DXMatrixLookAtLH(&view,&pos,&at,&up);
        pd3dDevice->SetTransform(D3DTS_VIEW,&view);
        D3DXMatrixPerspectiveFovLH(&proj,D3DX_PI*0.5f,(float)640/(float)480,1,1000);
        pd3dDevice->SetTransform(D3DTS_PROJECTION,&proj);
         
        pMesh->DrawSubset(0);

        pd3dDevice->EndScene();

        pd3dDevice-&gtresent( NULL, NULL, NULL, NULL );

//        pTex->Release();

}

DX9的一个渲染函数,pTex是设成的RENDERTARGET,想在这个纹理上用一个俯视摄像机显示茶壶的线框图像,后背缓冲显示正面SOLID图像,但是不知道怎么的,线框图像只有在第一帧出现,其余时候PTEX纹理都是显示填充色,请问该怎么弄啊\谢谢了

52

主题

103

帖子

103

积分

注册会员

Rank: 2

积分
103
 楼主| 发表于 2009-10-11 20:32:00 | 显示全部楼层

Re: 各位大哥快来帮帮我,我被这个问题整惨了

算了,还是把全部代码都发上来,谢谢了。另外PTEX1我加载的另外一张纹理,如果在把渲染时把PTEX改成PTEX1就一切正常(但程序的意义也失去了)。请问到底怎么回事啊??
#include <windows.h>
#include <mmsystem.h>
#include <d3d9.h>
#include <d3dx9.h>

#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
#pragma comment(lib,"winmm.lib")

bool    initWindow(HINSTANCE hInstance);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
bool initDirect3D(HWND hwnd);
void render(void);

int screen_height = 480;                       
int screen_width = 640;       

LPDIRECT3D9             pD3D;
LPDIRECT3DDEVICE9       pd3dDevice;       
LPDIRECT3DTEXTURE9      pTex;
LPDIRECT3DTEXTURE9      pTex1;
LPDIRECT3DVERTEXBUFFER9 pVB;
LPD3DXMESH              pMesh;
LPDIRECT3DSURFACE9      pOld,pNew;

HINSTANCE hInst;                               
HWND wndHandle;       

struct CUSVERTEX
{
        float x,y,z;
        float u,v;
        CUSVERTEX()
        {
                x=0;y=0;z=0;
                u=0;v=0;
        }
        CUSVERTEX(float _x,float _y,float _z,float _u,float _v)
        {
                x=_x;y=_y;z=_z;
                u=_u;v=_v;
        }
};

#define FVF D3DFVF_XYZ|D3DFVF_TEX1               
/////////////////////////////////////////////////

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
       
        if (!initWindow(hInstance))
        {
                MessageBox(NULL, "Unable to create window", "ERROR", MB_OK);
                return false;
        }

       
        if (!initDirect3D(wndHandle))
        {
                MessageBox(NULL, "Unable to init Direct3D", "ERROR", MB_OK);
                return false;
        }

       
    MSG msg;
    ZeroMemory( &msg, sizeof(msg) );
    while( msg.message!=WM_QUIT )
    {
               
                if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
        {
                        TranslateMessage( &msg );
            DispatchMessage( &msg );
        }
               
                else
                {
                        if( NULL == pd3dDevice )
                        break;

                        render();
            
                }
    }

       
        if( pd3dDevice != NULL)
        {
        pd3dDevice->Release();
                pd3dDevice = NULL;
        }
    if( pD3D != NULL)
        {
        pD3D->Release();
                pD3D = NULL;
        }

        return (int) msg.wParam;
}

bool initWindow(HINSTANCE hInstance)
{
        WNDCLASSEX wcex;

        wcex.cbSize = sizeof(WNDCLASSEX);
        wcex.style                        = CS_HREDRAW | CS_VREDRAW;
        wcex.lpfnWndProc        = (WNDPROC)WndProc;
        wcex.cbClsExtra                = 0;
        wcex.cbWndExtra                = 0;
        wcex.hInstance                = hInstance;
        wcex.hIcon                        = 0;
        wcex.hCursor                = LoadCursor(NULL, IDC_ARROW);
        wcex.hbrBackground        = (HBRUSH)(COLOR_WINDOW+1);
        wcex.lpszMenuName        = NULL;
        wcex.lpszClassName        = "DirectXExample";
        wcex.hIconSm                = 0;
        RegisterClassEx(&wcex);

        wndHandle = CreateWindow("DirectXExample",
                                                         "DirectXExample",
                                                         WS_OVERLAPPEDWINDOW,
                                                         CW_USEDEFAULT,
                                                         CW_USEDEFAULT,
                                                         640,
                                                         480,
                                                         NULL,
                                                         NULL,
                                                         hInstance,
                                                         NULL);
   if (!wndHandle)
      return false;
   
   ShowWindow(wndHandle, SW_SHOW);
   UpdateWindow(wndHandle);

   return true;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        switch (message)
        {
                case WM_DESTROY:
                        PostQuitMessage(0);
                        break;
        }
        return DefWindowProc(hWnd, message, wParam, lParam);
}


bool initDirect3D(HWND hwnd)
{
        if( NULL == ( pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
        {
                return false;
        }

        D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory( &d3dpp, sizeof(d3dpp) );
    d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
        d3dpp.BackBufferCount  = 1;
        d3dpp.BackBufferHeight = screen_height;
        d3dpp.BackBufferWidth  = screen_width;
        d3dpp.hDeviceWindow    = hwnd;
        d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
    d3dpp.EnableAutoDepthStencil = TRUE;

    if( FAILED( pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd,
                                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                      &d3dpp, &pd3dDevice ) ) )
    {
        return false;
    }

       
        pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );
        pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE );

        D3DXCreateTeapot(pd3dDevice,&pMesh,NULL);

        pd3dDevice->CreateVertexBuffer(4*sizeof(CUSVERTEX),D3DUSAGE_WRITEONLY,FVF,D3DPOOL_MANAGED,&pVB,NULL);
        CUSVERTEX *p;
        pVB->Lock(NULL,NULL,(void**)&p,NULL);
        p[0]=CUSVERTEX( -10.0f, 10.0f,0.0f,0.0f,0.0f);
        p[1]=CUSVERTEX( -5.0f, 10.0f,0.0f,1.0f,0.0f);
        p[2]=CUSVERTEX( -10.0f, 5.0f,0.0f,0.0f,1.0f);
        p[3]=CUSVERTEX( -5.0f, 5.0f,0.0f,1.0f,1.0f);
        pVB->Unlock();

        D3DXCreateTexture(pd3dDevice,128,128,0,D3DUSAGE_RENDERTARGET,D3DFMT_A8R8G8B8,D3DPOOL_DEFAULT,&pTex);
        D3DXCreateTextureFromFile(pd3dDevice,"e:\\erik1a.bmp",&pTex1);

        pd3dDevice->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR);
        pd3dDevice->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_LINEAR);
        pd3dDevice->SetSamplerState(0,D3DSAMP_MIPFILTER,D3DTEXF_POINT);

          
        return true;
}

void render(void)
{
        D3DXMATRIX world,view,proj;
        D3DXVECTOR3 pos,at,up;
        static int r=0;
        if(++r>360)
                r=0;
       
        pd3dDevice->GetRenderTarget(0,&pOld);

        pTex->GetSurfaceLevel(0,&pNew);
        pd3dDevice->SetRenderTarget(0,pNew);

        pd3dDevice->SetRenderState(D3DRS_ZENABLE,FALSE);

        pd3dDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);

        pd3dDevice->Clear( 0, NULL,0,0x44555566, 1.0f, 0 );

        pd3dDevice->BeginScene();
       
        pd3dDevice->SetTransform(D3DTS_WORLD,&world);
        pos=D3DXVECTOR3(0,2,-1.5);
        at=D3DXVECTOR3(0,0,0);
        up=D3DXVECTOR3(0,1,0);
        D3DXMatrixLookAtLH(&view,&pos,&at,&up);
        pd3dDevice->SetTransform(D3DTS_VIEW,&view);
        D3DXMatrixPerspectiveFovLH(&proj,D3DX_PI*0.5f,(float)640/(float)480,1,1000);
        pd3dDevice->SetTransform(D3DTS_PROJECTION,&proj);
        pMesh->DrawSubset(0);

        pd3dDevice->EndScene();

        pd3dDevice->SetRenderTarget(0,pOld);
        pd3dDevice->SetRenderState(D3DRS_ZENABLE,TRUE);

        pNew->Release();
        D3DXMatrixIdentity(&world);
        D3DXMatrixIdentity(&view);
        D3DXMatrixIdentity(&proj);
        pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, 0x11223344, 1.0f, 0 );

        pd3dDevice->BeginScene();

        pd3dDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID);
        D3DXMatrixIdentity(&world);
        pd3dDevice->SetTransform(D3DTS_WORLD,&world);
        pos=D3DXVECTOR3(0,0,-5);
        at=D3DXVECTOR3(0,0,0);
        up=D3DXVECTOR3(0,1,0);
        D3DXMatrixLookAtLH(&view,&pos,&at,&up);
        pd3dDevice->SetTransform(D3DTS_VIEW,&view);
        D3DXMatrixOrthoLH(&proj,20,20,1,1000);
        pd3dDevice->SetTransform(D3DTS_PROJECTION,&proj);

        pd3dDevice->SetStreamSource(0,pVB,0,sizeof(CUSVERTEX));
        pd3dDevice->SetFVF(FVF);
        pd3dDevice->SetTexture(0,pTex);
        pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);


        D3DXMatrixRotationY(&world,D3DXToRadian(r));
        pd3dDevice->SetTransform(D3DTS_WORLD,&world);
        pos=D3DXVECTOR3(0,1,-3);
        at=D3DXVECTOR3(0,0,0);
        up=D3DXVECTOR3(0,1,0);
        D3DXMatrixLookAtLH(&view,&pos,&at,&up);
        pd3dDevice->SetTransform(D3DTS_VIEW,&view);
        D3DXMatrixPerspectiveFovLH(&proj,D3DX_PI*0.5f,(float)640/(float)480,1,1000);
        pd3dDevice->SetTransform(D3DTS_PROJECTION,&proj);
         
        pMesh->DrawSubset(0);

        pd3dDevice->EndScene();

        pd3dDevice-&gtresent( NULL, NULL, NULL, NULL );

//        pTex->Release();

}

52

主题

103

帖子

103

积分

注册会员

Rank: 2

积分
103
 楼主| 发表于 2009-10-12 08:38:00 | 显示全部楼层

Re:各位大哥快来帮帮我,我被这个问题整惨了

大牛帮帮忙,我觉得大体思路应该是对的,可能有些细节处理错误导致图像不能正常显示,谢谢各位了帮忙看下!!

52

主题

103

帖子

103

积分

注册会员

Rank: 2

积分
103
 楼主| 发表于 2009-10-14 18:27:00 | 显示全部楼层

Re: 各位大哥快来帮帮我,我被这个问题整惨了

经过研究,我基本上可以确信是深度缓冲区哪个地方没有设置正确。拜托各位说说使用RENDERTARGET时要注意哪些东西啊,上点代码吧!!

42

主题

140

帖子

158

积分

注册会员

Rank: 2

积分
158
发表于 2009-10-14 19:18:00 | 显示全部楼层

Re:各位大哥快来帮帮我,我被这个问题整惨了

不知你的pNew是咋创建的,如果你的pNew 大小是640x480,又用的原来的深度缓冲,那就错了

52

主题

103

帖子

103

积分

注册会员

Rank: 2

积分
103
 楼主| 发表于 2009-10-15 16:16:00 | 显示全部楼层

Re:各位大哥快来帮帮我,我被这个问题整惨了

pNew在这里啊

pTex->GetSurfaceLevel(0,&pNew);
pd3dDevice->SetRenderTarget(0,pNew);

就是建立的一个新表面,然后使用RENDERTARGET的纹理和他关联啊?不对吗?还请详细点,谢谢。

2

主题

25

帖子

27

积分

注册会员

Rank: 2

积分
27
发表于 2009-10-15 21:42:00 | 显示全部楼层

Re:各位大哥快来帮帮我,我被这个问题整惨了

RENDERTARGET的深度一定要比STENCILRENDER的深度浅,否则就会被表层覆盖...是不是这个原因啊/?..

5

主题

53

帖子

109

积分

注册会员

Rank: 2

积分
109
发表于 2009-10-16 14:08:00 | 显示全部楼层

Re:各位大哥快来帮帮我,我被这个问题整惨了

正在学,还没到这个层次...
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-8-6 23:02

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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