仅限alpha的C#图像像素格式

时间:2014-02-10 22:40:00

标签: c# opengl directx alpha-transparency image-formats

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表兄。

任何想法?

1 个答案:

答案 0 :(得分:1)

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 = ...的像素数组。这将相当于一组alpha值,而GL会将这些像素中的每一个视为红色组件,这在这里几乎不重要。

TL; DR :现代GL将单分量图像格式解释为红色的事实只会少数几个。由于现在足够的管道是可编程的,所以GL具有特殊的GL处理alpha图像格式是没有意义的。亮度也是如此,所有这一切都可以通过着色器中的混合来实现。