游戏开发论坛

 找回密码
 立即注册
搜索
查看: 6434|回复: 18

d3d纹理映射的功能无法实现, 请大家帮忙解决下, 谢谢

[复制链接]

2

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2010-2-16 23:34:00 | 显示全部楼层 |阅读模式
d3d纹理映射的功能无法实现, 请大家帮忙解决下, 谢谢

我用vs2008 编译directx9 游戏开发编程基础 书上的纹理映射的例程,
始终不能成功映射,而且 一个立方体几何体显示成了梯形,
我看了下代码, 好像是正确的 , 纹理图片是jpg格式的, 而且路径也没问题
请问大家有没用过这本书, 知道这是什么原因吗 ,

0

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2010-2-17 13:38:00 | 显示全部楼层

Re: d3d纹理映射的功能无法实现, 请大家帮忙解决下, 谢谢

没有相关代码 无法帮你

2

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
 楼主| 发表于 2010-2-18 16:34:00 | 显示全部楼层

Re:d3d纹理映射的功能无法实现, 请大家帮忙解决下, 谢谢

不好意思, 我现在贴上代码   

#include "d3dUtility.h"

//
// Globals
//

IDirect3DDevice9*     Device = 0;

const int Width  = 640;
const int Height = 480;

IDirect3DVertexBuffer9* Quad = 0;
IDirect3DTexture9*      Tex  = 0;

//
// Classes and Structures
//

struct Vertex
{
        Vertex(){}
        Vertex(
                float x, float y, float z,
                float nx, float ny, float nz,
                float u, float v)
        {
                _x  = x;  _y  = y;  _z  = z;
                _nx = nx; _ny = ny; _nz = nz;
                _u  = u;  _v  = v;
        }
        float _x, _y, _z;
        float _nx, _ny, _nz;
        float _u, _v; // texture coordinates

        static const DWORD FVF;
};
const DWORD Vertex::FVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1;

//
// Framework Functions
//
bool Setup()
{
        //
        // Create the quad vertex buffer and fill it with the
        // quad geoemtry.
        //

        Device->CreateVertexBuffer(
                6 * sizeof(Vertex),
                D3DUSAGE_WRITEONLY,
                Vertex::FVF,
                D3DPOOL_MANAGED,
                &Quad,
                0);

        Vertex* v;
        Quad->Lock(0, 0, (void**)&v, 0);

        // quad built from two triangles, note texture coordinates:
        v[0] = Vertex(-1.0f, -1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f);
        v[1] = Vertex(-1.0f,  1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f);
        v[2] = Vertex( 1.0f,  1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f);

        v[3] = Vertex(-1.0f, -1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f);
        v[4] = Vertex( 1.0f,  1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f);
        v[5] = Vertex( 1.0f, -1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f);

        Quad->Unlock();

        //
        // Create the texture and set filters.
        //

        D3DXCreateTextureFromFile(
                Device,
                "dx5_logo.bmp",
                &Tex);

        Device->SetTexture(0, Tex);

        Device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
        Device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
        Device->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);

        //
        // Don't use lighting for this sample.
        //
        Device->SetRenderState(D3DRS_LIGHTING, false);

        //
        // Set the projection matrix.
        //

        D3DXMATRIX proj;
        D3DXMatrixPerspectiveFovLH(
                &proj,
                D3DX_PI * 0.5f, // 90 - degree
                (float)Width / (float)Height,
                1.0f,
                1000.0f);
        Device->SetTransform(D3DTS_PROJECTION, &proj);

        return true;
}

void Cleanup()
{
        d3d::Release<IDirect3DVertexBuffer9*>(Quad);
        d3d::Release<IDirect3DTexture9*>(Tex);
}

bool Display(float timeDelta)
{
        if( Device )
        {
                Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffffffff, 1.0f, 0);
                Device->BeginScene();

                Device->SetStreamSource(0, Quad, 0, sizeof(Vertex));
                Device->SetFVF(Vertex::FVF);
                Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);

                Device->EndScene();
                Device-&gtresent(0, 0, 0, 0);
        }
        return true;
}


//
// WndProc
//
LRESULT CALLBACK d3d::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
        switch( msg )
        {
        case WM_DESTROY:
                :ostQuitMessage(0);
                break;

        case WM_KEYDOWN:
                if( wParam == VK_ESCAPE )
                        :estroyWindow(hwnd);
                break;
        }
        return ::DefWindowProc(hwnd, msg, wParam, lParam);
}

