游戏开发论坛

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

d3d 用lockrect lock住一幅dxt1的纹理后要如何读写

[复制链接]

10

主题

53

帖子

57

积分

注册会员

Rank: 2

积分
57
发表于 2008-10-17 17:32:00 | 显示全部楼层 |阅读模式
用lockrect lock dxt1的纹理要怎么读写,lock后的内存中的数据是什么格式的,最好能给我一个简单的示例

8

主题

67

帖子

81

积分

注册会员

Rank: 2

积分
81
发表于 2008-10-17 17:42:00 | 显示全部楼层

Re:d3d 用lockrect lock住一幅dxt1的纹理后要如何读写

印象中好像是一样的

10

主题

53

帖子

57

积分

注册会员

Rank: 2

积分
57
 楼主| 发表于 2008-10-17 22:26:00 | 显示全部楼层

Re:d3d 用lockrect lock住一幅dxt1的纹理后要如何读写

内存中的数据都是颜色值吗?

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2008-10-18 15:44:00 | 显示全部楼层

Re:d3d 用lockrect lock住一幅dxt1的纹理后要如何读写

不是颜色值,是压缩的dxt格式数据,需要自己解码

5

主题

686

帖子

697

积分

高级会员

Rank: 4

积分
697
QQ
发表于 2008-10-18 17:16:00 | 显示全部楼层

Re:d3d 用lockrect lock住一幅dxt1的纹理后要如何读写

我记得dxt是分4x4的小块压缩的,压缩后的数据保存有像素肩的差值,还有其他一些数据,sdk文档中的reference中有详细的说明,包括从dxt1到5的格式

10

主题

53

帖子

57

积分

注册会员

Rank: 2

积分
57
 楼主| 发表于 2008-10-20 22:09:00 | 显示全部楼层

Re: Re:d3d 用lockrect lock住一幅dxt1的纹理后要如何读写

qrli: Re:d3d 用lockrect lock住一幅dxt1的纹理后要如何读写

不是颜色值,是压缩的dxt格式数据,需要自己解码

怎么解码,能举个例子说明一下吗

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2008-10-21 17:11:00 | 显示全部楼层

Re: Re: Re:d3d 用lockrect lock住一幅dxt1的纹理后要如何读写

benbon: Re: Re:d3d 用lockrect lock住一幅dxt1的纹理后要如何读写


怎么解码,能举个例子说明一下吗

看dx sdk文档吧,很详细的,记得sample里也有个处理dxt的。 [em21]

10

主题

53

帖子

57

积分

注册会员

Rank: 2

积分
57
 楼主| 发表于 2008-10-21 21:35:00 | 显示全部楼层

Re: Re: Re: Re:d3d 用lockrect lock住一幅dxt1的纹理后要如何读写

qrli: Re: Re: Re:d3d 用lockrect lock住一幅dxt1的纹理后要如何读写


看dx sdk文档吧,很详细的,记得sample里也有个处理dxt的。 [em21]

能说一下是哪一个吗

1

主题

51

帖子

72

积分

注册会员

Rank: 2

积分
72
发表于 2008-10-23 09:36:00 | 显示全部楼层

Re: d3d 用lockrect lock住一幅dxt1的纹理后要如何读写

首先,明白DXT1压缩方法:将相邻的4x4的16个像素看成一组压缩,对于不足4x4的Mip层,则补足成为4x4压缩。这16个像素压缩成8个字节。前2个WORD是565格式的颜色信息,分别为color0和color1,另外连个颜色通过插值得到:
if(color0 > color1){
  color2 = (color0 * 2 + color1) / 3;
  color3 = (color0 + color1 * 2) / 3;
  color2.alpha = color3.alpha = 完全不透明;
}else{
  color2 = (color0 + color1) / 2;
  color2.alpha = 完全不透明;
  color3.color = any;
  color3.alpha = 完全透明;
}
后四个字节共32位,每2位表示一个索引,索引4x4共16个像素的颜色值是color0-color3中的那一个。
核心代码如下:
                                wColors[0] = __convert565_argb(pImage[0]);
                                wColors[1] = __convert565_argb(pImage[1]);
                                if(pImage[0] > pImage[1])
                                {
                                        wColors[2].r = (BYTE)(((DWORD)wColors[0].r * 2 + (DWORD)wColors[1].r) / 3);
                                        wColors[2].g = (BYTE)(((DWORD)wColors[0].g * 2 + (DWORD)wColors[1].g) / 3);
                                        wColors[2].b = (BYTE)(((DWORD)wColors[0].b * 2 + (DWORD)wColors[1].b) / 3);
                                        wColors[2].a = 0xFF;

                                        wColors[3].r = (BYTE)(((DWORD)wColors[0].r + (DWORD)wColors[1].r * 2) / 3);
                                        wColors[3].g = (BYTE)(((DWORD)wColors[0].g + (DWORD)wColors[1].g * 2) / 3);
                                        wColors[3].b = (BYTE)(((DWORD)wColors[0].b + (DWORD)wColors[1].b * 2) / 3);
                                        wColors[3].a = 0xFF;
                                }
                                else
                                {
                                        wColors[2].r = (BYTE)(((DWORD)wColors[0].r + (DWORD)wColors[1].r) / 2);
                                        wColors[2].g = (BYTE)(((DWORD)wColors[0].g + (DWORD)wColors[1].g) / 2);
                                        wColors[2].b = (BYTE)(((DWORD)wColors[0].b + (DWORD)wColors[1].b) / 2);
                                        wColors[2].a = 0xFF;

                                        wColors[3] = wColors[2];
                                        wColors[3].a = 0;
                                }

                                DWORD dwIndex = *(DWORD *)(pImage + 2);
                                pLine0[x+0] = wColors[dwIndex&0x3];
                                pLine0[x+1] = wColors[(dwIndex>>2)&0x3];
                                pLine0[x+2] = wColors[(dwIndex>>4)&0x3];
                                pLine0[x+3] = wColors[(dwIndex>>6)&0x3];

                                pLine1[x+0] = wColors[(dwIndex>>8)&0x3];
                                pLine1[x+1] = wColors[(dwIndex>>10)&0x3];
                                pLine1[x+2] = wColors[(dwIndex>>12)&0x3];
                                pLine1[x+3] = wColors[(dwIndex>>14)&0x3];

                                pLine2[x+0] = wColors[(dwIndex>>16)&0x3];
                                pLine2[x+1] = wColors[(dwIndex>>18)&0x3];
                                pLine2[x+2] = wColors[(dwIndex>>20)&0x3];
                                pLine2[x+3] = wColors[(dwIndex>>22)&0x3];

                                pLine3[x+0] = wColors[(dwIndex>>24)&0x3];
                                pLine3[x+1] = wColors[(dwIndex>>26)&0x3];
                                pLine3[x+2] = wColors[(dwIndex>>28)&0x3];
                                pLine3[x+3] = wColors[(dwIndex>>30)&0x3];

                                pImage += 4;

1

主题

51

帖子

72

积分

注册会员

Rank: 2

积分
72
发表于 2008-10-23 09:40:00 | 显示全部楼层

Re:d3d 用lockrect lock住一幅dxt1的纹理后要如何读写

另外,关于__convert565_argb的实现,建议建表查询。因为我看过N多代码,凡是通过乘除或移位得到的结果,最大值都是252,导致颜色偏暗,甚至在某些特殊的地方,显示结果或逻辑都出现错误。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-21 02:03

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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