2014-02-09 4 views
1

Я отображение растрового изображения
enter image description here из детские в 800х600 еще при визуализации: image with unwanted triangleПочему цвет изображения рендеринга треугольника?

У меня есть класс окна, наследуемый GameWindow и вот переопределенная метода, которые (по моему мнению) является релевантными:

protected override void OnLoad(EventArgs e) { 
    base.OnLoad(e); 

    GrafxUtils.InitTexturing(); 
    textureId = GrafxUtils.CreateTextureFromBitmap((Bitmap)currentImage); 

    OnResize(null); 
    GL.ClearColor(Color.Gray); 

} 

protected override void OnRenderFrame(FrameEventArgs e) { 
    base.OnRenderFrame(e); 

    GL.Clear(ClearBufferMask.ColorBufferBit); 
    GL.MatrixMode(MatrixMode.Texture); 
    GL.LoadIdentity(); 
    GL.BindTexture(TextureTarget.Texture2D, textureId); 
    GL.Begin(PrimitiveType.Quads); 

    // top-left 
    GL.TexCoord2(0, 0); 
    GL.Vertex2(0, 0); 

    // top-right 
    GL.TexCoord2(1, 0); 
    GL.Vertex2(currentImage.Width, 0); 

    // bottom-left 
    GL.TexCoord2(0, 1); 
    GL.Vertex2(0, currentImage.Height); 

    // bottom-right 
    GL.TexCoord2(1, 1); 
    GL.Vertex2(currentImage.Width, currentImage.Height); 

    GL.End(); 

    SwapBuffers(); 
} 

... и метод CreateTextureFromBitmap:

// utility method from GrafxUtils 
public static int CreateTextureFromBitmap(Bitmap bitmap) { 
    BitmapData data = bitmap.LockBits(
     new Rectangle(0, 0, bitmap.Width, bitmap.Height), 
     ImageLockMode.ReadOnly, 
     System.Drawing.Imaging.PixelFormat.Format32bppArgb); 
    var tex = GetBoundTexture(); 
    GL.BindTexture(TextureTarget.Texture2D, tex); 
    GL.TexImage2D(
     TextureTarget.Texture2D, 
     0, 
     PixelInternalFormat.Rgba, 
     data.Width, data.Height, 
     0, 
     OpenTK.Graphics.OpenGL.PixelFormat.Bgra, 
     PixelType.UnsignedByte, 
     data.Scan0); 
    bitmap.UnlockBits(data); 
    SetParameters(); 
    return tex; 
} 

Что может вызвать появление треугольника?

ответ

2

Использование currentImage.Width/currentImage.Height для координат вершин неправильное. Он должен иметь диапазон от -1 до 1. В вашем случае, поскольку вы, кажется, рисуете от 0 до 1 (т. Е. Только четверть экрана), верхний левый должен быть (0,0) сверху справа должен иметь (1,0), а нижняя левая должна иметь (0, -1), то справа должна быть (1, -1). Если вам нужен полноэкранный четырехъядерный процессор, он должен находиться в диапазоне от -1, -1 до 1,1.

Что касается странной формы, которую вы наблюдаете, вы рисуете 2 треугольника, но порядок намотки не позаботился. т. е. один треугольник, гипотенуза которого находится сверху слева направо, а другой треугольник, гипотенуза которого находится внизу слева направо. Отсюда и форма. Вы можете увидеть, например,

http://msdn.microsoft.com/en-us/library/bb464051.aspx

А также,

Index Buffer Object and UV Coordinates don't play nice

+0

Я намеренно не делая никаких треугольников. :) ... что такое извилистый заказ? – IAbstract

+0

Я посмотрел ссылку XNA ... Какая актуальность? Есть ли порядок, в котором я должен установить TexCoord2 и Vertex2 ??? Это все, что я получаю от этого. :) – IAbstract

+0

Хорошо ... ты помог мне войти в нужное мне направление. Хотя не полный ответ, я даю +1. :) Я скорее всего опубликую ответ после того, как я завершил функцию масштабирования. – IAbstract

Смежные вопросы