我们有一些旧设备不支持非花盆纹理,我们有一个功能可将ARGB纹理转换为2纹理的下一个幂。问题是它的运行速度很慢,我们想知道是否有更好的方法来转换这些纹理。

void PotTexture()
{
    size_t u2 = 1; while (u2 < imageData.width) u2 *= 2;
    size_t v2 = 1; while (v2 < imageData.height) v2 *= 2;

    std::vector<unsigned char> pottedImageData;
    pottedImageData.resize(u2 * v2 * 4);

    size_t y, x, c;
    for (y = 0; y < imageData.height; y++)
    {
        for (x = 0; x < imageData.width; x++)
        {
            for (c = 0; c < 4; c++)
            {
                pottedImageData[4 * u2 * y + 4 * x + c] = imageData.convertedData[4 * imageData.width * y + 4 * x + c];
            }
        }
    }

    imageData.width = u2;
    imageData.height = v2;
    std::swap(imageData.convertedData, pottedImageData);
}


在某些设备上,这可以轻松使用100%的CPU,因此任何优化都将是惊人的。我可以查看执行此转换的任何现有功能吗?

编辑:

我对上述循环进行了一些优化:

for (y = 0; y < imageData.height; y++)
{
    memcpy(
        &(pottedImageData[y * u2 * 4]),
        &(imageData.convertedData[y * imageData.width * 4]),
        imageData.width * 4);
}

最佳答案

即使不支持NPOT纹理的设备也应支持NPOT负载。

使用glTexImage2D将纹理创建为2的精确幂且无内容,并为数据传递空指针。


  data可以是空指针。在这种情况下,分配纹理内存以容纳宽度width和高度height的纹理。然后,您可以下载子纹理以初始化此纹理内存。如果用户尝试将纹理图像的未初始化部分应用于图元,则该图像未定义。


然后使用glTexSubImage2D上传NPOT图像,该图像仅占整个纹理的一部分。无需重新配置CPU端图像即可完成此操作。

关于c++ - 将ARGB纹理转换为2纹理的下一个幂的快速方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26041633/

10-15 15:05