对于那些不知道的人,Tao.opengl,Tao.freeglut是C#控制台应用程序所必需的。
现在,对于我的问题:我的导师要求我们绘制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个三角形,并且一个小的解释会使它更明显和可接受。
答案 0 :(得分:1)
简单地说,glOrtho
电话通常会决定您所看到的世界区域。因此,在您的情况下,您只能看到[0,1] -square,它完全由第一个(白色)多边形(即[-1,1] -square)覆盖。因此,要查看所有多边形,您应该使用例如
glOrtho(-1.0, 4.0, -1.0, 4.0, -1.0, 1.0); //or maybe with some margin of +/- 0.1
当您使用非身份或透视投影(而不是正交投影)的模型视图矩阵时,这一切都变得更加困难。我建议你多看一下OpenGL的转换管道,以获得更多的洞察力。也许this question的答案有助于此。
您似乎也忘记拨打
了glViewport(0, 0, 1000, 1000);
确定渲染视图的帧缓冲区域,其范围通常应与窗口的范围匹配。默认情况下,上下文的视口与其附加的窗口大小相匹配,但最好明确设置视口,尤其是在调整窗口大小时,因为视口不会自动更新。
顺便说一句,如果每个多边形的颜色都相同,则不需要为每个多边形设置颜色,因为 OpenGL是状态机。
答案 1 :(得分:1)
glVertex3
如此弃用,你的老师甚至不应该承认它的存在,但很好。
void glOrtho(GLdouble left,
GLdouble right,
GLdouble bottom,
GLdouble top,
GLdouble nearVal,
GLdouble farVal);
前两个参数指定左和右剪裁平面的坐标。 第三个和第四个参数指定Bottom和Top Clipping plane的坐标。
使用当前的glOrtho,第一个矩形覆盖整个屏幕,其他矩形也覆盖屏幕。结合您的GlColor3f将绘图颜色设置为白色,整个屏幕变为白色。顺便说一下,你不需要重新指定它。
让它发挥作用的一种方式就是拥有像这样的glOrth:
Gl.glOrtho(-5.0, 5.0, -5.0, -5.0, -1.0, 1.0);
你也可以修改你的glVertex方法来绘制一个更小的矩形。