1

对于不知道的人,C# 控制台应用程序需要 Tao.opengl、Tao.freeglut。

现在,对于我的问题:我的导师让我们画了4个矩形,所以我画成功了。

并复制/粘贴其他代码(由于时间紧迫,我们的导师没有解释)

这是代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Tao.FreeGlut;
using Tao.OpenGl;

namespace Homework_1
{
    class Triangles
    {
        static void display()
        {
            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);

            Gl.glColor3f(1.0f,1.0f,1.0f);
            Gl.glBegin(Gl.GL_POLYGON);
            Gl.glVertex3f(-1.0f,-1.0f,0.0f);
            Gl.glVertex3f(1.0f, -1.0f, 0.0f);
            Gl.glVertex3f(1.0f, 1.0f, 0.0f);
            Gl.glVertex3f(-1.0f, 1.0f, 0.0f);
            Gl.glEnd();

            Gl.glColor3f(1.0f, 1.0f, 1.0f);
            Gl.glBegin(Gl.GL_POLYGON);
            Gl.glVertex3f(2.0f, -1.0f, 0.0f);
            Gl.glVertex3f(4.0f, -1.0f, 0.0f);
            Gl.glVertex3f(4.0f, 1.0f, 0.0f);
            Gl.glVertex3f(2.0f, 1.0f, 0.0f);
            Gl.glEnd();

            Gl.glColor3f(1.0f, 1.0f, 1.0f);
            Gl.glBegin(Gl.GL_POLYGON);
            Gl.glVertex3f(2.0f, 2.0f, 0.0f);
            Gl.glVertex3f(4.0f, 2.0f, 0.0f);
            Gl.glVertex3f(4.0f, 4.0f, 0.0f);
            Gl.glVertex3f(2.0f, 4.0f, 0.0f);
            Gl.glEnd();

            Gl.glColor3f(1.0f, 1.0f, 1.0f);
            Gl.glBegin(Gl.GL_POLYGON);
            Gl.glVertex3f(-1.0f, 2.0f, 0.0f);
            Gl.glVertex3f(1.0f, 2.0f, 0.0f);
            Gl.glVertex3f(1.0f, 4.0f, 0.0f);
            Gl.glVertex3f(-1.0f, 4.0f, 0.0f);
            Gl.glEnd();


            Gl.glFlush();

        }

        static void init()
        {

            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
            Gl.glMatrixMode(Gl.GL_PROJECTION);
            Gl.glLoadIdentity();
            Gl.glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
        }

        public static void Main(String[] argv)
        {
            Glut.glutInit();
            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB);
            Glut.glutInitWindowSize(1000, 1000);
            Glut.glutInitWindowPosition(100, 100);
            Glut.glutCreateWindow("hello");
            init();
            Glut.glutDisplayFunc(display);
            Glut.glutMainLoop();
        }
    }
}

运行应用程序时,它显示的都是白色,所以我 100% 确定错误在我复制和粘贴的 init() 方法中,该行

 Gl.glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0); 

我 100% 确定 Gl.glOrtho 的值必须更改,但问题是,我不知道如何使用它。

请纠正我的错误,这样它就可以显示我绘制的 4 个三角形,并且一个小的解释将使它更明显和可接受。

4

2 回答 2

1

简单地说,glOrtho呼叫通常决定了您的世界可见区域。因此,在您的情况下,您只会看到 [0,1] 正方形,它完全被第一个(白色)多边形(即 [-1,1] 正方形)覆盖。因此,要查看所有多边形,您应该使用例如

glOrtho(-1.0, 4.0, -1.0, 4.0, -1.0, 1.0);  //or maybe with some margin of +/- 0.1

当您使用不是身份或透视投影(而不是正交投影)的模型视图矩阵时,这一切都会变得更加困难。我建议您多了解一下 OpenGL 的转换管道以获得更多洞察力。也许这个问题的答案对此有所帮助。

你似乎也忘记打电话给

glViewport(0, 0, 1000, 1000);

它决定了你的视图被渲染到的帧缓冲区的区域,其范围通常应该与你的窗口的范围相匹配。默认情况下,上下文的视口与它所附加的窗口的大小相匹配,但最好明确设置视口,尤其是在调整窗口大小时,因为在这种情况下,视口不会自动更新。

顺便说一句,如果每个多边形的颜色都相同,则不需要为每个多边形设置颜色,因为OpenGL 是一个状态机

于 2011-10-10T19:53:51.190 回答
1

glVertex3被如此弃用,你的老师甚至不应该承认它的存在,但是很好。

void glOrtho(GLdouble   left,
             GLdouble   right,
             GLdouble   bottom,
             GLdouble   top,
             GLdouble   nearVal,
             GLdouble   farVal);

前两个参数指定左右剪裁平面的坐标。第三个和第四个参数指定底部和顶部剪切平面的坐标。

使用您当前的 glOrtho,第一个矩形覆盖整个屏幕,其他矩形也覆盖整个屏幕。结合您的 GlColor3f 将绘图颜色设置为白色,您的整个屏幕将变为白色。顺便说一句,您不需要重新指定它。

让它工作的一种方法是拥有一个像这样的 glOrtho :

 Gl.glOrtho(-5.0, 5.0, -5.0, -5.0, -1.0, 1.0); 

您还可以修改 glVertex 方法来绘制一个较小的矩形。

于 2011-10-10T19:55:34.963 回答