游戏开发论坛

 找回密码
 立即注册
搜索
12
返回列表 发新帖
楼主: xiaoxiaolei

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

[复制链接]

2

主题

10

帖子

10

积分

新手上路

Rank: 1

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

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

上一楼的文件是  texQuad.cpp , 我标错 名了

//////////////////////////////////////////////////////////////////////////////////////////////////
//
// File: d3dUtility.cpp
//
// Author: Frank Luna (C) All Rights Reserved
//
// System: AMD Athlon 1800+ XP, 512 DDR, Geforce 3, Windows XP, MSVC++ 7.0
//
// Desc: Provides utility functions for simplifying common tasks.
//         
//////////////////////////////////////////////////////////////////////////////////////////////////

#include "d3dUtility.h"

bool d3d::InitD3D(
        HINSTANCE hInstance,
        int width, int height,
        bool windowed,
        D3DDEVTYPE deviceType,
        IDirect3DDevice9** device)
{
        //
        // Create the main application window.
        //

        WNDCLASS wc;

        wc.style         = CS_HREDRAW | CS_VREDRAW;
        wc.lpfnWndProc   = (WNDPROC)d3d::WndProc;
        wc.cbClsExtra    = 0;
        wc.cbWndExtra    = 0;
        wc.hInstance     = hInstance;
        wc.hIcon         = LoadIcon(0, IDI_APPLICATION);
        wc.hCursor       = LoadCursor(0, IDC_ARROW);
        wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
        wc.lpszMenuName  = 0;
        wc.lpszClassName = "Direct3D9App";

        if( !RegisterClass(&wc) )
        {
                ::MessageBox(0, "RegisterClass() - FAILED", 0, 0);
                return false;
        }
               
        HWND hwnd = 0;
        hwnd = ::CreateWindow("Direct3D9App", "Direct3D9App",
                WS_EX_TOPMOST,
                0, 0, width, height,
                0 /*parent hwnd*/, 0 /* menu */, hInstance, 0 /*extra*/);

        if( !hwnd )
        {
                ::MessageBox(0, "CreateWindow() - FAILED", 0, 0);
                return false;
        }

        ::ShowWindow(hwnd, SW_SHOW);
        ::UpdateWindow(hwnd);

        //
        // Init D3D:
        //

        HRESULT hr = 0;

        // Step 1: Create the IDirect3D9 object.

        IDirect3D9* d3d9 = 0;
    d3d9 = Direct3DCreate9(D3D_SDK_VERSION);

    if( !d3d9 )
        {
                ::MessageBox(0, "Direct3DCreate9() - FAILED", 0, 0);
                return false;
        }

        // Step 2: Check for hardware vp.

        D3DCAPS9 caps;
        d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT, deviceType, &caps);

        int vp = 0;
        if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
                vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
        else
                vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;

        // Step 3: Fill out the D3DPRESENT_PARAMETERS structure.

        D3DPRESENT_PARAMETERS d3dpp;
        d3dpp.BackBufferWidth            = width;
        d3dpp.BackBufferHeight           = height;
        d3dpp.BackBufferFormat           = D3DFMT_A8R8G8B8;
        d3dpp.BackBufferCount            = 1;
        d3dpp.MultiSampleType            = D3DMULTISAMPLE_NONE;
        d3dpp.MultiSampleQuality         = 0;
        d3dpp.SwapEffect                 = D3DSWAPEFFECT_DISCARD;
        d3dpp.hDeviceWindow              = hwnd;
        d3dpp.Windowed                   = windowed;
        d3dpp.EnableAutoDepthStencil     = true;
        d3dpp.AutoDepthStencilFormat     = D3DFMT_D24S8;
        d3dpp.Flags                      = 0;
        d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
        d3dpp.PresentationInterval       = D3DPRESENT_INTERVAL_IMMEDIATE;

        // Step 4: Create the device.

        hr = d3d9->CreateDevice(
                D3DADAPTER_DEFAULT, // primary adapter
                deviceType,         // device type
                hwnd,               // window associated with device
                vp,                 // vertex processing
            &d3dpp,             // present parameters
            device);            // return created device

        if( FAILED(hr) )
        {
                // try again using a 16-bit depth buffer
                d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
               
                hr = d3d9->CreateDevice(
                        D3DADAPTER_DEFAULT,
                        deviceType,
                        hwnd,
                        vp,
                        &d3dpp,
                        device);

                if( FAILED(hr) )
                {
                        d3d9->Release(); // done with d3d9 object
                        ::MessageBox(0, "CreateDevice() - FAILED", 0, 0);
                        return false;
                }
        }

        d3d9->Release(); // done with d3d9 object
       
        return true;
}

int d3d::EnterMsgLoop( bool (*ptr_display)(float timeDelta) )
{
        MSG msg;
        ::ZeroMemory(&msg, sizeof(MSG));

        static float lastTime = (float)timeGetTime();

        while(msg.message != WM_QUIT)
        {
                if(:eekMessage(&msg, 0, 0, 0, PM_REMOVE))
                {
                        ::TranslateMessage(&msg);
                        :ispatchMessage(&msg);
                }
                else
        {       
                        float currTime  = (float)timeGetTime();
                        float timeDelta = (currTime - lastTime)*0.001f;

                        ptr_display(timeDelta);

                        lastTime = currTime;
        }
    }
    return msg.wParam;
}

