OpenGL ES 2.0 / MonoTouch: текстура окрашена в красный цвет - PullRequest
2 голосов
/ 02 ноября 2011

В настоящее время я загружаю куб-карту в свое приложение, но оно отображается красным тоном. Редактировать: Проблема с каналом также присутствует при использовании 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;
}

Я думаю, что каналы инвертированы, но, возможно, есть способ инвертировать растровое изображение без какого-либо специального кода.

Это изображение, которое отображается (игнорируйте причудливую модель перед ним):

Image rendered

И ожидаемое изображение: Image expected

Edit:

Исправлена ​​проблема 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);
}

Ответы [ 4 ]

2 голосов
/ 21 февраля 2012

Проблема в вашей функции CreateARGBBitmapContext the line

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

Если вы измените

CGImageAlphaInfo.PremultipliedFirst 

до

CGImageAlphaInfo.PremultipliedLast 

это должно исправить ваш код.

1 голос
/ 10 ноября 2011

После некоторого тестирования я решил использовать код из "XnaTouch" для загрузки текстур, это решает проблему с красной текстурой.

Конечно, это еще не конец, потому что не было альфаканал при загрузке png изображений.Поскольку это неприемлемо и отнимает много времени, я решил написать загрузчик dds (на основе кода из http://humus.name/).

0 голосов
/ 11 ноября 2011

Я вижу, что вы используете RGBA для обеих настроек во время шага TexImage2D. Судя по тому, как синий ваше исходное изображение и как красный ваше полученное изображение, я предлагаю заменить один из них на BGRA.

0 голосов
/ 06 ноября 2011

Использовали ли вы программу (с glUseProgram) перед использованием glUniform? Потому что это не работает и в этом случае сгенерирует эту ошибку.

Вы также можете проверить причины этой ошибки GL на справочной странице glUniform (в конце).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...