//
// WinMain
//
int WINAPI WinMain(HINSTANCE hinstance,
                   HINSTANCE prevInstance,
                   PSTR cmdLine,
                   int showCmd)
{
        if(!d3d::InitD3D(hinstance,
                Width, Height, true, D3DDEVTYPE_HAL, &Device))
        {
                ::MessageBox(0, "InitD3D() - FAILED", 0, 0);
                return 0;
        }

        if(!Setup())
        {
                ::MessageBox(0, "Setup() - FAILED", 0, 0);
                return 0;
        }

        d3d::EnterMsgLoop( Display );

        Cleanup();

        Device->Release();

        return 0;
}

请大家帮忙看下

0

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2010-2-20 00:10:00 | 显示全部楼层

Re:d3d纹理映射的功能无法实现, 请大家帮忙解决下, 谢谢

你说纹理图片是JPG格式的,但你伪码中载入的图片是BMP格式的,你看看

2

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
 楼主| 发表于 2010-2-20 22:18:00 | 显示全部楼层

Re:d3d纹理映射的功能无法实现, 请大家帮忙解决下, 谢谢

代码里的确是加载的bmp图片, jpg的是另一个例子里的纹理图片,
这是d3d红龙书上的代码, 书上所有的例程, 只要涉及到纹理,都无法成功映射,
其他的光照, alpha计算的 都可以 运行,

真不知道这是什么原因 , 我将纹理图片放在工程目录下的   

0

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2010-2-21 00:05:00 | 显示全部楼层

Re:d3d纹理映射的功能无法实现, 请大家帮忙解决下, 谢谢

我运行的源码都没问题,你看看D3DXCreateTextureFromFile这个函数的返回值是S_OK么?

2

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
 楼主| 发表于 2010-2-21 22:08:00 | 显示全部楼层

Re: Re:d3d纹理映射的功能无法实现, 请大家帮忙解决下,

sin5571: Re:d3d纹理映射的功能无法实现, 请大家帮忙解决下, 谢谢

我运行的源码都没问题,你看看D3DXCreateTextureFromFile这个函数的返回值是S_OK么?


真的很感谢你!!!

我运行时,D3DXCreateTextureFromFile() 返回不是(S_OK / D3D_OK),

我的环境运行其他的材质, 光照, alpha都没问题, 就是纹理无法运行,
下面是我在msdn上复制的关于D3DXCreateTextureFromFile() 的返回值说明
Return Values

If the function succeeds, the return value is D3D_OK. If the function fails, the return value can be one of the following:

D3DERR_NOTAVAILABLED3DERR_OUTOFVIDEOMEMORYD3DERR_INVALIDCALLD3DXERR_INVALIDDATAE_OUTOFMEMORY
上面前3个我都试过了, 不是其中任何以个, 第4的“D3DXERR_INVALIDDATAE_OUTOFMEMORY” 编译无法通过, 我把D3DXERR改成D3DERR 也无法通过编译


是不是D3D9 的纹理必须硬件支持的, 我的是集成显卡,
或者是我的纹理图片放错目录了, 我用绝对路径也试过了“E:\VS2008\Projects\TexQuad\dx5_logo.bmp”,
那么 应该放在哪个目录下呢 ?
弄了很久了 , 快急死了   

麻烦再帮忙看看吧, 谢谢 你了  

13

主题

312

帖子

312

积分

中级会员

Rank: 3Rank: 3

积分
312
发表于 2010-2-22 00:12:00 | 显示全部楼层

Re: d3d纹理映射的功能无法实现, 请大家帮忙解决下, 谢谢

xiaoxiaolei: d3d纹理映射的功能无法实现, 请大家帮忙解决下, 谢谢

d3d纹理映射的功能无法实现, 请大家帮忙解决下, 谢谢

我用vs2008 编译directx9 游戏开发编程基础 书...




代码呢???

:>

-------------------------------------------------------------------------------------------


欢迎访问开源图形处理器体系结构论坛(OpenGPU论坛) http://www.opengpu.org/bbs/

OpenGPU Graphics Open Source community(图形开源社区),聚焦领域(focus domain)包括:
  * GPU Architecture(图形处理器体系结构)
  * Graphics Algorithm(图形算法)
  * Open Source Rendering Engine(开源渲染器)
  * Open Source GPU Simulator/RTL Implement(开源GPU模拟器)
  * Mobile GPU Developing (移动图形设备的开发)
  * GPGPU Programming (面向通用的图形处理器编程)
                      (包括CUDA/OpenCL /DirectCompute)

