OpenGL ES 2.0 / MonoTouch:纹理呈红色

我正在将一个立方体贴图加载到我的应用程序中,但显示为红色。 编辑:使用2D纹理时,通道问题也存在,看起来通道的顺序不正确。 有没有办法改变使用iOS方法的渠道的顺序?

这是纹理加载的代码:

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; } 

我认为这些通道是倒置的,但也许有一种方法可以在不使用某些自定义代码的情况下反转位图。

这是呈现的图像(忽略它前面的幻想模型):

图像呈现

和预期的形象: 预期的图像

编辑:

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); } 

问题是你的函数CreateARGBBitmapContext的行

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

如果你改变

 CGImageAlphaInfo.PremultipliedFirst 

 CGImageAlphaInfo.PremultipliedLast 

应该修复你的代码。

经过一些testing,我决定使用“XnaTouch”的代码来加载纹理,这解决了红色纹理的问题。

当然这还没有结束,因为加载PNG图像时一直没有alpha通道。 因为这是不可接受的,并消耗了很多时间,我决定写一个dds加载器(基于http://humus.name/的代码)。

在使用glUniform之前,您是否使用过程序(使用glUseProgram)? 因为在这种情况下它不起作用并会产生错误。

您还可以检查glUniform手册页 (最后)中导致GL错误的原因。

我发现在TexImage2D步骤中,您正在使用RGBA进行两种设置。 根据你的原始图像多么 ,以及你的结果图像是多么 ,我build议将其中一个换成BGRA。