OpenGL学习随笔(二)

一个场景中存在多个元素,不论3D还是2D都是一样。但由于3D多出一个Z轴,因而人眼从不同角度观察到的场景是不一样的。如何设置观察点是后话,首先还是要了解如何定义一个元素(不考虑如何把它放到场景里)。

在3D计算机图形世界里,所有图元都通过顶点(vertex)来表示。OpenGL支持(x,y), (x,y,z), (x,y,z,w)三种形式描述的顶点。其中(x,y,z,w)是齐次坐标(homogeneous coordinates),一个和仿射变换(affine transformation)有关的概念(插一句,终于感觉到数学知识的重要性了)。

以前接触的一些图形库在描述坐标时都用的是整数,用整数有一定的好处,特别是在嵌入式中,对于那些没有浮点运算单元的处理器来说,定点整数更快。OpenGL支持整数和浮点两种,但从目前来看,浮点似乎用得更多。

光有顶点还不足以描述一个图元,还需要指明这些顶点所构成的图元类型是什么。OpenGL支持直线、三角形、四边形、多边形和点五种图元,其中前三种又各自有一些特殊形式。

在OpenGL里使用顶点和图元类型来定义图元的方法如下:

glBegin(GL_LINES);

//define vertex
glVertex2f(0.0, 0.0);
glVertex2f(1.0, 1.0);
...

glEnd();

其中GL_LINES是图元类型,glVertex2f定义一个二维顶点。glBegin/glEnd表示图元定义的开始和结束。GL_LINES还可以是GL_POINTS, GL_TRIANGLES, GL_QUADS, GL_POLYGON等等(更多内容还是看API参考吧)。

当然, glVertex2f也还可以是glVertex3f, glVertex2i之类的。总之,OpenGL API是我见过的最别扭的API, 使用数字和字母来分别表示参数个数和类型。我十分不习惯这种表达方式。

来完善一下昨天的例子,把display函数实现了。

static void display(void)
{
    glClearColor(0, 0, 0, 1);     //设置清屏所用的颜色(RGBA)
    glClear(GL_COLOR_BUFFER_BIT); //清屏, GL_COLOR_BUFFER_BIT表示清屏动作

    glColor3f(0, 1, 0);
    glBegin(GL_LINES);
        glVertex2f(0, 0);
        glVertex2f(100, 100);
    glEnd();

    glFlush();
}

int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    glutCreateWindow(argv[0]);
    glutDisplayFunc(display);
    glutMainLoop();

    return 0;
}


如果不出意外,应该可以看见一条绿色的斜线了。

OpenGL是个状态机,理解这一点很重要,OpenGL API更是严格的区分着数据配置和命令配置两种接口。数据配到哪里去了?OpenGL如何获取?这些是在学习API时要不断思考的问题,这样才能更好理解为什么有些时候需要重新配置数据,有些时候又不需要。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值