游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2519|回复: 5

【新手问题】D3D7纹理绘制失败(简单代码)

[复制链接]

2

主题

6

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2008-3-3 11:58:00 | 显示全部楼层 |阅读模式
大体思路:
从一个制定大小的video surface创建一个3d设备。
创建顶点缓冲
beginsence
设置纹理
drawpolygon
endsence

简单代码 如下:(去掉了错误处理,我保证所有这些接口都是成功 创建了的)

  1. typedef struct
  2. {
  3.         float x, y, z;  // 2D coordinates
  4.         float rhw;      // rhw
  5.         float u, v;     // texture coordinates
  6. } VERTEX;

  7. #define VERTEX_FVF   (D3DFVF_XYZRHW | D3DFVF_TEX1)

  8. VOID Render()
  9. {
  10.         if (NULL == g_pD3D ||
  11.                 NULL == g_pD3DDevice ||
  12.                 NULL == g_pDDrawScrSurface ||
  13.                 NULL == g_pDDrawWinSurface ||
  14.                 NULL == g_pDDrawTexSurface)
  15.         {
  16.                 return;
  17.         }

  18.         RECT rect;
  19.         ::GetClientRect(g_hWnd, &rect);
  20.         if (rect.left == rect.right &&
  21.                 rect.top  == rect.bottom &&
  22.                 rect.left == rect.top &&
  23.                 rect.top  == 0)
  24.         {
  25.                 return;
  26.         }
  27.        
  28.         VERTEX verts[] = {
  29.                 { (float)rect.left,  (float)rect.top,    0.0f, 1.0f, 0.0f, 0.0f },
  30.                 { (float)rect.left,  (float)rect.right,  0.0f, 1.0f, 1.0f, 0.0f },
  31.                 { (float)rect.left,  (float)rect.bottom, 0.0f, 1.0f, 0.0f, 1.0f },
  32.                 { (float)rect.right, (float)rect.bottom, 0.0f, 1.0f, 1.0f, 1.0f }
  33.         };

  34.         LPDIRECT3DVERTEXBUFFER7 pVertexBuffer;
  35.         D3DVERTEXBUFFERDESC vbd;
  36.         vbd.dwSize = sizeof(vbd);
  37.         vbd.dwCaps = D3DVBCAPS_SYSTEMMEMORY;
  38.         vbd.dwFVF = VERTEX_FVF;
  39.         vbd.dwNumVertices = 4;
  40.         g_pD3D->CreateVertexBuffer(&vbd, &pVertexBuffer, 0);
  41.         BYTE *pBuff = NULL;
  42.         DWORD dwBuffSize = 0;
  43.         pVertexBuffer->Lock(DDLOCK_WAIT, (void**)&pBuff, &dwBuffSize);
  44.         memcpy(pBuff, verts, sizeof(verts));
  45.         pVertexBuffer->Unlock();
  46.         g_pD3DDevice->BeginScene();       
  47.         g_pD3DDevice->SetTexture(0, g_pDDrawTexSurface);       
  48.         g_pD3DDevice->DrawPrimitiveVB(D3DPT_TRIANGLELIST, pVertexBuffer, 0, 4, D3DDP_WAIT);       
  49.         g_pD3DDevice->EndScene();
  50.         SafeRelase(pVertexBuffer);

  51.         ::ClientToScreen(g_hWnd, (LPPOINT)&rect);
  52.         ::ClientToScreen(g_hWnd, (LPPOINT)&rect+1);
  53.         g_pDDrawScrSurface->Blt(&rect, g_pDDrawWinSurface, NULL, 0, 0);
  54. }
复制代码


附件是完整的工程文件vc6

sf_200833115827.rar

3.53 KB, 下载次数:

11

主题

650

帖子

651

积分

高级会员

Rank: 4

积分
651
发表于 2008-3-3 19:30:00 | 显示全部楼层

Re:【新手问题】D3D7纹理绘制失败(简单代码)

问个无关的  D3D7?

4

主题

49

帖子

49

积分

注册会员

Rank: 2

积分
49
发表于 2008-3-3 19:40:00 | 显示全部楼层

Re:【新手问题】D3D7纹理绘制失败(简单代码)

切换一下窗口好象就行了,是不是绘制函数放在WM_PAINT:下的问题,
还有
VERTEX verts[] = {
{ (float)rect.left,  (float)rect.top,    0.0f, 1.0f, 0.0f, 0.0f },
{ (float)rect.left,  (float)rect.right,  0.0f, 1.0f, 1.0f, 0.0f }, //不知道这一点的坐标对不对
{ (float)rect.left,  (float)rect.bottom, 0.0f, 1.0f, 0.0f, 1.0f },
{ (float)rect.right, (float)rect.bottom, 0.0f, 1.0f, 1.0f, 1.0f }
};

