2011-11-02 79 views
2

我目前正在將一個立方體貼圖加載到我的應用程序中,但它顯示爲紅色。 編輯:使用2D紋理時,通道問題也存在,看起來通道的順序不正確。有什麼方法可以使用iOS方法更改頻道的順序?OpenGL ES 2.0/MonoTouch:紋理是彩色的紅色

這對紋理加載代碼:

public TextureCube (Generic3DView device, UIImage right, UIImage left, UIImage top, UIImage bottom, UIImage front, UIImage back) 
    : base(device) 
{ 
    _Device = device; 
    GL.GenTextures (1, ref _Handle); 
    GL.BindTexture (TextureType, _Handle); 
    LoadTexture(All.TextureCubeMapPositiveX, right); 
    LoadTexture(All.TextureCubeMapNegativeX, left); 
    LoadTexture(All.TextureCubeMapPositiveY, top); 
    LoadTexture(All.TextureCubeMapNegativeY, bottom); 
    LoadTexture(All.TextureCubeMapPositiveZ, front); 
    LoadTexture(All.TextureCubeMapNegativeZ, back); 

    GL.TexParameter(All.TextureCubeMap, All.TextureMinFilter, (Int32)All.LinearMipmapLinear); 
    GL.TexParameter(All.TextureCubeMap, All.TextureMagFilter, (Int32)All.Linear); 
    GL.GenerateMipmap(All.TextureCubeMap); 
} 

private void LoadTexture(All usage, UIImage image) 
{ 
    GL.TexImage2D(usage, 0, (Int32)All.Rgba, (Int32)image.Size.Width, 
        (Int32)image.Size.Height, 0, All.Rgba, All.UnsignedByte, RequestImagePixelData(image)); 
} 

protected CGBitmapContext CreateARGBBitmapContext (CGImage inImage) 
{ 
    var pixelsWide = inImage.Width; 
    var pixelsHigh = inImage.Height; 
    var bitmapBytesPerRow = pixelsWide * 4; 
    var bitmapByteCount = bitmapBytesPerRow * pixelsHigh; 
    //Note implicit colorSpace.Dispose() 
    using (var colorSpace = CGColorSpace.CreateDeviceRGB()) { 
     //Allocate the bitmap and create context 
     var bitmapData = Marshal.AllocHGlobal (bitmapByteCount); 
     if (bitmapData == IntPtr.Zero) { 
      throw new Exception ("Memory not allocated."); 
     } 

     var context = new CGBitmapContext (bitmapData, pixelsWide, pixelsHigh, 8, 
          bitmapBytesPerRow, colorSpace, CGImageAlphaInfo.PremultipliedFirst); 
     if (context == null) { 
       throw new Exception ("Context not created"); 
     } 
     return context; 
    } 
} 

//Store pixel data as an ARGB Bitmap 
protected IntPtr RequestImagePixelData (UIImage inImage) 
{ 
    var imageSize = inImage.Size; 
    CGBitmapContext ctxt = CreateARGBBitmapContext (inImage.CGImage); 
    var rect = new RectangleF (0.0f, 0.0f, imageSize.Width, imageSize.Height); 
    ctxt.DrawImage (rect, inImage.CGImage); 
    var data = ctxt.Data; 
    return data; 
} 

我認爲信道被反轉,但也許有一種方法反轉位圖沒有一些自定義代碼。

這是被描繪的圖像(忽略在它前面的花式模型):

Image rendered

和預期的圖像: Image expected

編輯:

的GL_INVALID_OPERATION問題已得到解決,但它不能解決紅色紋理問題。

頂點着色器:

attribute vec3 position;    
uniform mat4 modelViewMatrix;   

varying mediump vec3 texture;   

void main() 
{ 
    texture = position.xyz;   
    gl_Position = modelViewMatrix * vec4(position.xyz, 1.0);  
} 

片段着色器:

varying mediump vec3 texture; 
uniform samplerCube cubeMap;   

void main() 
{ 
    mediump vec3 cube = vec3(textureCube(cubeMap, texture)); 
    gl_FragColor = vec4(cube.xyz, 1.0); 
} 
+0

你可以發佈你正在得到的圖片和你期望得到的圖片嗎? – NickLH

+0

我上傳了兩張圖片。 –

+0

什麼代碼正在繪製圖片? – Dani

回答

2

的問題是你的函數CreateARGBBitmapContext行

var context = new CGBitmapContext (bitmapData, pixelsWide, pixelsHigh, 8, bitmapBytesPerRow, colorSpace, CGImageAlphaInfo.PremultipliedFirst); 

如果更改

CGImageAlphaInfo.PremultipliedFirst 

CGImageAlphaInfo.PremultipliedLast 

應該解決您的代碼。

+0

我會在可能的時候測試它。當它工作時,我會給你答案的獎勵。 –

0

你使用計劃(glUseProgram)使用glUniform過嗎?因爲在這種情況下它不起作用並會產生錯誤。

您還可以檢查glUniform man page(最後)中導致GL錯誤的原因。

+0

事實證明,我們在這裏有兩個錯誤,但你帶我去解決第一個問題(GL_INVALID_OPERATION)。我在繪圖代碼中添加了另一個'GL.GetUniformLocation',並且注意到位置已經改變(不要問我爲什麼,當着色器完全鏈接時我得到位置)。紅色紋理的問題仍然存在。 –

1

經過一番測試,我決定使用「XnaTouch」的代碼來加載紋理,這解決了紅色紋理的問題。

當然,這還沒有結束,因爲加載png圖像時一直沒有alpha通道。因爲這是不可接受的,並且消耗了很多時間,我決定編寫一個dds加載器(基於http://humus.name/的代碼)。

0

我看到您在TexImage2D步驟中正在使用RGBA進行這兩種設置。根據你的原始圖像以及你的最終圖像如何紅色來判斷,我建議將其中一個換成BGRA。