十万火急:矩形的四个顶点的纹理坐标都设好了,为什么纹理还是贴不上去?

huangyr 2003-09-29 11:41:19
我在矩形顶点初始化的时候给每个顶点都指定了纹理坐标,代码如下:
CUSTOMVERTEX vertices[] =
{
{ 50.0f, 250.0f, 0.5f, 0xff00ffff, 0.0f,1.0f}, // x, y, z,color,tu,tv
{ 50.0f, 50.0f, 0.5f, 0xff00ffff, 0.0f,0.0f},
{ 250.0f, 250.0f, 0.5f, 0xff00ffff,1.0f,1.0f },
{ 250.0f, 50.0f, 0.5f, 0xff00ffff,1.0f,0.0f},
};
然后在render()中:
{......
m_pd3dDevice->SetTexture(0, m_pSeaFloorTexture);
m_pd3dDevice->SetStreamSource( 0, m_pRectVB, 0, sizeof(CUSTOMVERTEX) );
m_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
m_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );
.......
}
可是绘制出来是个蓝色的矩形,纹理没有帖上去。请问高手,还缺什么吗?请赐教!
...全文
110 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
mjm_d 2004-02-07
  • 打赏
  • 举报
回复
//////


//我也遇到过类似问题
首先解释一下rhw ,我的理解是该点已经进行过坐标转换的,在渲染时不在进行坐标变换

问题坐标不要大于1,否则要设置重复纹理次数,

你先试一试直接画线,开开能否绘出。
如果没有就是点点坐标有问题


m_pD3DDevice->DrawPrimitive( D3DPT_LINESTRIP, 0, 3 );
D3DPT_LINESTRIP

还有你是否在某处使用了m_pD3DDevice->reset()
复位后纹理是否也被恢复
还有如果你使用没有转换的点(没有RWH)一定要设置那三个矩阵尤其是project一定要将范围在DEBUG中设大一点,否则会被裁减

使用
//m_pD3DDevice->SetRenderState( D3DRS_LIGHTING, FALSE );
关闭光照看看
背景
clear时不要使用黑色



jimipeisun 2004-01-05
  • 打赏
  • 举报
回复
他第二次发的是改德代码的,纹理肯定创建了,应该没贴出来。
第一次发的代码肯定其他部分有问题。
jimipeisun 2004-01-05
  • 打赏
  • 举报
回复
你发的第一块代码不全,所发的部分没问题。
补发的帖子把它改为如下值:
CUSTOMVERTEX vertices[] =
{
{ 50.0f, 250.0f, 0.5f, 1.0f, 0xffffffff, 0.0f,10.0f}, // x, y, z, color
{ 50.0f, 50.0f, 0.5f,1.0f, 0xffffffff,0.0f,0.0f},
{ 250.0f, 250.0f, 0.5f,1.0f, 0xffffffff,10.0f,10.0f },
{ 250.0f, 50.0f, 0.5f,1.0f, 0xffffffff,10.0f,0.0f},
};
原因是,你的颜色为黑色,所以没有纹理,改文其他任何亮一点颜色。

qq:147829276
有机会的把第一部分完整代码发过来研究研究,看看问题出在何处?
chenzhiguo 2003-12-23
  • 打赏
  • 举报
回复
本人试了一下,确实是没有设置包装模式~~~~与其他的都无关..
另我看到楼主的没有创建纹理,有可能是忘了..
应该有这句才对.
D3DXCreateTextureFromFile(...);
封装模式可以设成这样:
m_pd3dDevice->SetTextureStageState(0,D3DTSS_ADDRESSU,D3DTADDRESS_WRAP);
另不要把四个顶点都设为黑色,这样显示不出来纹理,只会是一片黑..
bushhelen 2003-10-03
  • 打赏
  • 举报
回复
是不是因为纹理的长或宽不是2的N次方
finalvictory 2003-10-01
  • 打赏
  • 举报
回复
在你更了解这个之前不要去掉RHW!RHW=Reciprocal of Homogeneous W,什么意思楼上几位都说得很清楚!
如果你不使用RHW,那么就不用关心什么World、Perspective和Camera,先把这关过了再开始更复杂的探索才对。
如果不麻烦,建议你先用Sprite相关的接口试验一下这块Texture,没有问题了再试着自己贴。
sleepingboy 2003-10-01
  • 打赏
  • 举报
回复
是不是投影变换没有设置正确?
sleepingboy 2003-09-30
  • 打赏
  • 举报
回复
我一直都搞不懂那个rhw是干什么用的。

所以我是没有用它。
pzh508 2003-09-30
  • 打赏
  • 举报
回复
你把rhw去掉吧,应该就有纹理了
纹理坐标是在0到1的范围,故如果像你那样指定纹理坐标,所得的就是整块四方形的纹理
你也可以指定三角形的纹理,

像视口变换,投影变换都是对顶点的空间变换,即位置(最终是要变换到屏幕空间)
而纹理坐标描述的纹理上的一个像素点,因而视口变换,投影变换等对顶点坐标和纹理坐标的对应关系没有影响

