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 = 0
、GreenBits = 0
、BlueBits = 0
和AlphaBits = ...
。这将相当于一个阿尔法值的数组,虽然GL会认为这些像素中的每一个都是红色分量,但这在这里无关紧要。
TL;DR:在少数地方,现代GL将单组件图像格式解释为红色这一事实甚至很重要。由于现在有足够多的管道是可编程的,所以让GL专门处理alpha图像格式是没有意义的。亮度也是如此,所有这些都可以通过着色器中的swizzle来实现。