游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1991|回复: 4

vs怪现象。

[复制链接]

46

主题

238

帖子

238

积分

中级会员

Rank: 3Rank: 3

积分
238
发表于 2004-4-8 16:33:00 | 显示全部楼层 |阅读模式
vs怪现象,参考dolphinvs,怎么会这样。 [em2]
sf_200448163353.jpg

46

主题

238

帖子

238

积分

中级会员

Rank: 3Rank: 3

积分
238
 楼主| 发表于 2004-4-8 17:13:00 | 显示全部楼层

Re:vs怪现象。

为什么应该被挡住的三角形会覆盖在应该显示的三角形上呢。
高手进来看一下嘛

46

主题

238

帖子

238

积分

中级会员

Rank: 3Rank: 3

积分
238
 楼主| 发表于 2004-4-8 17:15:00 | 显示全部楼层

Re:vs怪现象。

是不是该在vs 代码里把法向量取反,或者是SetRenderState设置一下

69

主题

335

帖子

343

积分

中级会员

Rank: 3Rank: 3

积分
343
QQ
发表于 2004-4-8 17:40:00 | 显示全部楼层

Re:vs怪现象。

哈哈,脑袋都反了

46

主题

238

帖子

238

积分

中级会员

Rank: 3Rank: 3

积分
238
 楼主| 发表于 2004-4-8 23:01:00 | 显示全部楼层

Re:vs怪现象。


#include <d3d9.h>
#include <d3dx9.h>
#include "D3DFile.h"
#include "DXUtil.h"
#include "D3DUtil.h"
struct D3DVERTEX
{
    D3DXVECTOR3 p;
    D3DXVECTOR3 n;
    FLOAT       tu, tv;

    static const DWORD FVF;
};
const DWORD D3DVERTEX::FVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1;
LPDIRECT3D9             g_pD3D       = NULL;
LPDIRECT3DDEVICE9       g_pd3dDevice = NULL;
LPDIRECT3DVERTEXBUFFER9 g_pVB        = NULL;
LPDIRECT3DVERTEXDECLARATION9 m_pVertexDeclaration;
HRESULT             hr;
LPD3DXBUFFER        pCode;
LPD3DXBUFFER        pErrorMsgs;
LPDIRECT3DVERTEXSHADER9 m_pVertexShader;

LPDIRECT3DVERTEXBUFFER9 g_pVB0        = NULL;
LPDIRECT3DVERTEXDECLARATION9 m_pVertexDeclaration0;
LPD3DXBUFFER        pCode0;
LPDIRECT3DVERTEXSHADER9 m_pVertexShader0;
LPDIRECT3DTEXTURE9      m_pTexture0;


        LPD3DXMESH m_pMesh;                                       
        D3DMATERIAL9 *m_pMeshMaterials;               
        LPDIRECT3DTEXTURE9 *m_pMeshTextures;
        DWORD m_dwNumSubsets;                               
       
            LPDIRECT3DTEXTURE9      m_pDolphinTexture;
    LPDIRECT3DVERTEXBUFFER9 m_pDolphinVB1;
   LPDIRECT3DVERTEXBUFFER9 m_pDolphinVB2;
    LPDIRECT3DVERTEXBUFFER9 m_pDolphinVB3;
    LPDIRECT3DINDEXBUFFER9  m_pDolphinIB;
    DWORD                   m_dwNumDolphinVertices;
    DWORD                   m_dwNumDolphinFaces;
    LPDIRECT3DVERTEXDECLARATION9        m_pDolphinVertexDeclaration;
    LPDIRECT3DVERTEXSHADER9      m_pDolphinVertexShader;
    LPDIRECT3DVERTEXSHADER9      m_pDolphinVertexShader2;



            TCHAR strPath[MAX_PATH];
   
    LPDIRECT3DVERTEXBUFFER9 pMeshSourceVB;
    LPDIRECT3DINDEXBUFFER9  pMeshSourceIB;
    D3DVERTEX*              pSrc;
    D3DVERTEX*              pDst;
    CD3DMesh                DolphinMesh01;
         CD3DMesh                DolphinMesh02;
    CD3DMesh                DolphinMesh03;


