游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3751|回复: 9

[D3D求助]为什么渲染了几遍纹理,只显示最后的一张,前

[复制链接]

58

主题

281

帖子

281

积分

中级会员

Rank: 3Rank: 3

积分
281
QQ
发表于 2004-1-25 22:04:00 | 显示全部楼层 |阅读模式
(初学者的问题,不要笑,不要笑)

g_pD3dDevice->BeginScene();

// 设定顶点,让纹理显示在屏幕左边,然后画……
SetVertex(............);
g_pD3dDevice->SetTexture( 0, g_pD3dTexture );
g_pD3dDevice->SetStreamSource( 0, g_pD3dVertexBuffer, 0, sizeof(CUSTOMVERTEX) );
g_pD3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP , 0, 2 );
// 设定顶点,让纹理显示在屏幕右边,然后再画
SetVertex(............);
g_pD3dDevice->SetTexture( 0, g_pD3dTexture );
g_pD3dDevice->SetStreamSource( 0, g_pD3dVertexBuffer, 0, sizeof(CUSTOMVERTEX) );
g_pD3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP , 0, 2 );

g_pD3dDevice->EndScene();
结果是不见左边,只见右边。请问该如何设置才能把两张同时渲染出来? [em10]

18

主题

573

帖子

573

积分

高级会员

Rank: 4

积分
573
发表于 2004-1-26 01:10:00 | 显示全部楼层

Re:[D3D求助]为什么渲染了几遍纹理,只显示最后的一张,

一个简单的方法:
先画左边的纹理,再将左边的顶点坐标平移到右边(可以用平移世界坐标),然后再画右边的纹理。你的错误在于用同两个纹理去画同一个顶点坐标,当然只能看到最后一次的结果,也就是右边的纹理。

58

主题

281

帖子

281

积分

中级会员

Rank: 3Rank: 3

积分
281
QQ
发表于 2004-1-26 08:53:00 | 显示全部楼层

Re:[D3D求助]为什么渲染了几遍纹理,只显示最后的一张,

哦,谢谢,也就是说,使用“同一个纹理”,“同一个顶点缓冲”,只能画一遍?

我的方法是建立顶点缓冲时用一个指针指向它的数据区,然后在画之前改变这个指针指向的值。

我看过一个例子,它是使用DrawPrimitiveUP的,不知是不是这个原因,它实现了。

改变世界矩阵使用起来没这个直接方便,还不知如何缩小放大?还有改变源坐标tu,tv怎么办?

58

主题

281

帖子

281

积分

中级会员

Rank: 3Rank: 3

积分
281
QQ
发表于 2004-1-26 16:13:00 | 显示全部楼层

Re:[D3D求助]为什么渲染了几遍纹理,只显示最后的一张,


行了!问题解决了。

更改顶点定义
#define D3DFVF_CUSTOMVERTEX ( D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1 )

#define D3DFVF_CUSTOMVERTEX ( D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1 )

不知为何,使用经转换的坐标就不行了,现在使用这个没问题。
struct CUSTOMVERTEX
{
    FLOAT                x, y, z;
    D3DCOLOR    color;
    FLOAT       tu, tv;
};

爽~现在只剩下中文字显示了。 [em3]

36

主题

1047

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
发表于 2004-1-29 03:27:00 | 显示全部楼层

Re:[D3D求助]为什么渲染了几遍纹理,只显示最后的一张,

最好不要在 render 时直接改变顶点坐标,因为这样效率要很低。应该用坐标转换,不过既然你说转换不起作用,那就使用不用的定点缓冲,毕竟占了一点空间要比低效率的绘画还划算得多。

58

主题

281

帖子

281

积分

中级会员

Rank: 3Rank: 3

积分
281
QQ
发表于 2004-1-29 09:18:00 | 显示全部楼层

Re:[D3D求助]为什么渲染了几遍纹理,只显示最后的一张,

为什么效率会低?
我不是每次改变顶点坐标都Lock啊,
在建立顶点缓冲的时候Lock了一次,让一个指针指向它的数据区,
以后直接操作这个指针来改变顶点的值。

18

主题

573

帖子

573

积分

高级会员

Rank: 4

积分
573
发表于 2004-1-29 21:07:00 | 显示全部楼层

Re:[D3D求助]为什么渲染了几遍纹理,只显示最后的一张,

每次修改定点效率太低,建议用矩阵实现平移等功能。

58

主题

281

帖子

281

积分

中级会员

Rank: 3Rank: 3

积分
281
QQ
发表于 2004-1-31 07:39:00 | 显示全部楼层

Re:[D3D求助]为什么渲染了几遍纹理,只显示最后的一张,

如果是3D,屏幕中可能会有数以万计的顶点,所以改变世界矩阵会划算些,
不过我是使用它来渲染2D,即使是TILE式地图,屏幕内最多也才一千来个顶点,
就算每一桢为它们赋值效率应该也不会太低,而且因为全部是四边形,只使用一个顶点缓冲就可以了,
相反,若要用到世界矩阵,是不是就必须长期保存大场景中一大块区域内的顶点?这样的话内存消耗也是不少啊!

36

主题

1047

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
发表于 2004-1-31 15:38:00 | 显示全部楼层

Re:[D3D求助]为什么渲染了几遍纹理,只显示最后的一张,

不少?能有多少?
顶点数据结构有多大,1000 个又有多大?
另外,MS 并没有允许在修改定点数据时不使用 lock ,具体可以看看 DX 文档。现在你只是简单应用,如果绘图复杂的话会出现很多问题。

如果是 2D 应用的话,可以考虑使用 DXSCRIPT.

58

主题

281

帖子

281

积分

中级会员

Rank: 3Rank: 3

积分
281
QQ
发表于 2004-2-1 10:26:00 | 显示全部楼层

Re:[D3D求助]为什么渲染了几遍纹理,只显示最后的一张,


如用改变世界矩阵实现滚屏,难道你不用兼顾到屏幕外的区域吗?有可能才1000多个顶点这么少吗?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-2-25 03:28

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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