游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5584|回复: 8

谁有D3D天空盒子的代码?

[复制链接]

27

主题

93

帖子

106

积分

注册会员

Rank: 2

积分
106
发表于 2007-12-21 17:45:00 | 显示全部楼层 |阅读模式
示范代码。谢谢

14

主题

345

帖子

376

积分

中级会员

Rank: 3Rank: 3

积分
376
QQ
发表于 2007-12-23 15:45:00 | 显示全部楼层

Re:谁有D3D天空盒子的代码?

SDK里就有

35

主题

1735

帖子

1739

积分

金牌会员

Rank: 6Rank: 6

积分
1739
QQ
发表于 2007-12-23 18:43:00 | 显示全部楼层

Re:谁有D3D天空盒子的代码?

天空盒的源代码,本站就有。

1

主题

8

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2007-12-26 09:28:00 | 显示全部楼层

Re:谁有D3D天空盒子的代码?

能绘制立方体,你就能绘制天空盒,就是个放发版嘛!晕死!!!坐标设置好就完了!

0

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2008-1-13 16:03:00 | 显示全部楼层

Re:谁有D3D天空盒子的代码?

然后在把贴图帖上,观察点由放在盒子里看就行了

5

主题

53

帖子

109

积分

注册会员

Rank: 2

积分
109
发表于 2009-11-14 22:04:00 | 显示全部楼层

Re: Re:谁有D3D天空盒子的代码?

herosoulyy: Re:谁有D3D天空盒子的代码?

能绘制立方体,你就能绘制天空盒,就是个放发版嘛!晕死!!!坐标设置好就完了!


那顶点法线真晕人- -,三角形都要计算顶点法线吧。貌似用ComputeNormal()可以计算三角形的顶点法线,这倒可以试试

1

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
发表于 2009-11-20 04:03:00 | 显示全部楼层

Re:谁有D3D天空盒子的代码?

#include "Stdafx.h"
#include "SkyBox.h"

SkyBox::SkyBox(LPDIRECT3DDEVICE9 device)
{
        _device=device;
        _pos=D3DXVECTOR3(0.0f,0.0f,0.0f);
        _pTex[6]=(0,0,0,0,0,0);
}
SkyBox::~SkyBox(void)
{
        if(_mesh!=NULL)
        {
                _mesh->Release();
                _mesh=NULL;
        }
        for(int i = 0;i < 6; i++)
        {
                if(_pTex!=NULL)
                        _pTex->Release();
        }
}


void SkyBox::SetPos(D3DXVECTOR3 pos)
{
        _pos=pos;
}

