热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Ubuntu下OpenGL编程基础解析

本文重点介绍在Ubuntu下怎么进行OpenGL基础编程,其主要步骤如下:1:首先当然需要安装一些基本的编译库和OpenGL库文件,主要安装以下两个就ok了基本编译库:build-essentialsudoapt-getinstallbuild-essentialOpenGL工具库:freeglut3-devsudoapt-getinstallfree

本文重点介绍在Ubuntu下怎么进行OpenGL基础编程,其主要步骤如下:

1:首先当然需要安装一些基本的编译库和OpenGL库文件,主要安装以下两个就ok了

基本编译库:build-essential

sudo apt-get install  build-essential

OpenGL工具库:freeglut3-dev

sudo apt-get install freeglut3-dev

以上是本人在虚拟机上安装的提示,可以看到除了freeglut3外 还安装了其他额外的软件包。

2:第二步,当然是编写代码了,这个就不用讲了,自己贴一个,有时间可以研究下。

/* Rotating cube with color interpolation */ 

#include
 #include
 
 GLfloat vertices[][3] = {{-1.0,-1.0,-1.0},{1.0,-1.0,-1.0},   
  {1.0,1.0,-1.0}, {-1.0,1.0,-1.0}, {-1.0,-1.0,1.0},   
  {1.0,-1.0,1.0}, {1.0,1.0,1.0}, {-1.0,1.0,1.0}}; 

 GLfloat normals[][3] = {{-1.0,-1.0,-1.0},{1.0,-1.0,-1.0}, 
  {1.0,1.0,-1.0}, {-1.0,1.0,-1.0}, {-1.0,-1.0,1.0},   
  {1.0,-1.0,1.0}, {1.0,1.0,1.0}, {-1.0,1.0,1.0}};

 GLfloat colors[][3] = {{0.0,0.0,0.0},{1.0,0.0,0.0},
  {1.0,1.0,0.0}, {0.0,1.0,0.0}, {0.0,0.0,1.0}, 
  {1.0,0.0,1.0}, {1.0,1.0,1.0}, {0.0,1.0,1.0}};


void polygon(int a, int b, int c , int d)
{
  glBegin(GL_POLYGON); 
  glColor3fv(colors[a]); 
  glNormal3fv(normals[a]); 
  glVertex3fv(vertices[a]); 
  glColor3fv(colors[b]); 
  glNormal3fv(normals[b]); 
  glVertex3fv(vertices[b]); 
  glColor3fv(colors[c]); 
  glNormal3fv(normals[c]); 
  glVertex3fv(vertices[c]); 
  glColor3fv(colors[d]); 
  glNormal3fv(normals[d]); 
  glVertex3fv(vertices[d]); 
  glEnd(); 
}
 
 
 
void colorcube(void) 

/* map vertices to faces */ 
 
  polygon(0,3,2,1); 
  polygon(2,3,7,6); 
  polygon(0,4,7,3); 
  polygon(1,2,6,5); 
  polygon(4,5,6,7); 
  polygon(0,1,5,4); 
}

static GLfloat theta[] = {0.0,0.0,0.0}; 
static GLint axis = 2; 

void display(void) 

/* display callback, clear frame buffer and z buffer,
  rotate cube and draw, swap buffers */ 
 
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
 glLoadIdentity(); 
 glRotatef(theta[0], 1.0, 0.0, 0.0); 
 glRotatef(theta[1], 0.0, 1.0, 0.0); 
 glRotatef(theta[2], 0.0, 0.0, 1.0); 
 colorcube(); 
 glFlush(); 
 glutSwapBuffers(); 

 
 

void spinCube()
{
  /* Idle callback, spin cube 2 degrees about selected axis */
 theta[axis] += 2.0; 
 if( theta[axis] > 360.0 ) theta[axis] -= 360.0;
 display();
}
 
 
 
void mouse(int btn, int state, int x, int y)
 {
  /* mouse callback, selects an axis about which to rotate */
  if(btn==GLUT_LEFT_BUTTON && state == GLUT_DOWN) axis = 0; 
  if(btn==GLUT_MIDDLE_BUTTON && state == GLUT_DOWN) axis = 1; 
  if(btn==GLUT_RIGHT_BUTTON && state == GLUT_DOWN) axis = 2;
}
 
void myReshape(int w, int h)
{
  glViewport(0, 0, w, h); 
 glMatrixMode(GL_PROJECTION); 
 glLoadIdentity(); 
 if (w <= h) 
 {
  glOrtho(-2.0, 2.0, -2.0 * (GLfloat) h / (GLfloat) w, 
          2.0 * (GLfloat) h / (GLfloat) w, -10.0, 10.0); 
 }
    else
    {
        glOrtho(-2.0 * (GLfloat) w / (GLfloat) h, 
          2.0 * (GLfloat) w / (GLfloat) h, -2.0, 2.0, -10.0, 10.0);
  }
 
  glMatrixMode(GL_MODELVIEW);
}
 

main(int argc, char **argv)
{
  glutInit(&argc, argv);
 /* need both double buffering and z buffer */

 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); 
    glutInitWindowSize(500, 500); 
    glutCreateWindow("colorcube"); 
    glutReshapeFunc(myReshape); 
    glutDisplayFunc(display); 
 glutIdleFunc(spinCube); 
 glutMouseFunc(mouse); 
 glEnable(GL_DEPTH_TEST); /* Enable hidden--surface--removal */ 
    glutMainLoop();
 
return 0;
 
}


推荐阅读
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文介绍了在Win10上安装WinPythonHadoop的详细步骤,包括安装Python环境、安装JDK8、安装pyspark、安装Hadoop和Spark、设置环境变量、下载winutils.exe等。同时提醒注意Hadoop版本与pyspark版本的一致性,并建议重启电脑以确保安装成功。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • Ubuntu 9.04中安装谷歌Chromium浏览器及使用体验[图文]
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • windows便签快捷键_用了windows十几年,没想到竟然这么好用!隐藏的功能你知道吗?
    本文介绍了使用windows操作系统时的一些隐藏功能,包括便签快捷键、截图功能等。同时探讨了windows和macOS操作系统之间的优劣比较,以及人们对于这两个系统的不同看法。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文是一位90后程序员分享的职业发展经验,从年薪3w到30w的薪资增长过程。文章回顾了自己的青春时光,包括与朋友一起玩DOTA的回忆,并附上了一段纪念DOTA青春的视频链接。作者还提到了一些与程序员相关的名词和团队,如Pis、蛛丝马迹、B神、LGD、EHOME等。通过分享自己的经验,作者希望能够给其他程序员提供一些职业发展的思路和启示。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
author-avatar
迷路
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有