xyzrhw格式告诉设备输入的顶点数据已经经过了顶点处理(包括顶点变换光照等也即是已经经过了T&L管道)如果你用xyz格式,要想它画出来,则必须进行顶点变换,也即是设置世界矩阵观察矩阵投影矩阵就可以了
huangyr 2003-09-30
  • 打赏
  • 举报
回复
对,正如楼上所说我有几个地方不明白:
1.我给矩形顶点指定了颜色,可并不好用,蓝色是我清空视图选用的颜色,不明白为什么?
2.纹理坐标的定义范围是0到1,那我给四个顶点的纹理坐标就指定为 (0.0f,1.0f),(1.0f,1.0f),(0.0f,0.0f),(1.0f,0.0f)是不就可以了
3.视口变换,投影变换等对顶点坐标和纹理坐标的对应关系有影响吗?
4.我如果不用xyzrhw格式,光用xyz格式,这个矩形就画不出来了,就是在窗口上不见了,为什么?
请高手赐教!
铜戈 2003-09-30
  • 打赏
  • 举报
回复
好像没什么问题, 把贴图创建代码也铁一下, 看看是不是贴图创建失败, pRectTexture为NULL导致贴图没有铁出来.

另外你第一次给出的代码中颜色不是蓝色, 可是绘制出来的是蓝色的矩形, 看看是不是贴图本身就是这样的, 会不会是10.f 导致贴图重复10次贴在很小的多边形中看不出来细节, 看上去是蓝色的一片 ^o^

rhw 是变换过的顶点, 这个标志告诉d3d不要将顶点数据作变换(不乘世界矩阵, 视矩阵, 投影矩阵)
比如界面这种东西就可以使用rhw来画
铜戈 2003-09-30
  • 打赏
  • 举报
回复
用不用rhw 和纹理没有关系, 用rhw也应该能够显示纹理.

蓝色是用来清视口的颜色???? 那你是怎么看出你画的矩形的? 他不也是蓝色吗?晕~~~

另外纹理坐标也不是0 - 1. 是可以大于1的, 如果没设置过包裹模式, 应该就是重复模式, 也就是贴图在U向和V向上重复10遍
sleepingboy 2003-09-29
  • 打赏
  • 举报
回复
2.m_pd3dDevice->SetStreamSource( 0, m_pRectVB, 0, sizeof(CUSTOMVERTEX) );
3.m_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
4.m_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );
1.m_pd3dDevice->SetTexture(0, m_pSeaFloorTexture);

把顺序改动以下试试
huangyr 2003-09-29
  • 打赏
  • 举报
回复
我是在SDK的DolphinVS的例子基础上改的,只改了几个地方,如下所示:
顶点定义:
struct CUSTOMVERTEX
{
FLOAT x, y, z,rhw; // The transformed position for the vertex
DWORD color; // The vertex color
FLOAT tu, tv;
};
const DWORD D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE|D3DFVF_TEX1);

InitDeviceObjects(){....
CUSTOMVERTEX vertices[] =
{
{ 50.0f, 250.0f, 0.5f, 1.0f, 0xff000000, 0.0f,10.0f}, // x, y, z, color
{ 50.0f, 50.0f, 0.5f,1.0f, 0xff000000,0.0f,0.0f},
{ 250.0f, 250.0f, 0.5f,1.0f, 0xff000000,10.0f,10.0f },
{ 250.0f, 50.0f, 0.5f,1.0f, 0xff000000,10.0f,0.0f},
};
if( FAILED( m_pd3dDevice->CreateVertexBuffer( 4*sizeof(CUSTOMVERTEX),
0, D3DFVF_CUSTOMVERTEX,
D3DPOOL_DEFAULT, &m_pRectVB, NULL ) ) )
{
return E_FAIL;
}
VOID* pVertices;
if( FAILED( m_pRectVB->Lock( 0, sizeof(vertices), (void**)&pVertices, 0 ) ) )
return E_FAIL;
memcpy( pVertices, vertices, sizeof(vertices) );
m_pRectVB->Unlock();
。。。。
}
Render(){。。。。
m_pd3dDevice->SetTexture(0, m_pRectTexture);
m_pd3dDevice->SetStreamSource( 0, m_pRectVB, 0, sizeof(CUSTOMVERTEX) );
m_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
m_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );
。。。。
}
代码都在这里了,烦楼上帮忙!!小女子感激不尽!
pzh508 2003-09-29
  • 打赏
  • 举报
回复
把完整的代码贴上来,我帮你看看
(要不,你先去掉顶点颜色,只要纹理,再试试看)
huangyr 2003-09-29
  • 打赏
  • 举报
回复
我的D3DFVF_CUSTOMVERTEX结构里有D3DFVF_TEX1 一项,纹理也创建成功了,我在别的地方试过了。还需要什么吗?而且我把SDK的TUTORIALS中的讲TEXTURE的那篇中的圆柱体换成了我的矩形后,也是没贴上纹理,哎,各位高手帮帮忙阿!
pzh508 2003-09-29
  • 打赏
  • 举报
回复
还或者可能纹理创建失败
pzh508 2003-09-29
  • 打赏
  • 举报
回复
和顺序没有关系的,先render那一句都一样
楼主,看看你的D3DFVF_CUSTOMVERTEX 结构里有没有加上D3DFVF_TEX1

8,303

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