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;
	}
}

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

时间: 2024-08-29 12:18:52

OpenGL一: 初始化窗口,简单画图的相关文章

OpenGL学习(一)一个简单的绘制矩形程序

一段简单的绘制正方形的程序: #include <gl/glut.h> void display() { glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_POLYGON); glVertex2f(-0.5,-0.5); glVertex2f(-0.5,0.5); glVertex2f(0.5,0.5); glVertex2f(0.5,-0.5); glEnd(); glFlush(); } int main(int argc,char**argv) { glu

jmGraph:一个基于html5的简单画图组件

jmGraph:一个基于html5的简单画图组件 特性: 代码书写简单易理解 面向对象的代码结构 对图形控件化 样式抽离 模块化:入seajs实现模块化开发 兼容性:暂只推荐支持html5的浏览器:ie9+,chrome,firefox等. jiamao/jmgraph · GitHub APIs jmgraph是一个基于html5的WEB前端画图组件. 前端画图对象控件化,支持鼠标和健盘事件响应,可对单个控件样式设定,支持简单的动画处理.可大大地简化前端画图.

在VR中模拟用鼠标操作电脑并实现简单画图的小程序

(图没有录好,明天换一下) 一.概述 1.实现的基本操作是: 1)用手柄抓住黄色的方块代表手抓住鼠标. 2)通过移动手柄模拟鼠标移动,电脑屏幕上的光标跟着移动. 3)当光标移动到一个Button上时,Button高亮,离开时Button取消高亮,点击Button触发点击事件. 4)当点击Button之后,打开一个画图程序,可以用光标在颜色选择区选择一种颜色,然后在画图区根据光标的移动轨迹,画出选择颜色的光标移动路径的曲线: 2.脚本 1)ComputerController挂在代表电脑的Canv

Kinaba 简单画图

此片文章简单介绍如何在kinaba 上画图. 如果你,还没有搭建ELK 请参考:ELK日志分析平台搭建全过程 本文参考:http://www.cnblogs.com/hanyifeng/p/5860731.html 一.Kibana之Visualize 功能 在首页上Visualize 标签页用来设计可视化图形.你可以保存之前在discovery中的搜索来进行画图,然后保存该visualize,或者加载合并到 dashboard 里.一个可视化可以基于以下几种数据源类型:一个新的交互式搜索一个已

IOS 简单画图显示

首先平台的搭建和前面是一样的,创建好根视图 接下来新建一个类即视图是UIView类型命名为MyView 在RootViewController.h文件中导入MyView的头文件 在RootViewController.m文件中 - (void)viewDidLoad { //因为RootViewController自带了一个view,让MyView的view和RootViewController的view一样 MyView *myView = [[MyView alloc]initWithFra

Lane-学习OpenGL(1)-七个简单例子

在看了许多实例之后, 准备沿着OpenGL编程指南(第七版)学习OpenGL. 运行环境: (1)Windows 7 (2)CodeBlocks (3)GLUT (4)Author:Lane 2014-12-02 1.黑色背景加白色矩形 #include <windows.h> #include <GL/gl.h> #include <GL/glu.h> #include <GL/glut.h> #include <cstdlib> #inclu

html5canvas简单画图

1.最近做的项目用到了canvas画图,但是项目中用到的有点复杂,所以就从头开始学了canvas画图, 2.下面用canvas话了一个时钟. 主要用到了canvas画圆形和在图形中文字的定位,以及画图函数中参数的意思. 3.首先需要一个画图 4.js函数 这是绘制圆形的函数,里面的参数意思是: 其中context.fillText("12",100,20); 这三个参数分别是:画的文字,后面两个是坐标位置. 这样就可以定位文字的位置. 效果图:

如何制作鼠标随动窗口--简单

就像QQ宠物或者迅雷悬浮窗口一样,鼠标点下去窗体跟着鼠标动 主要是两个时间的加载 MouseDown和MouseMove事件 MouseDown事件: 1 private int _StartX ;//鼠标点下去的坐标 2 private int _StartY ; 3 private void Form1_MouseDown(object sender, MouseEventArgs e) 4 { 5 _StartX = e.X;//e是鼠标点下去的事件 6 _StartY = e.Y; 7

c++中初始化列表简单记录

首先 放另外一个博主的链接:http://www.cnblogs.com/graphics/archive/2010/07/04/1770900.html 在学习c++构造函数的过程中遇到了初始化列表这个词,便主动搜索资料,学习初始化列表这个概念 一.初始化列表的由来 在构造函数中,除了 函数名,函数体外,可以有初始化列表,也可以没有初始化列表,初始化列表不是必须的. struct  Test { public: Test(string   n, int b): name(n), id(b){}