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表兄。
任何想法?
答案 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 = 0
,GreenBits = 0
,BlueBits = 0
和AlphaBits = ...
的像素数组。这将相当于一组alpha值,而GL会将这些像素中的每一个视为红色组件,这在这里几乎不重要。
TL; DR :现代GL将单分量图像格式解释为红色的事实只会少数几个。由于现在足够的管道是可编程的,所以GL具有特殊的GL处理alpha图像格式是没有意义的。亮度也是如此,所有这一切都可以通过着色器中的混合来实现。