游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3733|回复: 14

请教问题:关于纹理坐标。

[复制链接]

106

主题

743

帖子

745

积分

高级会员

Rank: 4

积分
745
QQ
发表于 2006-8-4 22:24:00 | 显示全部楼层 |阅读模式
两个三角行组成的矩形,四个顶点的纹理坐标分别是:
        nczzdz2[0].wl=D3DXVECTOR2(0.0f,1.0f);
        nczzdz2[1].wl=D3DXVECTOR2(1.0f,1.0f);
        nczzdz2[2].wl=D3DXVECTOR2(1.0f,0.0f);
        nczzdz2[3].wl=D3DXVECTOR2(0.0f,0.0f);

纹理是100*100的正方形。

应该是纹理覆盖这个矩形,但是,结果:只有矩形的上方约1/4被填充了纹理。

0

主题

1037

帖子

1037

积分

金牌会员

Rank: 6Rank: 6

积分
1037
发表于 2006-8-4 23:02:00 | 显示全部楼层

Re:请教问题:关于纹理坐标。

楼主的程序都能编译了吗?
这个会不会跟Z缓存有关呢?你关闭Z缓存试试?

106

主题

743

帖子

745

积分

高级会员

Rank: 4

积分
745
QQ
 楼主| 发表于 2006-8-4 23:17:00 | 显示全部楼层

Re:请教问题:关于纹理坐标。

这个程序可以编译。
关闭Z缓存是注释掉下面两行么?也没有用啊。还真想不通,这是啥毛病。
        d3dpp.EnableAutoDepthStencil = TRUE;
        d3dpp.AutoDepthStencilFormat = D3DFMT_D16

0

主题

1037

帖子

1037

积分

金牌会员

Rank: 6Rank: 6

积分
1037
发表于 2006-8-4 23:29:00 | 显示全部楼层

Re:请教问题:关于纹理坐标。

楼主用d3d的框架啊。那个我不太懂。
不过用m_pd3dDevice->SetRenderState(D3DRS_ZENABLE, false);也可以关闭Z缓存。
可不可以看见矩形的全部边框呢,如果可以,与Z缓存无关。

106

主题

743

帖子

745

积分

高级会员

Rank: 4

积分
745
QQ
 楼主| 发表于 2006-8-4 23:40:00 | 显示全部楼层

Re:请教问题:关于纹理坐标。

用m_pd3dDevice->SetRenderState(D3DRS_ZENABLE, false);这个也没有用。

可以看见矩形,上面约1/4是纹理和颜色相加,下面就是矩形的颜色,应该是整个矩形都是纹理和颜色相加才对。

5

主题

686

帖子

697

积分

高级会员

Rank: 4

积分
697
QQ
发表于 2006-8-5 10:44:00 | 显示全部楼层

Re:请教问题:关于纹理坐标。

用固定管线的话请检查数据流成员顺序POSITION-NORMAL-TEXCOORD
用Shader同样检查Declaration和数据的对应

把主要的代码贴出来会好一点吧。。。光贴这几句根本看不出来的

30

主题

357

帖子

388

积分

中级会员

Rank: 3Rank: 3

积分
388
QQ
发表于 2006-8-5 16:37:00 | 显示全部楼层

Re:请教问题:关于纹理坐标。

绘制的索引顺序对了没?自定义顶点类型的成员是按什么顺序定义的?这个顺序很重要,因为顶点流无法判断你定义类型中成员的顺序,所以你要按照他的规矩来。可以看看D3DFVF_系列的宏定义,在d3dxtypes.h里,是按从低到高的顺序。

106

主题

743

帖子

745

积分

高级会员

Rank: 4

积分
745
QQ
 楼主| 发表于 2006-8-5 19:56:00 | 显示全部楼层

Re:请教问题:关于纹理坐标。

顺序:坐标,法线向量,纹理坐标。

顶点元素:x=坐标,y=法线向量,wl=纹理。
        nczzdz2[0].x=D3DXVECTOR3(-2.0f,0.0f,-2.0f);// -2 0 -2
        nczzdz2[1].x=D3DXVECTOR3(2.0f,0.0f,-2.0f);//   2 0 -2
        nczzdz2[2].x=D3DXVECTOR3(2.0f,0.0f,2.0f);//    2 0  2
        nczzdz2[3].x=D3DXVECTOR3(-2.0f,0.0f,2.0f);//  -2 0  2

        nczzdz2[0].y=D3DXVECTOR3(0.0f,1.0f,1.0f);
        nczzdz2[1].y=D3DXVECTOR3(0.0f,1.0f,1.0f);
        nczzdz2[2].y=D3DXVECTOR3(0.0f,1.0f,1.0f);
        nczzdz2[3].y=D3DXVECTOR3(0.0f,1.0f,1.0f);

        nczzdz2[0].wl=D3DXVECTOR2(0.0f,1.0f);
        nczzdz2[1].wl=D3DXVECTOR2(1.0f,1.0f);
        nczzdz2[2].wl=D3DXVECTOR2(1.0f,0.0f);
        nczzdz2[3].wl=D3DXVECTOR2(0.0f,0.0f);

索引:0,1,2,0,2,3,

指令:
        char xrzl[]="vs_2_0 \n                dcl_position v0 \n                dcl_normal v1 \n                dcl_texcoord0 v2                def c4,0.9f,0.9f,0.9f,0.0f \n                def c5,0.5f,0.7f,0.2f,0.0f                m4x4 oPos,v0,c0 \n                dp3 r1,v1,c5                mul r2,r1,c4                mul oD0,r2,c6                mov oT0.xy,v2";


        char xszl[]="ps_2_0 \n                def c1,0.9f,0.5f,0.3f,0.0f \n                dcl_2d s0                dcl v0 \n                dcl t0                texld r0,t0,s0                add r0,r0,v0                mov oC0,r0";

创建纹理:        dxsbzz->CreateTexture(100,100,1,0,D3DFMT_A8R8G8B8,D3DPOOL_MANAGED,&wldxzz,0);
对于这个函数的 参数3 的意义不明, 参数6 必须设置为系统调度才能显示纹理。
如果要设置为显存,参数3是不是要设成其他值才能显示纹理?

关联纹理层:dxsbzz->SetTexture( 0, wldxzz );

填充纹理:
D3DLOCKED_RECT lsxx;
        wldxzz->LockRect( 0,&lsxx,0,0);
byte *wlncdz=(byte *)lsxx.pBits;//纹理内存地址。
        for(int i=1;i<10000;i=i+4)
        {
        wlncdz[i+1]=255;
        }
        wldxzz->UnlockRect(0);




5

主题

686

帖子

697

积分

高级会员

Rank: 4

积分
697
QQ
发表于 2006-8-5 22:45:00 | 显示全部楼层

Re:请教问题:关于纹理坐标。

你填充纹理的代码……你只写了一个通道,一个像素要占4字节
另外你都没有考虑Pitch……每行要跳过一些缓冲字节的

106

主题

743

帖子

745

积分

高级会员

Rank: 4

积分
745
QQ
 楼主| 发表于 2006-8-5 23:34:00 | 显示全部楼层

Re:请教问题:关于纹理坐标。

⒈四个全添结果一样。
⒉不理解,要跳过多少缓冲字节?
⒊要不要看看完整的代码。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-25 02:31

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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