-1

たとえば、Windows フォームで SimpleOpenGLControl コンポーネントを使用して、線を描画しようとしています。または他のテクスチャのないもの。glcolor3b、3ub、3d、3f 関数、4 つのパラメーターを持つ類似関数を使用しても、何も起こりません。色はそのままで、この色がどうなるかわかりません。あるプロジェクトでは緑のようで、別のプロジェクトではライトグレーのようです. これで、メソッド LoadTextureForModel の Background クラスに問題があることがわかりました。

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

色またはビュー マトリックスを明示的にリセットしたい場合を除き、ループの実行ごとに 1 回 (ほとんどの場合、その必要はありません)。

同じことが言えます

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 に答える