2014-02-10 71 views
0

究竟是什么System.Drawing.Imaging.PixelFormat.Alpha代表谁?看起来这与OpenGL.GL_APHA类似,这是折旧的。C#图像像素格式只

我想行的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#represenation。

我已经定义了一个类来封装象素格式,让我来回走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; 
     }  
    }  

我会想代表System.Drawing.Imaging.PixelFormat.Alpha或其OpenGL的表亲使用我的PixelFormat类的一个实例。

任何想法?

回答

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) 

你可以很容易地做同样的事情在CPU的一面,如果你需要从你的Alpha像素格式返回一个RGBA图像。否则,只是返回的像素,其中RedBits = 0GreenBits = 0BlueBits = 0AlphaBits = ...的数组。这将相当于一个alpha值的数组,而GL会将这些像素中的每一个都视为红色分量,这在这里几乎不重要。

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

+0

感谢您的精心回应。问题是这个JAVA SDK,http://worldwind.arc.nasa.gov/java/,我移植目前不使用着色器。另外,你如何建议我构造PixelFormat来公开数据的内部表示? –