[求助]gamecube用s3tc dxt1贴图相关

  • a
    aaaa007cn
    自己写了一个dds转换为bmp的程序
    转换photoshop + nvidia dds plug-in另存的no alpha dxt1的dds成功
    转换从gamecube里面导出的dds就不行,花了
    难道和le、be有关?
    或者ati用的dxt1和nvidia不同?
    求专业人士指点[m]253[/m]
  • 精钢魔像
    dx sdk 自带互相转化的工具
  • a
    aaaa007cn
    我需要的是转换的方法,不是现成的工具
    再说那些dds不论用photoshop还是woody\'s texture viewer查看都是花的,我不觉得用directx texture editor会正常
    好吧,其实是dx sdk太大了,不太想拖[m]025[/m]
  • 精钢魔像
    摆弄d3d 肯定要dx sdk 的,求人不如求己
  • H
    HyperIris
    GC的s3tc 导出成dds后,如果dds本身能看,那就不是dds的问题,nv的插件问题很多。

    而且dds目前似乎只有x86实现,只有be。

    如果要搞gc汉化,s3tc解码有现成的算法,直接存成bmp即可。
  • H
    HyperIris
    我帮你看看吧

    明天的,我先rip一下iso :awkward:

    或者你把原文件贴在这里一个

    [本帖最后由 HyperIris 于 2007-10-2 13:39 编辑]
  • a
    aaaa007cn
    我纱布了,没有仔细看那个文档:awkward:
    果然gamecube的dxt1和dx的dxt1有一些区别:awkward:
    dx的那种4x4的块直接按照从左到右,从上到下排列就行
    gamecube的是要把4x4的块先按照
    0 1
    2 3
    排列成8x8的块,再从左到右,从上到下排列
    另外4x4格子里面,左右顺序也要颠倒一下。。。

    样本。。。
  • H
    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数据了
  • a
    aaaa007cn
    对的,这就是把gamecube的s3tc转换成标准s3tc:awkward:
    好吧,我直接转成了32bit bmp了:awkward:

    现在颜色插值还有点问题,转出来的图有不少狗牙
    http://en.wikipedia.org/wiki/S3TC
    没问题了,严格按照这个来处理,转出来的图正常了

    [本帖最后由 aaaa007cn 于 2007-10-2 16:44 编辑]