bool SkyBox::Init(LPCSTR fontFileName,  LPCSTR leftFileName,LPCSTR backFileName, LPCSTR rightFileName, LPCSTR topFileName, LPCSTR bottomFileName,float length, float width, float height)
{

        HRESULT rs = 0;
        rs = D3DXCreateMeshFVF(12,24,
                D3DXMESH_MANAGED,VERTWXFVF_XYZT,
                _device, &_mesh);
        VertexXYZT* V = 0;
        //填充顶点数据
        _mesh->LockVertexBuffer(0,(void**)&V);
        //正面
        V[0] = VertexXYZT(-length/2.0f, -height/2.0f, -width/2.0f, 0.0 , 1.0);
        V[1] = VertexXYZT(-length/2.0f, height/2.0f, -width/2.0f, 0.0 , 0.0);
        V[2] = VertexXYZT(length/2.0f, -height/2.0f, -width/2.0f, 1.0 , 1.0);
        V[3] = VertexXYZT(length/2.0f, height/2.0f, -width/2.0f,  1.0 , 0.0);
        //左面
        V[4] = VertexXYZT(-length/2.0f, -height/2.0f, width/2.0f, 0.0 , 1.0 );
        V[5] = VertexXYZT(-length/2.0f, height/2.0f, width/2.0f, 0.0 , 0.0 );
        V[6] = VertexXYZT(-length/2.0f, -height/2.0f, -width/2.0f, 1.0 ,1.0 );
        V[7] = VertexXYZT(-length/2.0f, height/2.0f, -width/2.0f, 1.0, 0.0);
        //后面
        V[8] = VertexXYZT(length/2.0f, -height/2.0f, width/2.0f,  0.0 , 1.0 );
        V[9] = VertexXYZT(length/2.0f, height/2.0f, width/2.0f,  0.0 , 0.0 );
        V[10] = VertexXYZT(-length/2.0f, -height/2.0f, width/2.0f, 1.0 , 1.0);
        V[11] = VertexXYZT(-length/2.0f, height/2.0f, width/2.0f,1.0 , 0.0);
        //y右面
        V[12] = VertexXYZT(length/2.0f, -height/2.0f, -width/2.0f, 0.0 , 1.0);
        V[13] = VertexXYZT(length/2.0f, height/2.0f, -width/2.0f,  0.0 , 0.0);
        V[14] = VertexXYZT(length/2.0f, -height/2.0f, width/2.0f,  1.0 , 1.0 );
        V[15] = VertexXYZT(length/2.0f, height/2.0f, width/2.0f,  1.0 , 0.0 );
        //顶面
        V[16] = VertexXYZT(-length/2.0f,height/2.0f,-width/2.0f,  0.0 , 0.0 );
        V[17] = VertexXYZT(-length/2.0f, height/2.0f, width/2.0f, 1.0 , 0.0);
        V[18] = VertexXYZT(length/2.0f, height/2.0f, -width/2.0f, 0.0 , 1.0 );
        V[19] = VertexXYZT(length/2.0f, height/2.0f, width/2.0f, 1.0 , 1.0);
        //底面
        V[20] = VertexXYZT(length/2.0f, -height/2.0f, -width/2.0f, 0.0f , 0.0f);
        V[21] = VertexXYZT(length/2.0f, -height/2.0f, width/2.0f, 1.0f , 0.0f);
        V[22] = VertexXYZT(-length/2.0f, -height/2.0f, -width/2.0f, 0.0f , 1.0f);
        V[23] = VertexXYZT(-length/2.0f, -height/2.0f, width/2.0f, 1.0f , 1.0f);
        _mesh->UnlockVertexBuffer();

        //填充索引数据
        WORD *IB = 0;
        _mesh->LockIndexBuffer(0,(void**)&IB);
        IB[0] = 0; IB[1] = 1; IB[2] = 2; IB[3] = 1; IB[4] = 3; IB[5] = 2;
        IB[6] = 4; IB[7] = 5; IB[8] = 6; IB[9] = 5; IB[10] = 7; IB[11] = 6;
        IB[12] = 8; IB[13] = 9; IB[14] = 10; IB[15] = 9; IB[16] = 11; IB[17] = 10;
        IB[18] = 12; IB[19] = 13; IB[20] = 14; IB[21] = 13; IB[22] = 15; IB[23] =14;
        IB[24] = 16; IB[25] = 17; IB[26] = 18; IB[27] = 17; IB[28] = 19; IB[29] =18;
        IB[30] = 23; IB[31] = 22; IB[32] = 21; IB[33] = 22; IB[34] = 20; IB[35] =21;
        _mesh->UnlockIndexBuffer();

        DWORD* attribute = 0;
        _mesh->LockAttributeBuffer(0,&attribute);
        for(int i = 0; i < 2; i++ )
                attribute = 0;
        for(int i = 2; i < 4; i++ )
                attribute = 1;
        for(int i = 4; i < 6; i++ )
                attribute = 2;
        for(int i = 6; i < 8; i++ )
                attribute = 3;
        for(int i = 8; i < 10; i++ )
                attribute = 4;
        for(int i = 10; i < 12; i++ )
                attribute = 5;
        _mesh->UnlockAttributeBuffer();
        //计算网格的邻接信息
        std::vector<DWORD> adjacencyBuffer(_mesh->GetNumFaces()*3);
        //产生邻接信息
        _mesh->GenerateAdjacency(0,&adjacencyBuffer[0]);
        //在什么地方进行优化
        _mesh->OptimizeInplace(D3DXMESHOPT_ATTRSORT|D3DXMESHOPT_COMPACT
                |D3DXMESHOPT_VERTEXCACHE,//执行优化的类型
                &adjacencyBuffer[0],//没有进行优化的邻接数组
                0,//输出优化后的邻接数组
                0,//接受面的邻接信息
                0);//返回顶点重影射信息
        D3DXCreateTextureFromFile(_device,fontFileName,&_pTex[0]);
        D3DXCreateTextureFromFile(_device,rightFileName,&_pTex[1]);
        D3DXCreateTextureFromFile(_device,backFileName,&_pTex[2]);
        D3DXCreateTextureFromFile(_device,leftFileName,&_pTex[3]);
        D3DXCreateTextureFromFile(_device,topFileName,&_pTex[4]);
        D3DXCreateTextureFromFile(_device,bottomFileName,&_pTex[5]);
       
        return true;
}

