仅alpha的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;
}      
}    

我想使用PixelFormat类的实例来表示System.Drawing.Imaging.PixelFormat.Alpha或它的OpenGL表亲。

有什么想法吗?

GL_ALPHA实际上可以归结为单个组件纹理,其中单个组件表示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)

如果您需要从Alpha像素格式返回RGBA图像,您可以在CPU端轻松地做同样的事情。否则,只返回一个像素阵列,其中RedBits = 0GreenBits = 0BlueBits = 0AlphaBits = ...。这将相当于一个阿尔法值的数组,虽然GL会认为这些像素中的每一个都是红色分量,但这在这里无关紧要。

TL;DR:在少数地方,现代GL将单组件图像格式解释为红色这一事实甚至很重要。由于现在有足够多的管道是可编程的,所以让GL专门处理alpha图像格式是没有意义的。亮度也是如此,所有这些都可以通过着色器中的swizzle来实现。