Original Post
this it part of the d3d program i write, there is one problem:
"steel.bmp" is a very good texture and it can connect with itself perfectly, but when i use it in my program, it connects bad, it seems that some parts are brighter.
and...how to use >1 kind of texture? i mean, one vertex has a texture while another vertex has another kind of texture.
how to make >1 kind of texture alpha blended in one vertex?
#include "rpg_demo_iii.h"
LPDIRECT3D8 pD3D=NULL;
LPDIRECT3DDEVICE8 pDev=NULL;
LPDIRECT3DVERTEXBUFFER8 pVB=NULL;
//LPDIRECT3DINDEXBUFFER8 pIB=NULL;
LPDIRECT3DTEXTURE8 pT=NULL;
int IndexNum;
int VertNum;
/*
VERTEX vertex[]=
{
-1,-5,0,0x00ffffff,0.0,0.0,
-1, 5,0,0x00ffffff,0.0,1.0,
1,-5,0,0x00ffffff,1.0,0.0,
1, 5,0,0x00ffffff,1.0,1.0
};
WORD index[]={0,1,2,1,2,3};
*/
VERTEX *vertex;
//WORD *index;
void InitObject()
{
//-----------------------------Init Floor----------------------------
float w=2.0f;
float h=4.0f;
vertex=new VERTEX[w*h*6];
VertNum=w*h*6;
int p=0;
for (float x=0;xGetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm)))
return E_FAIL;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed=FALSE;
d3dpp.hDeviceWindow=hwnd;
d3dpp.SwapEffect=D3DSWAPEFFECT_FLIP;
d3dpp.BackBufferCount=2;
d3dpp.BackBufferWidth=SCREEN_WIDTH;
d3dpp.BackBufferHeight=SCREEN_HEIGHT;
d3dpp.BackBufferFormat=d3ddm.Format;
d3dpp.EnableAutoDepthStencil=TRUE;
d3dpp.AutoDepthStencilFormat=D3DFMT_D16;
d3dpp.FullScreen_RefreshRateInHz=D3DPRESENT_RATE_DEFAULT;
d3dpp.FullScreen_PresentationInterval=D3DPRESENT_INTERVAL_IMMEDIATE;
//-----------------------------Create D3D Device---------------------
if( FAILED( pD3D->CreateDevice( D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hwnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,&pDev)))
return E_FAIL;
//-----------------------------Create Matrix-------------------------
D3DXMATRIX matWorld;
D3DXMatrixIdentity(&matWorld);
pDev->SetTransform(D3DTS_WORLD,&matWorld);
D3DXMATRIX matProj;
D3DXMatrixPerspectiveFovLH(&matProj,D3DX_PI/4,1.0f,1.0f,500.0f);
pDev->SetTransform(D3DTS_PROJECTION,&matProj);
//-----------------------------Set Render State----------------------
pDev->SetRenderState(D3DRS_LIGHTING,FALSE);
pDev->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
pDev->SetRenderState(D3DRS_ZENABLE,TRUE);
//-----------------------------Setup Vertex Buffer-------------------
pDev->CreateVertexBuffer
(sizeof(VERTEX)*VertNum,
D3DUSAGE_DONOTCLIP|D3DUSAGE_WRITEONLY,
D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1,
D3DPOOL_DEFAULT,&pVB);
VERTEX *pV;
pVB->Lock(0,0,(BYTE **)&pV,0);
memcpy(pV,vertex,sizeof(VERTEX)*VertNum);
pVB->Unlock();
pDev->SetVertexShader(D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1);
pDev->SetStreamSource(0,pVB,sizeof(VERTEX));
//-----------------------------Setup Index Buffer--------------------
/* pDev->CreateIndexBuffer(sizeof(index),
D3DUSAGE_WRITEONLY,
D3DFMT_INDEX16,
D3DPOOL_DEFAULT,
&pIB);
WORD *pI;
pIB->Lock(0,0,(BYTE **)&pI,0);
memcpy(pI,index,sizeof(index));
pIB->Unlock();
pDev->SetIndices(pIB,0);*/
//-----------------------------Setup Texture-------------------------
D3DXCreateTextureFromFile(pDev,"steel.bmp",&pT);
pDev->SetTexture(0, pT);
return S_OK;
}
void CloseD3D(void)
{
if(pVB!=NULL)
pVB->Release();
/* if(pIB!=NULL)
pIB->Release();*/
if(pT!=NULL)
pT->Release();
if(pDev!=NULL)
pDev->Release();
if(pD3D!=NULL)
pD3D->Release();
}
void RenderD3D(void)
{
pDev->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0),1.0f,0);
pDev->BeginScene();
MoveCamera();
pDev->DrawPrimitive(D3DPT_TRIANGLELIST,0,VertNum/3);
// pDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,IndexNum,0,IndexNum/3);
pDev->EndScene();
pDev->Present(NULL,NULL,NULL,NULL);
}
void MoveCamera()
{
rad+=0.01f;
/* D3DXMATRIX matWorld;
D3DXMatrixRotationY(&matWorld,rad);
pDev->SetTransform(D3DTS_WORLD,&matWorld);*/
D3DXMATRIX matView;
D3DXMatrixLookAtLH(&matView,&D3DXVECTOR3(0,-2.0f+rad,1.05),
&D3DXVECTOR3(0.0f,-1.0f+rad,0.0f),
&D3DXVECTOR3(0.0f,1.0f,0.0f));
pDev->SetTransform(D3DTS_VIEW,&matView);
}
I am very badluck...