C# пиксельный формат изображения только альфа
Что именно System.Drawing.Imaging.PixelFormat.Alpha представляет кого-либо? Похоже, это похоже на OpenGL.GL_APHA, который устарел.
Я пытаюсь преобразовать строку кода Java, которая выглядит следующим образом:
TextureData textureData = new TextureData(GL.GL_ALPHA, size, size, 0, GL.GL_ALPHA,
GL.GL_UNSIGNED_BYTE, false, false, false, textureBytes.rewind(), null);
к его представлению C#.
Я определил класс для инкапсуляции формата Pixel, чтобы я мог переключаться между DirectX и OpenGL следующим образом:
public class PixelFormat
{
public static readonly PixelFormat R8 = new PixelFormat(8, 0, DataType.UnsignedByte);
public static readonly PixelFormat R5G5B5A1 = new PixelFormat(5, 1, DataType.UnsignedShort);
public bool IsColorPremultipliedByAlpha { get; private set; }
public bool IsCompressed { get; private set; }
public int Format { get; set; }
public double Gamma { get; private set; }
public int BitsPerPixel { get { return NumberOfRedBits + NumberOfGreenBits + NumberOfBlueBits; }}
public ushort NumberOfRedBits { get; private set; }
public ushort NumberOfGreenBits { get; private set; }
public ushort NumberOfBlueBits { get; private set; }
public ushort NumberOfAlphaBits { get; private set; }
public int IndexIntoColorPallete { get; set; }
public bool IsIndexed { get; set; }
public DataType DataType { get; set; }
public IndexedColorFormat IndexedColorFormat { get; set; }
public OpenglPixelAttributes GetOpenglConstant()
{
return null;
}
}
Я хотел бы представить System.Drawing.Imaging.PixelFormat.Alpha или его двоюродного брата OpenGL, используя экземпляр моего класса PixelFormat.
Есть идеи?
1 ответ
GL_ALPHA
на самом деле просто сводится к однокомпонентной текстуре, где под единственным компонентом понимается альфа-канал. Если вы храните данные изображения в не устарелом внутреннем формате (например, GL_R8
), вы можете написать свой собственный Get
метод, который делает преобразование в RGBA (при условии, что вам это действительно нужно).
Дело в том, что я нигде не вижу в вашем предложенном PixelFormat
класс прямо сейчас, который фактически предоставляет внутреннее представление ваших данных. О самом близком, что этот код когда-либо имеет отсутствие GL_ALPHA
разница - это возможность запрашивать хранилище для каждого компонента.
Чтобы ответить на ваш оригинальный вопрос, GL_ALPHA
представляет это:
vec4 (0.0, 0.0, 0.0, alpha)
Если вы хотите использовать GL_R8
формат изображения для замены GL_ALPHA
Вы можете сделать это в шейдере:
vec4 (0.0, 0.0, 0.0, red)
Вы также можете легко сделать то же самое на стороне процессора, если вам когда-нибудь понадобится вернуть изображение RGBA из вашего альфа-пиксельного формата. В противном случае просто верните массив пикселей, где RedBits = 0
, GreenBits = 0
, BlueBits = 0
а также AlphaBits = ...
, Это будет массивом альфа-значений, и хотя GL будет рассматривать каждый из этих пикселей как компонент красного цвета, здесь это вряд ли имеет значение.
TL; DR: будет лишь несколько мест, где факт, что современный GL интерпретирует однокомпонентные форматы изображения как красный, имеет значение. Поскольку в настоящее время программируется достаточно конвейера, нет смысла специально обрабатывать GL-форматы альфа-изображений. То же самое относится и к яркости, все это может быть достигнуто с помощью шейдеров в шейдере.