Было 2 разных проблемы.
1: кажется, что необходимо обработать данные изображения перед загрузкой в текстуру. Я наткнулся на «предварительно умноженную альфу», которая, как мне кажется, необходима в моем случае. Вы в основном умножаете каждое значение RGB на альфа-значение. Я до сих пор не знаю, почему это должно быть так сложно, и вы не можете установить его напрямую в opengl:
private void PremultiplyAlpha(byte[] data)
{
for (int i = 0; i < data.Length; i += 4)
{
int alpha = data[i + 3]; // A
float factor = alpha > 0 ? 255f / alpha : 1f;
data[i] = (byte)(data[i] * factor); // R
data[i + 1] = (byte)(data[i + 1] * factor); // G
data[i + 2] = (byte)(data[i + 2] * factor); // B
}
}
…
byte[] data = GetPixelArray(bitmap);
PremultiplyAlpha(data);
GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, width, height, 0, OpenTK.Graphics.ES30.PixelFormat.Rgba, PixelType.UnsignedByte, data);
2: по-прежнему есть граница, когда текстура отображается в другом масштабе и использует mipmap. Мне пришлось изменить следующую настройку с NearestMipmapLinear на Nearest:
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMagFilter.Nearest);// (int)All.NearestMipmapLinear);
И я могу использовать следующую функцию наложения:
GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha);