我们有一些旧设备不支持非花盆纹理,我们有一个功能可将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/