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