HRESULT InitD3D( HWND hWnd )
{    if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
return E_FAIL;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof(d3dpp) );
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
   D3DCREATE_SOFTWARE_VERTEXPROCESSING,
   &d3dpp, &g_pd3dDevice ) ) )
{
return E_FAIL;
}
//g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
return S_OK;
}
VOID Cleanup()
{
       
if( g_pVB != NULL )        
g_pVB->Release();
if( g_pd3dDevice != NULL )
g_pd3dDevice->Release();
if( g_pD3D != NULL )      
g_pD3D->Release();
}
VOID Cleanup0()
{
                        //释放Mesh对象
if( g_pVB != NULL )        
g_pVB->Release();
if( g_pd3dDevice != NULL )
g_pd3dDevice->Release();
if( g_pD3D != NULL )      
g_pD3D->Release();
}

VOID SetMatrix()
{         UINT  iTime  = timeGetTime() % 30000;
    FLOAT fAngle = iTime * (2.0f * D3DX_PI) / 30000.0f;
   D3DXMATRIX mat, matView, matProj,matWorld,matRotate;

  D3DXMatrixRotationY( &matRotate, fAngle );

D3DXMatrixScaling( &matWorld, 0.05f, 0.05f, 0.05f );
       
        D3DXMatrixMultiply( &matWorld, &matWorld, &matRotate );


g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
      D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );
    g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
D3DXMatrixLookAtLH( &matView, &D3DXVECTOR3( 0.0f, -40.0f,20.0f ), //from
                                  &D3DXVECTOR3( 0.0f, 0.0f, 0.0f ), //at
                                  &D3DXVECTOR3( 0.0f, 1.0f, 0.0f ));//up
    g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );
D3DXMatrixMultiply( &mat, &matWorld, &matView );
D3DXMatrixMultiply( &mat, &mat, &matProj );
D3DXMatrixTranspose( &mat ,&mat );
//D3DXMatrixIdentity(&mat);
g_pd3dDevice->SetVertexShaderConstantF( 0 , (float*)&mat , 4 );


}


HRESULT LoadVSH0()
{float color[4] = {0,1.0,0,0};                                   //RGBA
g_pd3dDevice->SetVertexShaderConstantF( 4, (float*)&color, 1 );
        float lightDir[4] = {-1,1,1,0};
g_pd3dDevice->SetVertexShaderConstantF( 12, (float*)&lightDir, 1 );
const char strVertexShader0[] =
"vs_1_1               // 版本指令\n"\
"dcl_position  v0      // 声明位置寄存器\n"\
"dcl_normal    v4                // v0 is position, v4 is normal\n"\
"dcl_texcoord0 v8      // 声明纹理坐标寄存器\n"\

"m4x4 oPos, v0, c0    // 用视/投影矩阵变换顶点\n"\

"mov oT0, v8  // 把漫反射色赋\n";
if( FAILED(D3DXAssembleShader( strVertexShader0,sizeof(strVertexShader0)-1, NULL, NULL, 0, &pCode0, NULL )))
return E_FAIL;
if( FAILED(g_pd3dDevice->CreateVertexShader( (DWORD*)pCode0->GetBufferPointer(),
&m_pVertexShader0 )))
return E_FAIL;
pCode0->Release();
return S_OK;
}

