2014-02-10 73 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來公開數據的內部表示? –