2014-02-17 6 views
-1

Использование компонента SimpleOpenGLControl в Windows Forms, Я пытаюсь сделать линию, например. Или любая другая нетекстурированная вещь. Использование функций glcolor3b, 3ub, 3d, 3f, их аналогов с 4 параметрами - и ничего не происходит. Цвет остается неизменным, и я не могу управлять тем, что будет в этом цвете. В одном проекте он похож на зеленый, в другом, как светло-серый. Теперь я знаю, что беда заключается в моем Фоновая классе, в методе LoadTextureForModel:OpenGl, C#, Тао. Цвет чертежа остается неизменным

public class Background : Visible 
     { 
      public Background(string Path) 
      { 
       LoadTextureForModel(Path); 
      } 
      public override void Display() 
      { 
       MyGlutUser.DrawRect((int)TextureObj(), new FPoint(0, 0), 
            MyGlutUser.WorldW + 100, MyGlutUser.WorldH + 100); 
      } 
     } 
public abstract class Visible 
     { 
      public abstract void Display(); 
      public String PathToImage 
      { get; set; } 
      public RGBubColor Color 
      { get; set; } 
      protected int imageID; 
      public int ImageID 
      { 
       get 
       { 
        return imageID; 
       } 
       set 
       { 
        imageID = value; 
       } 
      } 
      protected int mGlTextureObject { get; set; } 
      public FPoint Location 
      { get; set; } 
      public static int Counter = 0; 
      public int TextureObj() 
      { 
       return mGlTextureObject; 
      } 
      public void LoadTextureForModel(string FileName) 
      { 
       PathToImage = FileName; 
       Il.ilGenImages(1, out imageID); 
       Il.ilBindImage(imageID); 
       if (Il.ilLoadImage(PathToImage)) 
       { 
        int width = Il.ilGetInteger(Il.IL_IMAGE_WIDTH); 
        int height = Il.ilGetInteger(Il.IL_IMAGE_HEIGHT); 
        int bitspp = Il.ilGetInteger(Il.IL_IMAGE_BITS_PER_PIXEL); 

        switch (bitspp) // в зависимости оп полученного результата 
        { 
         case 24: 
          mGlTextureObject = MakeGlTexture(Gl.GL_RGB, Il.ilGetData(), width, height); 
          break; 
         case 32: 
          mGlTextureObject = MakeGlTexture(Gl.GL_RGBA, Il.ilGetData(), width, height); 
          break; 

        } 

        Il.ilDeleteImages(1, ref imageID); 
       } 

      } 

код для рисования линии:

public static void DrawLine(FPoint p1, FPoint p2) 
      { 
       Gl.glBegin(Gl.GL_LINES); 
       Gl.glVertex2d(p1.x, p1.y); 
       Gl.glVertex2d(p2.x, p2.y); 
       Gl.glEnd(); 

      } 
public static void DrawLine(RGBubColor Color, FPoint p1, FPoint p2) 
      { 
       Gl.glColor3d((double)Color.r/255.0, (double)Color.g/255.0, (double)Color.b/255.0); 
       DrawLine(p1, p2); 
      } 
public struct RGBubColor 
     { 
      public byte r; public byte g; public byte b; 
      public RGBubColor(byte r, byte g, byte b) 
      { 
       this.r = r; 
       this.g = g; 
       this.b = b; 
      } 
     }; 

Invokation:

GlutUser.DrawLine(new RGBubColor(127, 0, 0), 5, new FPoint(0, 0), new FPoint(500, 500)); 

мне нужен способ исправить мою функцию LoadTextureForModel.

ответ

0

Попробуйте использовать этот код, чтобы очистить Color & матричного состояния:

 Gl.glClear(Gl.GL_COLOR_BUFFER_BIT); 
     Gl.glLoadIdentity(); 
     Gl.glPushMatrix(); 
     Gl.glTranslated(a, b, c); 
     Gl.glScaled(zoom, zoom, zoom); 

      --------------- 
       drawing code 
      --------------- 

     Gl.glPopMatrix(); 
     Gl.glFlush(); 

и

 Gl.glClearColor(clearR/255f, clearG/255f, clearB/255f, 1); 

Это работает хорошо для меня

EDIT

Там работаться код, ниже которого исправить твоя ошибка, я думаю.

EXAMPLE:

 Gl.glClear(Gl.GL_COLOR_BUFFER_BIT); 
     Gl.glLoadIdentity(); 
     Gl.glColor3f(255, 0, 0); 

     Gl.glBegin(Gl.GL_LINE_LOOP); 

      Gl.glVertex2d(8, 7); 
      Gl.glVertex2d(15, 27); 
      Gl.glVertex2d(17, 27); 
      Gl.glVertex2d(23, 7); 
      Gl.glVertex2d(21, 7); 
      Gl.glVertex2d(19, 14); 
      Gl.glVertex2d(12.5, 14); 
      Gl.glVertex2d(10, 7); 

     Gl.glEnd(); 

     Gl.glBegin(Gl.GL_LINE_LOOP); 

      Gl.glColor3f(0, 255, 0); 
      Gl.glVertex2d(18.5, 16); 
      Gl.glVertex2d(16, 25); 
      Gl.glVertex2d(13.2, 16); 

     Gl.glEnd(); 

     Gl.glFlush(); 

(Полная версия кода вы найдете here)

И вы получите что-то вроде this

+0

Это приводит к переполнению стека после нескольких кадров. Если это проекционная матрица, то GL только гарантирует глубину стека 2. –

+0

Прошу прощения, но я использовал эту часть кода таймером, и все работает отлично для меня. – melvas

+1

Тогда ваша реализация OpenGL глючит. Поскольку вы нигде не вставляете свою матрицу, вы быстро ее переполняете. –

0

Чтобы ответить, почему ваши изменения не правильно работать:

Вы должны позвонить только

Gl.glClear(GL_COLOR_BUFFER_BIT); 
Gl.glLoadIdentity(); 

один раз в перспективе через петлю, если вы явно не хотите, чтобы сбросить цвета или ваш вид матрицы (вам не нужно, чтобы в большинстве случаев).

То же самое относится и к

Gl.glFlush(); 

, которые обычно нужно только назвать в конце основного цикла рисования.

Это означает, что ваша функция DrawLines должна выглядеть примерно так:

public static void DrawLine(FPoint p1, FPoint p2) 
    { 
     Gl.glPushMatrix(); 
     Gl.glBegin(Gl.GL_LINES); 
     Gl.glVertex2d(p1.x, p1.y); 
     Gl.glVertex2d(p2.x, p2.y); 
     Gl.glEnd(); 
     Gl.glPopMatrix(); 
    } 

и ваш основной цикл должен выглядеть примерно так:

//Loop Start 
GL.glClear(GL_COLOR_BUFFER_BIT); 
GL.glLoadIdentity(); 

//Tranformation code here. 

Gl.glColor3f(0, 255, 0); 
DrawLine(p1,p2); 

//Any other drawing code. 

Gl.glFlush(); 
//End Loop 

Будем надеяться, что это помогает.

+0

спасибо, что не решила проблему, но теперь я больше знаю об источнике проблемы, см. Отредактированный вопрос. –

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