[求助]gamecube用s3tc dxt1贴图相关
- aaaa007cn自己写了一个dds转换为bmp的程序
转换photoshop + nvidia dds plug-in另存的no alpha dxt1的dds成功
转换从gamecube里面导出的dds就不行,花了
难道和le、be有关?
或者ati用的dxt1和nvidia不同?
求专业人士指点[m]253[/m] - 精钢魔像dx sdk 自带互相转化的工具
- aaaa007cn我需要的是转换的方法,不是现成的工具
再说那些dds不论用photoshop还是woody\'s texture viewer查看都是花的,我不觉得用directx texture editor会正常
好吧,其实是dx sdk太大了,不太想拖[m]025[/m] - 精钢魔像摆弄d3d 肯定要dx sdk 的,求人不如求己
- HyperIrisGC的s3tc 导出成dds后,如果dds本身能看,那就不是dds的问题,nv的插件问题很多。
而且dds目前似乎只有x86实现,只有be。
如果要搞gc汉化,s3tc解码有现成的算法,直接存成bmp即可。 - HyperIris我帮你看看吧
明天的,我先rip一下iso :awkward:
或者你把原文件贴在这里一个
[本帖最后由 HyperIris 于 2007-10-2 13:39 编辑] - aaaa007cn我纱布了,没有仔细看那个文档:awkward:
果然gamecube的dxt1和dx的dxt1有一些区别:awkward:
dx的那种4x4的块直接按照从左到右,从上到下排列就行
gamecube的是要把4x4的块先按照
0 1
2 3
排列成8x8的块,再从左到右,从上到下排列
另外4x4格子里面,左右顺序也要颠倒一下。。。
样本。。。 - HyperIris参考以下算法
inline void toWORD(u16& w)
{
u8 w1 = w & 0xff;
u8 w2 = w >> 8;
w = (w1 << 8) | w2;
}
void s3tc1ReverseByte(u8& b)
{
u8 b1 = b & 0x3;
u8 b2 = b & 0xc;
u8 b3 = b & 0x30;
u8 b4 = b & 0xc0;
b = (b1 << 6) | (b2 << 2) | (b3 >> 2) | (b4 >> 6);
}
void fixS3TC1(u8* dest, const u8* src, int w, int h)
{
int s = 0;
for(int y = 0; y < h/4; y += 2)
for(int x = 0; x < w/4; x += 2)
for(int dy = 0; dy < 2; ++dy)
for(int dx = 0; dx < 2; ++dx, s += 8)
if(x + dx < w && y + dy < h)
memcpy(&dest[8*((y + dy)*w/4 + x + dx)], &src, 8);
for(int k = 0; k < w*h/2; k += 8)
{
toWORD(*(u16*)&dest[k]);
toWORD(*(u16*)&dest[k+2]);
s3tc1ReverseByte(dest[k+4]);
s3tc1ReverseByte(dest[k+5]);
s3tc1ReverseByte(dest[k+6]);
s3tc1ReverseByte(dest[k+7]);
}
}
如果我没记错的话,出来就是rgb数据了 - aaaa007cn对的,这就是把gamecube的s3tc转换成标准s3tc:awkward:
好吧,我直接转成了32bit bmp了:awkward:
现在颜色插值还有点问题,转出来的图有不少狗牙
http://en.wikipedia.org/wiki/S3TC
没问题了,严格按照这个来处理,转出来的图正常了
[本帖最后由 aaaa007cn 于 2007-10-2 16:44 编辑]