2

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
 楼主| 发表于 2010-2-22 21:17:00 | 显示全部楼层

Re:d3d纹理映射的功能无法实现, 请大家帮忙解决下, 谢谢

代码我贴下,
//****************d3dUtility.h
#ifndef __d3dUtilityH__
#define __d3dUtilityH__

#include <d3dx9.h>
#include <string>

namespace d3d
{
        bool InitD3D(
                HINSTANCE hInstance,       // [in] Application instance.
                int width, int height,     // [in] Backbuffer dimensions.
                bool windowed,             // [in] Windowed (true)or full screen (false).
                D3DDEVTYPE deviceType,     // [in] HAL or REF
                IDirect3DDevice9** device);// [out]The created device.

        int EnterMsgLoop(
                bool (*ptr_display)(float timeDelta));

        LRESULT CALLBACK WndProc(
                HWND hwnd,
                UINT msg,
                WPARAM wParam,
                LPARAM lParam);

        template<class T> void Release(T t)
        {
                if( t )
                {
                        t->Release();
                        t = 0;
                }
        }
               
        template<class T> void Delete(T t)
        {
                if( t )
                {
                        delete t;
                        t = 0;
                }
        }

        const D3DXCOLOR      WHITE( D3DCOLOR_XRGB(255, 255, 255) );
        const D3DXCOLOR      BLACK( D3DCOLOR_XRGB(  0,   0,   0) );
        const D3DXCOLOR        RED( D3DCOLOR_XRGB(255,   0,   0) );
        const D3DXCOLOR      GREEN( D3DCOLOR_XRGB(  0, 255,   0) );
        const D3DXCOLOR       BLUE( D3DCOLOR_XRGB(  0,   0, 255) );
        const D3DXCOLOR     YELLOW( D3DCOLOR_XRGB(255, 255,   0) );
        const D3DXCOLOR       CYAN( D3DCOLOR_XRGB(  0, 255, 255) );
        const D3DXCOLOR    MAGENTA( D3DCOLOR_XRGB(255,   0, 255) );

        //
        // Lights
        //

        D3DLIGHT9 InitDirectionalLight(D3DXVECTOR3* direction, D3DXCOLOR* color);
        D3DLIGHT9 InitPointLight(D3DXVECTOR3* position, D3DXCOLOR* color);
        D3DLIGHT9 InitSpotLight(D3DXVECTOR3* position, D3DXVECTOR3* direction, D3DXCOLOR* color);

        //
        // Materials
        //

        D3DMATERIAL9 InitMtrl(D3DXCOLOR a, D3DXCOLOR d, D3DXCOLOR s, D3DXCOLOR e, float p);

        const D3DMATERIAL9 WHITE_MTRL  = InitMtrl(WHITE, WHITE, WHITE, BLACK, 2.0f);
        const D3DMATERIAL9 RED_MTRL    = InitMtrl(RED, RED, RED, BLACK, 2.0f);
        const D3DMATERIAL9 GREEN_MTRL  = InitMtrl(GREEN, GREEN, GREEN, BLACK, 2.0f);
        const D3DMATERIAL9 BLUE_MTRL   = InitMtrl(BLUE, BLUE, BLUE, BLACK, 2.0f);
        const D3DMATERIAL9 YELLOW_MTRL = InitMtrl(YELLOW, YELLOW, YELLOW, BLACK, 2.0f);
}

#endif // __d3dUtilityH__

2

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
 楼主| 发表于 2010-2-22 21:18:00 | 显示全部楼层

Re:d3d纹理映射的功能无法实现, 请大家帮忙解决下, 谢谢

//**********d3dUtility.cpp

#include "d3dUtility.h"

//
// Globals
//

IDirect3DDevice9*     Device = 0;

const int Width  = 640;
const int Height = 480;

IDirect3DVertexBuffer9* Quad = 0;
IDirect3DTexture9*      Tex  = 0;

//
// Classes and Structures
//

struct Vertex
{
        Vertex(){}
        Vertex(
                float x, float y, float z,
                float nx, float ny, float nz,
                float u, float v)
        {
                _x  = x;  _y  = y;  _z  = z;
                _nx = nx; _ny = ny; _nz = nz;
                _u  = u;  _v  = v;
        }
        float _x, _y, _z;
        float _nx, _ny, _nz;
        float _u, _v; // texture coordinates

