-1

例如,在 Windows 窗体中使用 SimpleOpenGLControl 组件,我试图画一条线。或任何其他无纹理的东西。使用 glcolor3b、3ub、3d、3f 函数,它们具有 4 个参数的类似物 - 没有任何反应。颜色保持不变,我无法管理这种颜色。在一个项目中它像绿色,在另一个项目中像浅灰色。现在我知道问题在于我的背景类,在方法 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;
            }
        };

调用:

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

我需要一种方法来修复我的 LoadTextureForModel 函数。

4

2 回答 2

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

希望这会有所帮助。

于 2014-02-18T16:58:42.160 回答
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);

它对我有用

编辑

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

例子:

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

(您可以在此处找到完整版代码)

你会得到类似的东西这个

于 2014-02-17T20:51:06.853 回答