D3DLIGHT9 d3d::InitDirectionalLight(D3DXVECTOR3* direction, D3DXCOLOR* color)
{
        D3DLIGHT9 light;
        ::ZeroMemory(&light, sizeof(light));

        light.Type      = D3DLIGHT_DIRECTIONAL;
        light.Ambient   = *color * 0.4f;
        light.Diffuse   = *color;
        light.Specular  = *color * 0.6f;
        light.Direction = *direction;

        return light;
}

D3DLIGHT9 d3d::InitPointLight(D3DXVECTOR3* position, D3DXCOLOR* color)
{
        D3DLIGHT9 light;
        ::ZeroMemory(&light, sizeof(light));

        light.Type      = D3DLIGHT_POINT;
        light.Ambient   = *color * 0.4f;
        light.Diffuse   = *color;
        light.Specular  = *color * 0.6f;
        light.Position  = *position;
        light.Range        = 1000.0f;
        light.Falloff      = 1.0f;
        light.Attenuation0 = 1.0f;
        light.Attenuation1 = 0.0f;
        light.Attenuation2 = 0.0f;

        return light;
}

D3DLIGHT9 d3d::InitSpotLight(D3DXVECTOR3* position, D3DXVECTOR3* direction, D3DXCOLOR* color)
{
        D3DLIGHT9 light;
        ::ZeroMemory(&light, sizeof(light));

        light.Type      = D3DLIGHT_SPOT;
        light.Ambient   = *color * 0.4f;
        light.Diffuse   = *color;
        light.Specular  = *color * 0.6f;
        light.Position  = *position;
        light.Direction = *direction;
        light.Range        = 1000.0f;
        light.Falloff      = 1.0f;
        light.Attenuation0 = 1.0f;
        light.Attenuation1 = 0.0f;
        light.Attenuation2 = 0.0f;
        light.Theta        = 0.5f;
        light.Phi          = 0.7f;

        return light;
}

D3DMATERIAL9 d3d::InitMtrl(D3DXCOLOR a, D3DXCOLOR d, D3DXCOLOR s, D3DXCOLOR e, float p)
{
        D3DMATERIAL9 mtrl;
        mtrl.Ambient  = a;
        mtrl.Diffuse  = d;
        mtrl.Specular = s;
        mtrl.Emissive = e;
        mtrl.Power    = p;
        return mtrl;
}

代码全在这里了 ,
请再帮我看看吧, 谢谢了啊   
      


0

主题

10

帖子

10

积分

新手上路

Rank: 1

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

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

代码我没细看,我觉得可能是路径设置问题。你是用VS么?VS用#include""命令会弹出目录(也可能是VISUAL ASSIST功能)你按照那个目录设置一下就不会有问题。
如果还是不行你把工程发给我看下sin5571@sina.com

2

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
 楼主| 发表于 2010-2-23 01:02:00 | 显示全部楼层

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

谢谢 你  这么晚还解答我的问题

我还是没弄明白,
我把工程打包 发到你的邮箱了 麻烦帮忙看下

13

主题

312

帖子

312

积分

中级会员

Rank: 3Rank: 3

积分
312
发表于 2010-2-23 08:46:00 | 显示全部楼层

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

好!刚看到,研究一下 :>



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


欢迎访问开源图形处理器体系结构论坛(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)

7

主题

48

帖子

128

积分

注册会员

Rank: 2

积分
128
QQ
发表于 2010-2-25 11:21:00 | 显示全部楼层

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

hr = D3DXCreateTextureFromFile(
Device,
"E:\VS2008\Projects\TexQuad\dx5_logo.bmp",
&Tex);
改成
hr = D3DXCreateTextureFromFile(
Device,
"E:\\VS2008\\Projects\\TexQuad\\dx5_logo.bmp",
&Tex);

10

主题

55

帖子

55

积分

注册会员

Rank: 2

积分
55
发表于 2010-2-26 18:09:00 | 显示全部楼层

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

你不能通过编译的问题出现在“hr == D3DXERR_INVALIDDATA_OUTOFMEMORY”
你首先要知道一点,D3DXERR_**里没有D3DXERR_INVALIDDATA_OUTOFMEMORY这一项。我估计你是没看清楚帮助文档里的说明。D3DERR_NOTAVAILABLED3DERR_OUTOFVIDEOMEMORYD3DERR_INVALIDCALLD3DXERR_INVALIDDATAE_OUTOFMEMORY实际上是D3DERR_NOTAVAILABLE、D3DERR_OUTOFVIDEOMEMORY、D3DERR_INVALIDCALL、D3DXERR_INVALIDDATA、E_OUTOFMEMORY。

1

主题

79

帖子

97

积分

注册会员

Rank: 2

积分
97
发表于 2010-2-27 21:58:00 | 显示全部楼层

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

晕哦,画立方体,你才用6个顶点啊,不对啊,而且你用TRANGLETRIP用法也不对,你直接用TRIANGLELIST好了,6个面,一个面2个三角形,一共12个三角形。再用索引缓冲去做。一个三角形三个索引,索引数组的元素为36

1

主题

79

帖子

97

积分

注册会员

Rank: 2

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

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

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;
}

你的这个,其实只画了两个三角形,那可能就是你说的梯形了。

13

主题

312

帖子

312

积分

中级会员

Rank: 3Rank: 3

积分
312
发表于 2010-3-2 02:26:00 | 显示全部楼层

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

学习一下:>

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


欢迎访问开源图形处理器体系结构论坛(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)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-14 13:38

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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