OpenGl,C#,Tao。绘图颜色始终保持不变

时间:2014-02-17 20:37:46

标签: c# opengl colors tao-framework

在Windows窗体中使用SimpleOpenGLControl组件, 例如,我想画一条线。或任何其他无纹理的东西。 使用glcolor3b,3ub,3d,3f函数,他们的模拟有4个参数 - 没有任何反应。颜色保持不变,我无法管理这种颜色。在一个项目中它就像绿色,其他像浅灰色。 现在我知道问题出在我的Background类中,方法是LoadTextureForModel:

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函数。

2 个答案:

答案 0 :(得分:0)

尝试使用此代码清洁颜色和矩阵状态:

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

对我有用

修改

下面有一些工作代码可以修复我认为的错误。

<强> 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

这样的东西

答案 1 :(得分: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

希望这有帮助。