HRESULT InitVB1()
{   

  D3DXCreateTextureFromFile( g_pd3dDevice, "Tiny_skin.bmp", &m_pDolphinTexture ) ;

   
    // Load the file-based mesh objects
    DolphinMesh01.Create( g_pd3dDevice, _T("Tiny.x") ) ;
   
      
        // Set the FVF type to match the vertex format we want
    DolphinMesh01.SetFVF( g_pd3dDevice, D3DVERTEX::FVF );

     // Get the number of vertices and faces for the meshes
    m_dwNumDolphinVertices  = DolphinMesh01.GetSysMemMesh()->GetNumVertices();
    m_dwNumDolphinFaces     = DolphinMesh01.GetSysMemMesh()->GetNumFaces();
         g_pd3dDevice->CreateVertexBuffer( m_dwNumDolphinVertices * sizeof(D3DVERTEX),
                                      D3DUSAGE_WRITEONLY, 0, D3DPOOL_MANAGED,
                                      &m_pDolphinVB1, NULL );

    g_pd3dDevice->CreateIndexBuffer( m_dwNumDolphinFaces * 3 * sizeof(WORD),
                                      D3DUSAGE_WRITEONLY,
                                      D3DFMT_INDEX16, D3DPOOL_MANAGED,
                                      &m_pDolphinIB, NULL );

      // Copy vertices for mesh 01
    DolphinMesh01.GetSysMemMesh()->GetVertexBuffer( &pMeshSourceVB );
    m_pDolphinVB1->Lock( 0, 0, (void**)&pDst, 0 );
    pMeshSourceVB->Lock( 0, 0, (void**)&pSrc, 0 );
    memcpy( pDst, pSrc, m_dwNumDolphinVertices * sizeof(D3DVERTEX) );
    m_pDolphinVB1->Unlock();
    pMeshSourceVB->Unlock();
    pMeshSourceVB->Release();

        // Copy indices for the dolphin mesh
    DolphinMesh01.GetSysMemMesh()->GetIndexBuffer( &pMeshSourceIB );
    m_pDolphinIB->Lock( 0, 0, (void**)&pDst, 0 );
    pMeshSourceIB->Lock( 0, 0, (void**)&pSrc, 0 );
    memcpy( pDst, pSrc, 3 * m_dwNumDolphinFaces * sizeof(WORD) );
    m_pDolphinIB->Unlock();
    pMeshSourceIB->Unlock();
    pMeshSourceIB->Release();
    // Create vertex shader for the dolphin
    D3DVERTEXELEMENT9 declDolphin[] =
    {
        // First stream is first mesh
        { 0,  0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT,  D3DDECLUSAGE_POSITION, 0},
        { 0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT,  D3DDECLUSAGE_NORMAL,   0},
        { 0, 24, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT,  D3DDECLUSAGE_TEXCOORD, 0},

    D3DDECL_END()
    };
     g_pd3dDevice->CreateVertexDeclaration( declDolphin, &m_pDolphinVertexDeclaration );
     DXUtil_FindMediaFileCb( strPath, sizeof(strPath), TEXT("DolphinTween.vsh") );        
     D3DXAssembleShaderFromFile( strPath, NULL, NULL, 0, &pCode, NULL )     ;
    g_pd3dDevice->CreateVertexShader( (DWORD*)pCode->GetBufferPointer(),
                                                       &m_pDolphinVertexShader );
    /**/

  LoadVSH0();
   
        return S_OK;
}
VOID Render1()
{
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );

if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
{
        SetMatrix();
//                g_pd3dDevice->SetRenderState(D3DRS_ZFUNC,D3DCMP_LESSEQUAL);
//  g_pd3dDevice->SetRenderState( D3DRS_ZENABLE,        TRUE );
// Render the dolphin
          g_pd3dDevice->SetTexture( 0, m_pDolphinTexture );
        g_pd3dDevice->SetVertexDeclaration( m_pDolphinVertexDeclaration );
        g_pd3dDevice->SetVertexShader( m_pVertexShader0 );
        g_pd3dDevice->SetStreamSource( 0, m_pDolphinVB1, 0, sizeof(D3DVERTEX) );
               g_pd3dDevice->SetIndices( m_pDolphinIB );
        g_pd3dDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0,
                                            0, m_dwNumDolphinVertices,
                                            0, m_dwNumDolphinFaces );
                        g_pd3dDevice->SetTexture( 0,NULL );                                                       
g_pd3dDevice->EndScene();
}
g_pd3dDevice-&gtresent( NULL, NULL, NULL, NULL );
}

LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
switch( msg )
{
case WM_DESTROY:
Cleanup();
PostQuitMessage( 0 );
return 0;
}

return DefWindowProc( hWnd, msg, wParam, lParam );
}



INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
"Robin", NULL };
RegisterClassEx( &wc );
HWND hWnd = CreateWindow( "Robin", "Robin",
WS_OVERLAPPEDWINDOW, 100, 50, 900, 650,
GetDesktopWindow(), NULL, wc.hInstance, NULL );
if( SUCCEEDED( InitD3D( hWnd ) ) )
{
if( SUCCEEDED( InitVB1() ) )
{
ShowWindow( hWnd, SW_SHOWDEFAULT );
UpdateWindow( hWnd );
MSG msg;
ZeroMemory( &msg, sizeof(msg) );
while( msg.message!=WM_QUIT )
{
if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
Render1();
}
}
}

UnregisterClass( "Robin", wc.hInstance );
return 0;
}


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-5-16 16:40

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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