0

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# 表示。

我已经定义了一个类来封装像素格式,以允许我在 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 表亲。

任何人的想法?

4

1 回答 1

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 = 0、和。这相当于一组 alpha 值,虽然 GL 会认为这些像素中的每一个都是红色分量,但这在这里几乎不重要。GreenBits = 0BlueBits = 0AlphaBits = ...

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

于 2014-02-10T23:21:05.677 回答