2

主题

6

帖子

6

积分

新手上路

Rank: 1

积分
6
 楼主| 发表于 2008-3-4 09:44:00 | 显示全部楼层

Re: Re:【新手问题】D3D7纹理绘制失败(简单代码)

kp_ns: Re:【新手问题】D3D7纹理绘制失败(简单代码)

切换一下窗口好象就行了,是不是绘制函数放在WM_PAINT:下的问题,
还有
VERTEX verts[] = {
{ (float)rect...


谢谢提示!
还是粗心了,呵呵
现在能够渲染图形了。但是不知道何故,纹理还是渲染不上去。

比如象下面的代码只能绘制出漫反射的颜色,纹理并不能绘制上去。还 请指教!


  1. typedef struct
  2. {
  3.         float x, y, z;  // 2D coordinates
  4.         float rhw;      // rhw
  5.         DWORD c;
  6.         float u, v;     // texture coordinates
  7. } VERTEX;


  8. #define VERTEX_FVF   (D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1)

  9.         float ltx, lty, rtx, rty, lbx, lby, rbx, rby;
  10.         ltx = (float)rect.left;
  11.         lty = (float)rect.top;
  12.         rtx = (float)rect.right;
  13.         rty = (float)rect.top;
  14.         lbx = (float)rect.left;
  15.         lby = (float)rect.bottom;
  16.         rbx = (float)rect.right;
  17.         rby = (float)rect.bottom;

  18.         VERTEX verts[] = {
  19.                 { ltx,  lty,    0.0f, 0.0f, 0xff0000ff, 0.0f, 0.0f },
  20.                 { rtx,  rty,    0.0f, 0.0f, 0xffff0000, 1.0f, 0.0f },
  21.                 { rbx,  rby,    0.0f, 0.0f, 0xff00ff00, 1.0f, 1.0f },
  22.                 { ltx,  lty,    0.0f, 0.0f, 0xff0000ff, 0.0f, 0.0f },
  23.                 { rbx,  rby,    0.0f, 0.0f, 0xff00ff00, 1.0f, 1.0f },
  24.                 { lbx,  lby,    0.0f, 0.0f, 0xff000000, 0.0f, 1.0f }
  25.         };

  26.         g_pD3DDevice->BeginScene();       
  27.         g_pD3DDevice->SetTexture(0, g_pDDrawTexSurface);       
  28.         HRESULT hr = g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, VERTEX_FVF, verts, 6, D3DDP_WAIT);
  29.         g_pD3DDevice->EndScene();

  30.         ::ClientToScreen(g_hWnd, (LPPOINT)&rect);
  31.         ::ClientToScreen(g_hWnd, (LPPOINT)&rect+1);
  32.         g_pDDrawScrSurface->Blt(&rect, g_pDDrawWinSurface, NULL, 0, 0);
复制代码


但是如果吧最后一句blt的页面换成纹理页面,又可以渲染到主页面 上。也就是说纹理值是正确的 。

简单vc6工程:


sf_20083494348.rar

3.47 KB, 下载次数:

4

主题

49

帖子

49

积分

注册会员

Rank: 2

积分
49
发表于 2008-3-4 20:55:00 | 显示全部楼层

Re:【新手问题】D3D7纹理绘制失败(简单代码)

创建纹理表面时的属性改一下就行了
ddsd2.ddsCaps.dwCaps = DDSCAPS_TEXTURE; // DDSCAPS_SYSTEMMEMORY |
我也不知道为什么,可能纹理必须建立在显寸里吧.

不知道楼主为什么还用DX7,太复杂了,我现在觉得OpenGL挺好用的,正在学,呵呵.以前也用的DX7,后面版本只是大概了解了下.

2

主题

6

帖子

6

积分

新手上路

Rank: 1

积分
6
 楼主| 发表于 2008-3-5 15:48:00 | 显示全部楼层

Re: Re:【新手问题】D3D7纹理绘制失败(简单代码)

kp_ns: Re:【新手问题】D3D7纹理绘制失败(简单代码)

创建纹理表面时的属性改一下就行了
ddsd2.ddsCaps.dwCaps = DDSCAPS_TEXTURE; // DDSCAPS_SYSTEMMEMORY | ...


恩 ,解决了。
纹理不能创建在系统内存,呵呵,学习了。

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

本版积分规则

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

GMT+8, 2025-12-20 07:45

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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