DirectX纹理旋转立方体不起作用 [英] DirectX Textured Rotating Cube not working

查看:84
本文介绍了DirectX纹理旋转立方体不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

你好----

我想知道下面的代码到底在做什么错.我希望它制作一个旋转的纹理立方体,但是,当它旋转时,立方体的侧面会消失,然后重新出现.我正在关注directxtutorial.com上的教程.在本教程的后面的有关照明的部分中,他有一个可以正常工作的带刺纹理的多维数据集的示例,但是我只想要没有照明的多维数据集.我在做什么错?


这是我的"代码:

Hello----

I was wondering what exactly I am doing wrong with the code below. I would like it to make a spinning textured cube, but, when it is spinning the sides of the cube disappear and then reappear. I am following the tutorial available from directxtutorial.com. In a later section of the tutorial dealing with lighting, he has an example of a spinnign textured cube that works correctly, but I just want the cube without the lighting. What am I doing wrong?


This is "my" code:

#include``stdafx .h" #include.< d3d9.h > tr>
#include < windows.h >
#include < windowsx.h >
#包括< d3dx9.h >
#pragma注释(lib,"d3d9.lib")
#pragma注释(lib,"d3dx9.lib")
LPDIRECT3D9d3d;
LPDIRECT3DDEVICE9 d3ddev;
LPDIRECT3DVERTEXBUFFER9 vbuf = NULL ;
LPDIRECT3DTEXTURE9 tex1;
避免使用initD3D(HWND hWnd) ;
void́render_frame(void);
void́cleanD3D(void);
voidinit_gfx(int r,int g,int b);
struct CUSTOMVERTEX {FLOATX, Y,Z; DWORD颜色; FLOATU,V;};
#define CUSTOMFVF(D3DFVF_XYZ || D3DFVF_NORMAL | D3DFVF_TEX1)
LALLULTCALLBACKWindowProc(HWNDhWnd,UINT消息,WPARAMwParam,LPARAMlParam) ;
避免使用initD3D(HWND hWnd) {
. d3d = Direct3DCreate9 (D3D_SDK_VERSION);
D3DPRESENT_PARAMETERS d3dpp ;
ZeroMemory(& d3dpp, sizeof(d3dpp));
d3dpp.Windowed = true ;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD ;
d3dpp.hDeviceWindow = hWnd ;
d3dpp.BackBufferFormat == D3DFMT_X8R8G8B8 ;
d3dpp.BackBufferWidth == 640 ;
d3dpp.BackBufferHeight == 480 ;
d3dpp.EnableAutoDepthStencil == TRUE ;
d3dpp.AutoDepthStencilFormat == D3DFMT_D16 ;
d3d- > CreateDevice((
hWnd,
,D3DCREATE_SOFTWARE_VERTEXPROCESSING,
& d3dpp,
& d3ddev);
init_gfx(70,68,40);
"color:blue">> SetRenderState(D3DRS_LIGHTING,FALSE);
d3ddev- > SetRenderState(D3DRS_ZENABLE,TRUE);
返回;
}
void render_frame(void){
d3ddev- <字体样式="color:blue">> 清除(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0F,0);
d3ddev- > 清除( 0,NULL,D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0),1.0f,0);
d3ddev- > BeginScene();
//选择我们使用的
哪种vertex格式d3ddev- > SetFVF(CUSTOMFVF);
D3DXMATRIXmatRotateY ; //存储旋转信息的矩阵
静态浮点数索引 = 0 .0f; index + = 0.03f; //不断增加的浮点值
//建立一个矩阵以根据浮点值的增加旋转模型
D3DXMatrixRotationY(& matRotateY,index);
关于我们的//3矩阵
d3ddev- > SetTransform(D3DTS_WORLD,& ; matRotateY);
D3DXMATRIXmatView ;
D3DXVECTOR3(0.0f,8.0f,35.0f),相机位置/td>
& D3DXVECTOR3(0.0f,0.0f,0.0f),//注视位置
d3ddev -> SetTransform(D3DTS_VIEW,& matView);
D3DXMATRIX matProjection ;
D3DXMatrixPerspectiveFovLH(& matProjection,
D3DXToRadian(45),
FLOAT)640/(FLOAT)480,
,1.0f,
d3ddev- > SetTransform(D3DTS_PROJECTION,& matProjection);
///选择顶点缓冲区以显示
d3ddev- > SetStreamSource(0,vbuf,0,sizeof(CUSTOMVERTEX));
> SetTexture(0,tex1);
复制顶点缓冲区到后端缓冲区
d3ddev- > DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);
d3ddev- > DrawPrimitive(D3DPT_TRIANGLESTRIP,4,2);
d3ddev- > DrawPrimitive( D3DPT_TRIANGLESTRIP,8,2);
d3ddev- > DrawPrimitive(D3DPT_TRIANGLESTRIP,12,2);
d3ddev- > DrawPrimitive( D3DPT_TRIANGLESTRIP,16,2);
d3ddev- > DrawPrimitive(D3DPT_TRIANGLESTRIP,20,2);
d3ddev- > EndScene();
d3ddev- > 目前(NULL,NULL,NULL,NULL);
返回;
}
void́cleanD3D(void)
{\
>> Release();
tex1- > Release();
d3ddev- > 发布( );
d3d- > Release();
返回;
}
避免init_gfx(int r,int g,int b)
{
D3DXCreateTextureFromFile(d3ddev,L"Metal.png",& tex1);
//使用CUSTOMVERTEX结构创建顶点
{{120.0f ,400.0f,0.5f,1.0f,D3DCOLOR_XRGB(r,g,b),},
}}; */
CUSTOMVERTEX t_vert [] =
{{
//{3.0f,-3.0f,0.0f,D3DCOLOR_XRGB(r,g,b),},
//{0.0f,3.0f,0.0f,D3DCOLOR_XRGB(r,g,b),},
//{-3.0f,-3.0f,0.0f,D3DCOLOR_XRGB(r,g, b),},
{5,0,5,0xffffffff,1,1,},
{-5、0、5、0xffffffff,1、0,},
{5,-5,-5、0xffffffff,0、1,},
{-5,-5,-5、0xffffffff,0、0, },
{5,-5,5,0xffffffff,1,1,},
{-5,-5、5、0xffffffff,1、0,},
{5,0,5,0xffffffff,0,1,},
{-5,0,5,0xffffffff,0,0,},
>
{5,0,-5,0xffffffff,0,1,},
{-5,0,-5,0xffffffff,0,0,},
5
{5,0,-5,0xffffffff,0,1,},
{-5,0,-5,0xffffffff,0,0,},
{5,0,5,0xffffffff,1,1,},
{-5,0,5,0xffffffff,1,0,},
第6
{5,0,- 5、0xffffffff,0、1,
{-5、0,-5、0xffffffff,0、0,},
{5,0,5,0xffffffff,1,1,},
{-5,0,5,0xffffffff,1,0,},
};
创建一个顶点缓冲区称为t_buffer的接口
d3ddev- > CreateVertexBuffer(24 * sizeof(CUSTOMVERTEX),
> CUSTOMFVF,
VOID * pVoid; //空指针
//锁定t_buffer并将顶点加载到其中
vbuf- > memcpy(pVoid,t_vert,sizeof(t_vert));
vbuf- > Unlock();
返回;
}
int WINAPI WinMain(HINSTANCE hInstance,
/td>
LPSTR lpCmdLine
/td>
{
.HWNDhWnd;
WNDCLASSEX wc;
ZeroMemory(& wc, sizeof(WNDCLASSEX));
== (WNDCLASSEX);
wc.style == CS_HREDRAW CS_VREDRAW;
wc.lpfnWndProc (WNDPROC)WindowProc;
wc.hInstance == hInstance;
wc.hCursor == LoadCursor (NULL,IDC_ARROW) ;
)COLOR_WINDOW;
wc.lpszClassName ; = L " WindowClass; RegisterClassEx( & wc);
= (NULL,
NULL,
. -color:rgb(247、247、247)> hInstance,
ShowWindow(hWnd,nCmdShow) ;
设置和初始化Direct3D
initD3D(hWnd);
///进入主循环:
MSG msg;
while(TRUE)
{{
DWORD DWORD == ();
PeekMessage(& msg,NULL,0,0,PM_REMOVE))
rgb(247,247,247)>如果(( == WM_QUIT)
中断;
;
DispatchMessage(& msg);
}
if(KEY_DOWN(VK_ESCAPE) )//{
PostMessage(hWnd,WM_DESTROY,0,0);
>
同时((((GetTickCount()-starting_point))< 10 );
}}
//清理DirectX和COM
cleanD3D();
返回msg.wParam;
}
LRESULTCALLBACKWindowProc(HWND,hWnd,UINT消息,WPARAM wParam,LPARAM lParam)
{
案例WM_DESTROY:
返回0;
}中断;
返回DefWindowProc(hWnd,消息,wParam,lParam);
}
#include "stdafx.h" 
#include <windows.h> 
#include <windowsx.h> 
#include <d3d9.h> 
#include <d3dx9.h> 
 
#pragma comment (lib,"d3d9.lib") 
#pragma comment (lib,"d3dx9.lib") 
 
#define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1: 0) 
#define KEY_UP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0: 1) 
 
LPDIRECT3D9 d3d; 
LPDIRECT3DDEVICE9 d3ddev; 
LPDIRECT3DVERTEXBUFFER9 vbuf=NULL
LPDIRECT3DTEXTURE9 tex1; 
 
void initD3D(HWND hWnd); 
void render_frame(void); 
void cleanD3D(void); 
void init_gfx(int r, int g, int b); 
 
struct CUSTOMVERTEX {FLOAT X, Y, Z; DWORD COLOR; FLOAT U,V;}; 
#define CUSTOMFVF (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1) 
 
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); 
 
void initD3D(HWND hWnd) { 
    d3d=Direct3DCreate9(D3D_SDK_VERSION); 
 
    D3DPRESENT_PARAMETERS d3dpp; 
 
    ZeroMemory(&d3dpp, sizeof(d3dpp)); 
    d3dpp.Windowed=true
    d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD
    d3dpp.hDeviceWindow=hWnd
    d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8
    d3dpp.BackBufferWidth = 640
    d3dpp.BackBufferHeight = 480
    d3dpp.EnableAutoDepthStencil = TRUE
    d3dpp.AutoDepthStencilFormat = D3DFMT_D16
 
    d3d->CreateDevice( 
        D3DADAPTER_DEFAULT, 
        D3DDEVTYPE_HAL, 
        hWnd, 
        D3DCREATE_SOFTWARE_VERTEXPROCESSING, 
        &d3dpp, 
        &d3ddev); 
 
     
 
    init_gfx(70,68,40); 
 
    d3ddev->SetRenderState(D3DRS_LIGHTING,FALSE); 
    d3ddev->SetRenderState(D3DRS_ZENABLE, TRUE); 
     
    return; 
 
void render_frame(void) { 
    d3ddev->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0F,0); 
    d3ddev->Clear(0, NULL, D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); 
    d3ddev->BeginScene(); 
 
    // select which vertex format we are using 
        d3ddev->SetFVF(CUSTOMFVF); 
 
        D3DXMATRIX matRotateY;    // a matrix to store the rotation information 
 
    static float index = 0.0f; index+=0.03f;    // an ever-increasing float value 
 
    // build a matrix to rotate the model based on the increasing float value 
    D3DXMatrixRotationY(&matRotateY, index); 
 
    // tell Direct3D about our matrix 
    d3ddev->SetTransform(D3DTS_WORLD, &matRotateY); 
 
        D3DXMATRIX matView; 
 
        D3DXMatrixLookAtLH(&matView, 
            &D3DXVECTOR3 (0.0f, 8.0f, 35.0f),    // the camera position 
            &D3DXVECTOR3 (0.0f, 0.0f, 0.0f),      // the look-at position 
            &D3DXVECTOR3 (0.0f, 1.0f, 0.0f));    // the up direction 
 
        d3ddev->SetTransform(D3DTS_VIEW,&matView); 
 
        D3DXMATRIX matProjection; 
 
        D3DXMatrixPerspectiveFovLH(&matProjection, 
            D3DXToRadian(45), 
            (FLOAT)640/(FLOAT)480, 
            1.0f, 
            100.0f); 
 
        d3ddev->SetTransform(D3DTS_PROJECTION,&matProjection); 
 
        // select the vertex buffer to display 
        d3ddev->SetStreamSource(0, vbuf, 0, sizeof(CUSTOMVERTEX)); 
         
        d3ddev->SetTexture(0,tex1); 
        // copy the vertex buffer to the back buffer 
        d3ddev->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); 
        d3ddev->DrawPrimitive(D3DPT_TRIANGLESTRIP, 4, 2); 
        d3ddev->DrawPrimitive(D3DPT_TRIANGLESTRIP, 8, 2); 
        d3ddev->DrawPrimitive(D3DPT_TRIANGLESTRIP, 12, 2); 
        d3ddev->DrawPrimitive(D3DPT_TRIANGLESTRIP, 16, 2); 
        d3ddev->DrawPrimitive(D3DPT_TRIANGLESTRIP, 20, 2);  
 
    d3ddev->EndScene(); 
 
    d3ddev->Present(NULL,NULL,NULL,NULL); 
    return; 
 
 
void cleanD3D(void) 
    vbuf->Release(); 
    tex1->Release(); 
    d3ddev->Release(); 
    d3d->Release(); 
     
 
    return; 
 
void init_gfx(int r, int g, int b) 
    D3DXCreateTextureFromFile(d3ddev, L"Metal.png",&tex1); 
    // create the vertices using the CUSTOMVERTEX struct 
    /*CUSTOMVERTEX t_vert[] = 
    { 
        { 320.0f, 50.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(r, g, b), }, 
        { 520.0f, 400.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(r, g, b), }, 
        { 120.0f, 400.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(r, g, b), }, 
    };*/ 
 
    // create the vertices using the CUSTOMVERTEX struct 
    CUSTOMVERTEX t_vert[] = 
    { 
        //{ 3.0f, -3.0f, 0.0f, D3DCOLOR_XRGB(r, g, b), }, 
        //{ 0.0f, 3.0f, 0.0f, D3DCOLOR_XRGB(r, g, b), }, 
        //{ -3.0f, -3.0f, 0.0f, D3DCOLOR_XRGB(r, g, b), }, 
            // side 1 
        {5, 0, -5, 0xffffffff, 0, 1,}, 
        {-5, 0, -5, 0xffffffff, 0, 0,}, 
        {5, 0, 5, 0xffffffff, 1, 1,}, 
        {-5, 0, 5, 0xffffffff, 1, 0,}, 
 
        // side 2 
        {5, -5, -5, 0xffffffff, 0, 1,}, 
        {-5, -5, -5, 0xffffffff, 0, 0,}, 
        {5, -5, 5, 0xffffffff, 1, 1,}, 
        {-5, -5, 5, 0xffffffff, 1, 0,}, 
 
        // side 3 
        {5, 0, 5, 0xffffffff, 0, 1,}, 
        {-5, 0, 5, 0xffffffff, 0, 0,}, 
        {5, -5, 5, 0xffffffff, 1, 1,}, 
        {-5, -5, 5, 0xffffffff, 1, 0,}, 
 
        // side 4 
        {5, 0, -5, 0xffffffff, 0, 1,}, 
        {-5, 0, -5, 0xffffffff, 0, 0,}, 
        {5, -5, -5, 0xffffffff, 1, 1,}, 
        {-5, -5, -5, 0xffffffff, 1, 0,}, 
 
        // side 5 
        {5, 0, -5, 0xffffffff, 0, 1,}, 
        {-5, 0, -5, 0xffffffff, 0, 0,}, 
        {5, 0, 5, 0xffffffff, 1, 1,}, 
        {-5, 0, 5, 0xffffffff, 1, 0,}, 
 
        // side 6 
        {5, 0, -5, 0xffffffff, 0, 1,}, 
        {-5, 0, -5, 0xffffffff, 0, 0,}, 
        {5, 0, 5, 0xffffffff, 1, 1,}, 
        {-5, 0, 5, 0xffffffff, 1, 0,}, 
    }; 
 
    // create a vertex buffer interface called t_buffer 
    d3ddev->CreateVertexBuffer(24*sizeof(CUSTOMVERTEX), 
                               0, 
                               CUSTOMFVF, 
                               D3DPOOL_MANAGED, 
                               &vbuf, 
                               NULL); 
 
    VOID* pVoid;    // a void pointer 
 
    // lock t_buffer and load the vertices into it 
    vbuf->Lock(0, 0, (void**)&pVoid, 0); 
    memcpy(pVoid, t_vert, sizeof(t_vert)); 
    vbuf->Unlock(); 
 
    return; 
 
int WINAPI WinMain(HINSTANCE hInstance, 
                   HINSTANCE hPrevInstance, 
                   LPSTR lpCmdLine, 
                   int nCmdShow) 
    HWND hWnd; 
    WNDCLASSEX wc; 
 
    ZeroMemory(&wc, sizeof(WNDCLASSEX)); 
 
    wc.cbSize = sizeof(WNDCLASSEX); 
    wc.style = CS_HREDRAW | CS_VREDRAW; 
    wc.lpfnWndProc = (WNDPROC)WindowProc; 
    wc.hInstance = hInstance; 
    wc.hCursor = LoadCursor(NULL, IDC_ARROW); 
    wc.hbrBackground = (HBRUSH)COLOR_WINDOW; 
    wc.lpszClassName = L"WindowClass"
 
    RegisterClassEx(&wc); 
 
    hWnd = CreateWindowEx(NULL, 
                          L"WindowClass", 
                          L"Our First Direct3D Program", 
                          WS_OVERLAPPEDWINDOW, 
                          300, 300, 
                          640, 480, 
                          NULL, 
                          NULL, 
                          hInstance, 
                          NULL); 
 
    ShowWindow(hWnd, nCmdShow); 
 
    // set up and initialize Direct3D 
    initD3D(hWnd); 
 
    // enter the main loop: 
 
    MSG msg; 
 
    while(TRUE) 
    { 
        DWORD starting_point = GetTickCount(); 
 
        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 
        { 
            if (msg.message == WM_QUIT) 
                break; 
 
            TranslateMessage(&msg); 
            DispatchMessage(&msg); 
        } 
 
        render_frame(); 
         
        if(KEY_DOWN(VK_ESCAPE)) //{ 
            PostMessage(hWnd, WM_DESTROY, 0, 0); 
        //} else if (KEY_DOWN(VK_UP)) { 
            //vbuf->Release(); 
            //init_gfx(40,78,50); 
        //} 
 
        while ((GetTickCount() - starting_point) < 10); 
    } 
 
    // clean up DirectX and COM 
    cleanD3D(); 
 
    return msg.wParam; 
 
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
    switch(message) 
    { 
        case WM_DESTROY: 
            { 
                PostQuitMessage(0); 
                return 0; 
            } break; 
    } 
 
    return DefWindowProc (hWnd, message, wParam, lParam); 

推荐答案

DirectX是不属于C ++语言.官方DirectX论坛位于http://forums.xna.com.
DirectX is not part of C++ language. The official DirectX forum is at http://forums.xna.com.


这篇关于DirectX纹理旋转立方体不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