0

私は SharpGL を学んでいますが、立方体などのオブジェクトがいくつかによって描画され、そのメソッドのペアの外にある他のすべてのコマンドの間にgl.Color配置gl.Vertexされている場合、理解できない奇妙な問題があります。より具体的には、(キューブの描画を終了する) 後に呼び出される gl.Color() は、そのキューブに影響を与えることができます。キューブは、いくつかのテクスチャバインディングで描画されました。gl.Begin()gl.End()gl.End()

これが私のコードです。このコードは CodeProject の記事から変更されたものです。私は元の作成者ではありませんが、(コード作成者が行ったように) 単純に回転する立方体を描画するのではなく、立方体を描画するように変更しました。唇を制御することができます(いくつかのキーを使用して開閉します)。また、立方体の内側にピラミッドを描きたいと思います。立方体を閉じるとピラミッドが見えず、キーを押して立方体の唇を開くと、それはあなたの中にピラミッドを示しています。これは私にとって非常に魅力的です。これは、いわゆる C# 用 OpenGL (SharpGL) をさらに深く理解する前の良い出発点です。

private void openGLControl1_OpenGLDraw(object sender, PaintEventArgs e) {
    // This is for pausing the scene
    if (pause) return;
    // Get the OpenGL object, for quick access.
    SharpGL.OpenGL gl = this.openGLControl1.OpenGL;

    // --------------------
    gl.Clear(OpenGL.COLOR_BUFFER_BIT | OpenGL.DEPTH_BUFFER_BIT);
    gl.Enable(OpenGL.TEXTURE_2D);
    gl.LoadIdentity();
    gl.Translate(x, y, z);

    gl.Rotate(rtri, 0.0f, 1.0f, 1.0f);

    gl.BindTexture(OpenGL.TEXTURE_2D, textures[0]);

    // Start drawing the cube (or box)
    gl.Begin(OpenGL.QUADS);

    // Front Face
    gl.TexCoord(0.0f, 0.0f); gl.Vertex(-1.0f, -1.0f, 1f);    // Bottom Left Of The Texture and Quad
    gl.TexCoord(1.0f, 0.0f); gl.Vertex(1.0f, -1.0f, 1.0f);    // Bottom Right Of The Texture and Quad
    gl.TexCoord(1.0f, 1.0f); gl.Vertex(1,(float)2*Math.Cos(alpha)- 1, 1+(float)2*Math.Sin(alpha));    // Top Right Of The Texture and Quad
    gl.TexCoord(0.0f, 1.0f); gl.Vertex(-1,(float)2*Math.Cos(alpha) - 1, 1+(float)2*Math.Sin(alpha));    // Top Left Of The Texture and Quad

    // Back Face
    gl.TexCoord(1.0f, 0.0f); gl.Vertex(-1.0f, -1.0f, -1.0f);    // Bottom Right Of The Texture and Quad
    gl.TexCoord(1.0f, 1.0f); gl.Vertex(-1.0f, 1.0f, -1.0f);    // Top Right Of The Texture and Quad
    gl.TexCoord(0.0f, 1.0f); gl.Vertex(1.0f, 1.0f, -1.0f);    // Top Left Of The Texture and Quad
    gl.TexCoord(0.0f, 0.0f); gl.Vertex(1.0f, -1.0f, -1.0f);    // Bottom Left Of The Texture

    // Top Face
    gl.TexCoord(0.0f, 1.0f); gl.Vertex(-1.0f, 1.0f, -1.0f);    // Top Left Of The Texture and Quad
    gl.TexCoord(0.0f, 0.0f); gl.Vertex(-1.0f, 1.0f, 1.0f);    // Bottom Left Of The Texture and Quad
    gl.TexCoord(1.0f, 0.0f); gl.Vertex(1.0f, 1.0f, 1.0f);    // Bottom Right Of The Texture and Quad
    gl.TexCoord(1.0f, 1.0f); gl.Vertex(1.0f, 1.0f, -1.0f);    // Top Right Of The Texture and Quad

    // Bottom Face
    gl.TexCoord(1.0f, 1.0f); gl.Vertex(-1.0f, -1.0f, -1.0f);    // Top Right Of The Texture and Quad
    gl.TexCoord(0.0f, 1.0f); gl.Vertex(1.0f, -1.0f, -1.0f);    // Top Left Of The Texture and Quad
    gl.TexCoord(0.0f, 0.0f); gl.Vertex(1.0f, -1.0f, 1.0f);    // Bottom Left Of The Texture and Quad
    gl.TexCoord(1.0f, 0.0f); gl.Vertex(-1.0f, -1.0f, 1.0f);    // Bottom Right Of The Texture and Quad

    // Right face
    gl.TexCoord(1.0f, 0.0f); gl.Vertex(1.0f, -1.0f, -1.0f);    // Bottom Right Of The Texture and Quad
    gl.TexCoord(1.0f, 1.0f); gl.Vertex(1.0f, 1.0f, -1.0f);    // Top Right Of The Texture and Quad
    gl.TexCoord(0.0f, 1.0f); gl.Vertex(1.0f, 1.0f, 1.0f);    // Top Left Of The Texture and Quad
    gl.TexCoord(0.0f, 0.0f); gl.Vertex(1.0f, -1.0f, 1.0f);    // Bottom Left Of The Texture and Quad

    // Left Face
    gl.TexCoord(0.0f, 0.0f); gl.Vertex(-1.0f, -1.0f, -1.0f);    // Bottom Left Of The Texture and Quad
    gl.TexCoord(1.0f, 0.0f); gl.Vertex(-1.0f, -1.0f, 1.0f);    // Bottom Right Of The Texture and Quad
    gl.TexCoord(1.0f, 1.0f); gl.Vertex(-1.0f, 1.0f, 1.0f);    // Top Right Of The Texture and Quad
    gl.TexCoord(0.0f, 1.0f); gl.Vertex(-1.0f, 1.0f, -1.0f);    // Top Left Of The Texture and Quad

    // End drawing the box, but the code below still affect the cube? 
    // Why??? How to prevent this unexpected behavior?
    gl.End();

    // Increase The Rotation Variable For The Triangle
    rtri += 1.0f;// 0.2f;

    // This is my method to add controlling features to the box such as
    // moving up, down, left, right, near, far and opening, closing the
    // lip of the box, this is very simple and I think you don't need to care.
    ChangeCoord(null, EventArgs.Empty);

    // Try drawing a triangle in the box
    // Here is the starting point the strange thing comes, if I end this
    // method here, all will go well but if so I won't be able to create
    // a triangle inside the box.
    gl.Disable(OpenGL.TEXTURE_2D);
    gl.LoadIdentity();
    gl.Translate(x, y, z - 0.5);
    gl.Scale(0.3f, 0.3f, 0.3f);
    gl.Rotate(r, 0.0f, 1.0f, 0.0f);

    gl.Begin(OpenGL.TRIANGLES);
    gl.Color(1.0f, 0.0f, 0.0f); gl.Vertex(0f, 1f, 0f);
    gl.Color(0.0f, 1.0f, 0.0f); gl.Vertex(-1f, -1f, 1f);
    gl.Color(0.0f, 0.0f, 1.0f); gl.Vertex(1f, -1f, 1f);

    gl.Color(1.0f, 0.0f, 0.0f); gl.Vertex(0f, 1f, 0f);
    gl.Color(0.0f, 1.0f, 0.0f); gl.Vertex(1f, -1f, 1f);
    gl.Color(0.0f, 0.0f, 1.0f); gl.Vertex(1f, -1f, -1f);

    gl.Color(1.0f, 0.0f, 0.0f); gl.Vertex(0f, 1f, 0f);
    gl.Color(0.0f, 1.0f, 0.0f); gl.Vertex(1f, -1f, -1f);
    gl.Color(0.0f, 0.0f, 1.0f); gl.Vertex(-1f, -1f, -1f);

    gl.Color(1.0f, 0.0f, 0.0f); gl.Vertex(0f, 1f, 0f);
    gl.Color(0.0f, 1.0f, 0.0f); gl.Vertex(-1f, -1f, -1f);
    gl.Color(0.0f, 0.0f, 1.0f); gl.Vertex(-1f, -1f, 1f);
    gl.End();

    r += 1.0f; //Just changing the rotating angle of the triangle.
}