        static const DWORD FVF;
};
const DWORD Vertex::FVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1;

//
// Framework Functions
//
bool Setup()
{
        //
        // Create the quad vertex buffer and fill it with the
        // quad geoemtry.
        //

        Device->CreateVertexBuffer(
                6 * sizeof(Vertex),
                D3DUSAGE_WRITEONLY,
                Vertex::FVF,
                D3DPOOL_MANAGED,
                &Quad,
                0);

        Vertex* v;
        Quad->Lock(0, 0, (void**)&v, 0);

        // quad built from two triangles, note texture coordinates:
        v[0] = Vertex(-1.0f, -1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f);
        v[1] = Vertex(-1.0f,  1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f);
        v[2] = Vertex( 1.0f,  1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f);

        v[3] = Vertex(-1.0f, -1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f);
        v[4] = Vertex( 1.0f,  1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f);
        v[5] = Vertex( 1.0f, -1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f);

        Quad->Unlock();

        //
        // Create the texture and set filters.
        //
    HRESULT hr = 0;
        hr = D3DXCreateTextureFromFile(
                Device,
                "E:\VS2008\Projects\TexQuad\dx5_logo.bmp",
                &Tex);
    if(hr == D3D_OK)
        {
                ::MessageBox(0, "CreateTexture return D3D_OK", 0, 0);
        }
        else if(hr == D3DERR_NOTAVAILABLE)
                ::MessageBox(0, "CreateTexture return D3DERR_NOTAVAILABLE", 0, 0);
        else if(hr == D3DERR_OUTOFVIDEOMEMORY)
                ::MessageBox(0, "CreateTexture return D3DERR_OUTOFVIDEOMEMORY", 0,0);
        else if(hr == D3DERR_INVALIDCALL)
                ::MessageBox(0, "CreateTexture return D3DERR_INVALIDCALL", 0, 0);
        else if(hr == D3DXERR_INVALIDDATA_OUTOFMEMORY)
                ;
        else
                ::MessageBox(0, "Unknown FAILED", 0, 0);

        Device->SetTexture(0, Tex);

        Device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
        Device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
        Device->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);

        //
        // Don't use lighting for this sample.
        //
        Device->SetRenderState(D3DRS_LIGHTING, false);

        //
        // Set the projection matrix.
        //

        D3DXMATRIX proj;
        D3DXMatrixPerspectiveFovLH(
                &proj,
                D3DX_PI * 0.5f, // 90 - degree
                (float)Width / (float)Height,
                1.0f,
                1000.0f);
        Device->SetTransform(D3DTS_PROJECTION, &proj);

        return true;
}

void Cleanup()
{
        d3d::Release<IDirect3DVertexBuffer9*>(Quad);
        d3d::Release<IDirect3DTexture9*>(Tex);
}

bool Display(float timeDelta)
{
        if( Device )
        {
                Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffffffff, 1.0f, 0);
                Device->BeginScene();

                Device->SetStreamSource(0, Quad, 0, sizeof(Vertex));
                Device->SetFVF(Vertex::FVF);
                Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);

                Device->EndScene();
                Device-&gtresent(0, 0, 0, 0);
        }
        return true;
}


//
// WndProc
//
LRESULT CALLBACK d3d::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
        switch( msg )
        {
        case WM_DESTROY:
                :ostQuitMessage(0);
                break;

        case WM_KEYDOWN:
                if( wParam == VK_ESCAPE )
                        :estroyWindow(hwnd);
                break;
        }
        return ::DefWindowProc(hwnd, msg, wParam, lParam);
}

//
// WinMain
//
int WINAPI WinMain(HINSTANCE hinstance,
                   HINSTANCE prevInstance,
                   PSTR cmdLine,
                   int showCmd)
{
        if(!d3d::InitD3D(hinstance,
                Width, Height, true, D3DDEVTYPE_REF, &Device))
        {
                ::MessageBox(0, "InitD3D() - FAILED", 0, 0);
                return 0;
        }

        if(!Setup())
        {
                ::MessageBox(0, "Setup() - FAILED", 0, 0);
                return 0;
        }

        d3d::EnterMsgLoop( Display );

        Cleanup();

        Device->Release();

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

本版积分规则

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

GMT+8, 2025-6-12 18:11

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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