void SkyBox::Render()
{
        D3DXMATRIXA16 matWorld;
        D3DXMatrixTranslation(&matWorld,_pos.x,_pos.y,_pos.z);

        _device->SetTextureStageState(0,D3DTSS_COLOROP,D3DTSS_COLORARG1);
        _device->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
        _device->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_LINEAR);
        _device->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR);
        _device->SetTransform(D3DTS_WORLD, &matWorld);
        _device->SetSamplerState(0,D3DSAMP_ADDRESSU,D3DTADDRESS_CLAMP);
        _device->SetSamplerState(0,D3DSAMP_ADDRESSV,D3DTADDRESS_CLAMP);
        _device->SetRenderState(D3DRS_LIGHTING,false);
        for(int i = 0;i < 6; i++)
        {
                _device->SetTexture(0,_pTex);
                _mesh->DrawSubset(i);
        }

}

1

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
发表于 2009-11-20 04:03:00 | 显示全部楼层

Re:谁有D3D天空盒子的代码?

#pragma once

class SkyBox
{
private:
        LPD3DXMESH                        _mesh;
        LPDIRECT3DDEVICE9        _device;
        IDirect3DTexture9 *_pTex[6];
        IDirect3DVertexBuffer9 *_pVB;
        D3DXVECTOR3                        _pos;
        VertexXYZT*                                _v;
public:
        bool Init(LPCSTR fontFileName, LPCSTR leftFileName,LPCSTR backFileName,LPCSTR rightFileName,
                LPCSTR topFileName,        LPCSTR bottomFileName,float length,float width, float height);
        void SetPos(D3DXVECTOR3 pos);
        void Render();
        SkyBox(LPDIRECT3DDEVICE9 device);
        ~SkyBox(void);
};

23

主题

59

帖子

59

积分

注册会员

Rank: 2

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

Re:谁有D3D天空盒子的代码?

#pragma once
#include "node.h"
struct VertexSkyBox{
        float m_x,m_y,m_z;
        float m_nx,m_ny,m_nz;
        float m_u,m_v;
        //D3DCOLOR m_color;
        VertexSkyBox(){m_x=0;m_y=0;m_z=0;}
        VertexSkyBox(float x,float y,float z,float nx,float ny,float nz,float u,float v){
                m_x=x;                m_y=y;                m_z=z;
                m_nx=nx;        m_ny=ny;    m_nz=nz;
                m_u=u;                m_v=v;
                //m_color=color;
        }
};
class CSkyBox :
        public CNode
{
private:
        IDirect3DVertexBuffer9 *m_PVB;
        IDirect3DIndexBuffer9 *m_PIB;
        D3DMATERIAL9 m_material;
        IDirect3DTexture9* m_pTexture;
public:
        CSkyBox(IDirect3DDevice9 *pDevice);
        ~CSkyBox(void);
        void Render(IDirect3DDevice9 *pDevice);
};


#include "StdAfx.h"
#include "SkyBox.h"