三角形のgl.Color()描画に使用されていると思われる s は、まだボックスに影響しますか?

別の記事もダウンロードしました。この記事では、ライターが同じロジックで三角形と立方体の両方を描画し、すべてうまくいきましたが、そのコードの立方体はgl.Color()テクスチャ バインディングなしで描画されています。このコードでは、立方体はビットマップからのテクスチャで描画されています。画像。

助けてください。立方体と三角形が描かれています。立方体を好きなように制御できます (左、右、上、下に移動し、唇を開いたり閉じたり、シーンを一時停止したりします) が、立方体全体がテクスチャに重なって青色に変わります画像、欲しくない リアルに見えないのでテクスチャ画像で十分です。最初に述べたように、追加の三角形を描画するコードを使用しない場合、期待どおりにレンダリングされます。

4

1 に答える 1

1

色を必要とする描画対象を提出し、色を指定しない場合、GL は最後に指定した色を使用します。

色を指定しない場合、デフォルトは白になります。

必要なときに適切な色が魔法のようにそこにあることに頼るよりも、必要な色を与える方がよいでしょう。

最初gl.Color(1.0f, 1.0f, 1.0f);gl.Begin().

(また、コメントで他の人が指摘したように、固定機能パイプラインは推奨されなくなりました。新しいプログラマブル パイプラインへの移行を検討してください。)

于 2013-01-09T20:15:48.723 に答える