OpenGL一: 初始化窗口,简单画图

来源:互联网 发布:php 工作流 编辑:程序博客网 时间:2024/06/05 10:23

好久没搞OpenGL了,图形学的理论学的多,看来也需要多多动手做图形学软件,实际多做点东西出来才行。

因为理论书看了很多,但是一直没有太大的突破了,整个游戏是如何做成的,整个引擎怎么做出来的,基本所有相关技术我都了解,对我来说一点都不神秘,但是还是差那么一点点,觉得自己还没有达到专业水准。

感觉那么一点点就是个坎,一直跨不过去,好,这次一定要跨越它!

至于理论书看了多少本,我自己都忘记了,单单说大部头的纯英文书,都超过十几本吧。

这回少看理论了,而由简单的程序开始,下苦功夫,手打上百个程序再说,看看效果如何。

这个图形的效果如下:


像一个小杯子的,杯口是一个基本图形多边形polygen,杯身是一个线条Line Strip

很简陋,但是是纯粹手工确定点画成的。

下面带点注释的程序:

#pragma once#include <stdio.h>#include <GL\glew.h>#include <GL\freeglut.h>#include "math_3d.h"namespace Tutorial2_TwoShapes{GLuint VBO;void createGeometries(){Vector3f vers[10] = {Vector3f(-0.23f, 0.33f, 0.0f),Vector3f(-0.15f, 0.35f, 0.0f),Vector3f(0.15f, 0.35f, 0.0f),Vector3f(0.23f, 0.33f, 0.0f),Vector3f(0.15f, 0.25f, 0.0f),Vector3f(-0.15f, 0.25f, 0.0f),Vector3f(0.23f, 0.33f, 0.0f),Vector3f(0.23f, -0.35f, 0.0f),Vector3f(-0.23f, -0.35f, 0.0f),Vector3f(-0.23f, 0.33f, 0.0f)};//三步创建buffer,提供数据给GPU Shader使用glGenBuffers(1, &VBO);glBindBuffer(GL_ARRAY_BUFFER, VBO);glBufferData(GL_ARRAY_BUFFER, sizeof(vers), vers, GL_STATIC_DRAW);}static void RenderScene(){glClear(GL_COLOR_BUFFER_BIT);glEnableVertexAttribArray(0);glBindBuffer(GL_ARRAY_BUFFER, VBO);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);//分两步画图,第一画开口,然后或个四方形作为杯身glDrawArrays(GL_POLYGON, 0, 6);glDrawArrays(GL_LINE_STRIP, 6, 4);glDisableVertexAttribArray(0);//别忘记了交换前后bufferglutSwapBuffers();}static void initCallBack(){glutDisplayFunc(RenderScene);}int run(int argc, char **argv){//一共5个函数初始化GLUT,最后Create窗口glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);//注意:GL_DOUBLE GL_RGBAglutInitWindowSize(800, 600);glutInitWindowPosition(20, 20);glutCreateWindow("Bill's Two Shapes");//初始化Call Back函数,相当于Windows编程中Call Back函数概念initCallBack();//初始化glewGLenum res = glewInit();if (res != GLEW_OK){fprintf(stderr, "Error: '%s'\n", glewGetErrorString(res));return 1;}//清屏glClearColor(0.0f, 0.0f, 0.0f, 0.0f); createGeometries();glutMainLoop();return 0;}}




1 0