映射到VGA调色板的颜色错误

时间:2012-09-07 23:46:19

标签: graphics dos vga

我正在学习旧的DOS编程,特别是直接控制VGA。我也是这样做以重新学习并在C中变得更好。

无论如何,我写了一个小程序,加载PCX文件并显示它。我使用的是来自DooM的cacodemon,带有原始的DooM调色板。像素数据似乎是正确的,以及调色板的RGB值(我做了所有256 rgb三元组的printf,它们与我正在使用的编辑器匹配)。但是,当我显示调色板时,存在明显的差异,图像的颜色会失真。

原始图像和调色板:

http://i.imgur.com/7lM5R.png

我的输出(数字是调色板值,并且是正确的):

http://i.imgur.com/MJTUE.png

这是调色板加载代码

void setPalette(unsigned char * newPalette)
{
    int x, y = 0;
    //SET PALETTE MEMORY
    for (x = 0; x <= 255; x++)
    {
        outp(PALETTE_MASK, 0xFF); //Can access whole palette
        outp(PALETTE_REGISTER_WR, x); //Set index
        outp(PALETTE_DATA,newPalette[y]); //Write R value
        outp(PALETTE_DATA,newPalette[y+1]); //Write G value
        outp(PALETTE_DATA,newPalette[y+2]); //Write B value

        printf("%d, %d, %d\n", newPalette[y], newPalette[y+1], newPalette[y+2]);

        y += 3;


        //getch();
   }
}

1 个答案:

答案 0 :(得分:1)

我明白了。因为VGA只存储64级R,G和&amp; B,你需要将每个值右移两次。