CSkyBox::CSkyBox(IDirect3DDevice9 *pDevice)
{
        pDevice->CreateVertexBuffer((24 * sizeof(VertexSkyBox)),D3DUSAGE_WRITEONLY,D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1,D3DPOOL_MANAGED,&m_PVB,0);
        pDevice->CreateIndexBuffer(36*sizeof(WORD),D3DUSAGE_WRITEONLY,D3DFMT_INDEX16,D3DPOOL_MANAGED,&m_PIB,0);
        VertexSkyBox *pV;
        float size=20.0f;
        m_PVB->Lock(0,0,(void**)&pV,0);
        //TOP上表面
        pV[0]=VertexSkyBox(-size,size,size,0.0f,1.0f,0.0f,0.0f,0.0f);//0
        pV[1]=VertexSkyBox(-size,size,-size,0.0f,1.0f,0.0f,0.0f,1.0f);//1
        pV[2]=VertexSkyBox(size,size,-size,0.0f,1.0f,0.0f,1.0f,1.0f);//2
        pV[3]=VertexSkyBox(size,size,size,0.0f,1.0f,0.0f,1.0f,0.0f);//3
        //FRONT 前表面
        pV[4]=VertexSkyBox(-size,size,-size,0.0f,0.0f,-1.0f,0.0f,0.0f);//1
        pV[5]=VertexSkyBox(size,size,-size,0.0f,0.0f,-1.0f,1.0f,0.0f);//2
        pV[6]=VertexSkyBox(-size,-size,-size,0.0f,0.0f,-1.0f,0.0f,1.0f);//5
        pV[7]=VertexSkyBox(size,-size,-size,0.0f,0.0f,-1.0f,1.0f,1.0f);//6
        //BUTTON 下表面
        pV[8]=VertexSkyBox(-size,-size,-size,0.0f,-1.0f,0.0f,0.0f,0.0f);//5
        pV[9]=VertexSkyBox(size,-size,-size,0.0f,-1.0f,0.0f,1.0f,0.0f);//6
        pV[10]=VertexSkyBox(size,-size,size,0.0f,-1.0f,0.0f,1.0f,1.0f);//7
        pV[11]=VertexSkyBox(-size,-size,size,0.0f,-1.0f,0.0f,0.0f,1.0f);//4
        //BACK 背面
        pV[12]=VertexSkyBox(-size,size,size,0.0f,0.0f,1.0f,0.0f,0.0f);//0
        pV[13]=VertexSkyBox(size,size,size,0.0f,0.0f,1.0f,1.0f,0.0f);//3
        pV[14]=VertexSkyBox(size,-size,size,0.0f,0.0f,1.0f,1.0f,1.0f);//7
        pV[15]=VertexSkyBox(-size,-size,size,0.0f,0.0f,1.0f,0.0f,1.0f);//4
        //LEFT 左面
        pV[16]=VertexSkyBox(-size,size,size,-1.0f,0.0f,0.0f,0.0f,0.0f);//0
        pV[17]=VertexSkyBox(-size,size,-size,-1.0f,0.0f,0.0f,1.0f,0.0f);//1
        pV[18]=VertexSkyBox(-size,-size,-size,-1.0f,0.0f,0.0f,1.0f,1.0f);//5
        pV[19]=VertexSkyBox(-size,-size,size,-1.0f,0.0f,0.0f,0.0f,1.0f);//4
        //RIGHT 右面
        pV[20]=VertexSkyBox(size,size,-size,1.0f,0.0f,0.0f,0.0f,0.0f);//2
        pV[21]=VertexSkyBox(size,size,size,1.0f,0.0f,0.0f,1.0f,0.0f);//3
        pV[22]=VertexSkyBox(size,-size,size,1.0f,0.0f,0.0f,1.0f,1.0f);//7
        pV[23]=VertexSkyBox(size,-size,-size,1.0f,0.0f,0.0f,0.0f,1.0f);//6

        m_PVB->Unlock();

        WORD *pW;
        m_PIB->Lock(0,0,(void**)&pW,0);
        pW[0]=1;pW[1]=3;pW[2]=0;
        pW[3]=2;pW[4]=3;pW[5]=1;

        pW[6]=6;pW[7]=5;pW[8]=4;
        pW[9]=6;pW[10]=7;pW[11]=5;

        pW[12]=9;pW[13]=8;pW[14]=11;
        pW[15]=10;pW[16]=9;pW[17]=11;

        pW[18]=14;pW[19]=15;pW[20]=12;
        pW[21]=13;pW[22]=14;pW[23]=12;

        pW[24]=16;pW[25]=19;pW[26]=18;
        pW[27]=17;pW[28]=16;pW[29]=18;

        pW[30]=23;pW[31]=21;pW[32]=20;
        pW[33]=22;pW[34]=21;pW[35]=23;
        m_PIB->Unlock();

        ZeroMemory(&m_material,sizeof(D3DMATERIAL9));
        m_material.Diffuse=D3DXCOLOR(1.0f,1.0f,1.0f,1.0f);
        m_material.Emissive=D3DXCOLOR(1.0f,1.0f,1.0f,1.0f);


        :3DXCreateTextureFromFile(pDevice,"Sky.jpg",&m_pTexture);
        pDevice->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR);
        pDevice->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_LINEAR);

}

void CSkyBox::Render(IDirect3DDevice9 *pDevice){
        D3DXMATRIX mWorld;
        this->getWorldMatrix(&mWorld);
        pDevice->SetTransform(D3DTS_WORLD,&mWorld);

        pDevice->SetStreamSource(0,m_PVB,0,sizeof(VertexSkyBox));
        pDevice->SetFVF(D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1);
        pDevice->SetIndices(m_PIB);
        pDevice->SetMaterial(&m_material);
        pDevice->SetTexture(0,m_pTexture);
        pDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,24,0,12);
}

CSkyBox::~CSkyBox(void)
{
        m_PVB->Release();
        m_PIB->Release();
        m_pTexture->Release();
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-17 21:24

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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