首页 > 代码库 > OpenGL一: 初始化窗口,简单画图

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

好久没搞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);

		//别忘记了交换前后buffer
		glutSwapBuffers();
	}

	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_RGBA
		glutInitWindowSize(800, 600);
		glutInitWindowPosition(20, 20);
		glutCreateWindow("Bill's Two Shapes");

		//初始化Call Back函数,相当于Windows编程中Call Back函数概念
		initCallBack();	

		//初始化glew
		GLenum 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;
	}
}