Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我的纹理不适用?(Direct3D,XYZRHW模式)_C++_Directx_Textures_2d_Direct3d - Fatal编程技术网

C++ 为什么我的纹理不适用?(Direct3D,XYZRHW模式)

C++ 为什么我的纹理不适用?(Direct3D,XYZRHW模式),c++,directx,textures,2d,direct3d,C++,Directx,Textures,2d,Direct3d,我正在做一个2D游戏,但我似乎无法为我的四边形添加纹理。我严格遵循了一些教程,看起来很简单,但我得到的只是一个默认颜色(白色)的四边形。纹理大小是64x64,是2的倍数,所以这应该不是问题。这是我的密码: #include "includes.h" #define CUSTOMFVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1) LPDIRECT3D9 d3d; LPDIRECT3DDEVICE9 d3ddev; LPDIRECT3DVERTEX

我正在做一个2D游戏,但我似乎无法为我的四边形添加纹理。我严格遵循了一些教程,看起来很简单,但我得到的只是一个默认颜色(白色)的四边形。纹理大小是64x64,是2的倍数,所以这应该不是问题。这是我的密码:

#include "includes.h"
#define CUSTOMFVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1)

LPDIRECT3D9 d3d;
LPDIRECT3DDEVICE9 d3ddev;
LPDIRECT3DVERTEXBUFFER9 v_buffer;
LPDIRECT3DTEXTURE9 Tex = NULL;

struct SQR
{
    float TLX = tile * 2;
    float TLY = tile * 4;
    float width = tile * 8;
    float height = tile * 6;
} sqr;

struct D3DVERTEX
{
    float fX,
    fY,
    fZ,
    fRHW;
    D3DCOLOR colour;
    float fU,
    fV;
} vertex[4];

void GenerateQuad()
{
    vertex[0] = { sqr.TLX - 0.5f, sqr.TLY - 0.5f, 1.0f, 1.0f, 0xffffffff, 0.0f, 0.0f };
    vertex[1] = { sqr.TLX + sqr.width - 0.5f, sqr.TLY - 0.5f, 1.0f, 1.0f, 0xffffffff, 1.0f, 0.0f };
    vertex[3] = { sqr.TLX - 0.5f, sqr.TLY + sqr.height - 0.5f, 1.0f, 1.0f, 0xffffffff, 0.0f, 1.0f };
    vertex[2] = { sqr.TLX + sqr.width - 0.5f, sqr.TLY + sqr.height - 0.5f, 1.0f, 1.0f, 0xffffffff, 1.0f, 1.0f };
}

IDirect3DTexture9 *LoadTexture(LPCWSTR fileName)
{
    IDirect3DTexture9 *d3dTexture;
    D3DXIMAGE_INFO SrcInfo;

    D3DCOLOR colorkey = 0xffffffff;


    if (FAILED(D3DXCreateTextureFromFileEx(d3ddev, fileName, 0, 0, 1, 0,
        D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, D3DX_FILTER_NONE, D3DX_DEFAULT,
        colorkey, &SrcInfo, NULL, &d3dTexture)))
    {
        return NULL;
    }


    return d3dTexture;
}

bool Init3D()
{

    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 = 960;
    d3dpp.BackBufferHeight = 600;


    d3d->CreateDevice(D3DADAPTER_DEFAULT,
        D3DDEVTYPE_HAL,
        hwnd,
        D3DCREATE_MIXED_VERTEXPROCESSING,
        &d3dpp,
        &d3ddev);

    GenerateQuad();
    v_buffer = NULL;

    d3ddev->CreateVertexBuffer(4 * sizeof(D3DVERTEX),
        0,
        CUSTOMFVF,
        D3DPOOL_MANAGED,
        &v_buffer,
        NULL);

    d3ddev->SetStreamSource(0, v_buffer, 0, sizeof(D3DVERTEX));



    d3ddev->SetRenderState(D3DRS_LIGHTING, FALSE);
    d3ddev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
    d3ddev->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
    d3ddev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
    d3ddev->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);



    Tex=LoadTexture(L"Tex.bmp");

    v_buffer->Lock(0, 0, (void**)&pVoid, 0);
    memcpy(pVoid, vertex, sizeof(vertex));
    v_buffer->Unlock();

    d3ddev->DrawPrimitive(D3DPT_TRIANGLEFAN, 0, 2);

    d3ddev->SetTexture(0, Tex);

    return TRUE;
}

DWORD renderf()
{
    d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(0xff, 0, 0, 0), 1.0f, 0);

    sqr.TLX += 1.0f;
    GenerateQuad();



    v_buffer->Lock(0, sizeof(vertex), (void**)&pVoid, D3DLOCK_NO_DIRTY_UPDATE);
    memcpy(pVoid, vertex, sizeof(vertex));
    v_buffer->Unlock();

    d3ddev->SetTexture(0, Tex);


    d3ddev->BeginScene();

    d3ddev->SetFVF(CUSTOMFVF);




    d3ddev->SetStreamSource(0, v_buffer, 0, sizeof(D3DVERTEX));


    d3ddev->DrawPrimitive(D3DPT_TRIANGLEFAN, 0, 2);

    d3ddev->EndScene();


    d3ddev->Present(NULL, NULL, NULL, NULL);

    return 0x0000;
}

加载纹理后,请检查纹理是否不等于NULL。您还应该检查d3ddevice对象和其他分配的资源是否不为NULL,因为如果它分配失败而您不检查,您将不知道它,直到您挠头想知道为什么某些东西没有呈现。

您检查过该Tex吗!=无效的加载图像文件时可能出错。是的,这似乎就是问题所在。调试文件时,Visual Studio Ultimate不会在EXE目录中搜索,而是在项目目录中搜索。非常感谢,我自己从来没有注意到。我把它作为一个答案贴了出来,这样我们就可以标记它已解决:)