OpenGL编程指南(第七版)】的更多相关文章

解决办法一. #if defined(_WIN32) # ifndef GLUT_BUILDING_LIBextern _CRTIMP void __cdecl exit(int); 上面是glut.h中对exit的使用,意思是如果没有定义宏‍GLUT_BUILDING_LIB,就使用它的exit,那我们就在项目的属性——预处理器 里定义这个宏,这样就不执行glut.h中的exit了,而只执行stdlib.h中的exit.这样也就不会冲突了.对了,还要在附加依赖项里手动加上‍glut32.lib…
问题1:根据源代码时,我发现的时候去敲门.不正确实施效果.哪里是不正确?没有源代码glPushAttrib(GL_LINE_STIPPLE) glPopAttrib().所以会出现最后的下一次抽奖提供的资料重绘每次更新的虚线时间前覆盖已制定好点线.和谈栈处理,这样子在刷帧重绘才不会影响其它帧的绘制结果.(原因是什么眼下我也不清楚,预计是状态机的管理问题.要了解内部的绘制机制才行. )可是每次手动加入压栈和弹栈太麻烦了,所以我处理C_style的宏定义形式去实现 问题2:reshape的操作屏蔽掉…
最近在编译opengl编程指南第八版的示例代码,如下 #include <iostream> #include "vgl.h" #include "LoadShaders.h" using namespace std; enum VAO_IDs { Triangles, NumVAOs }; enum Buffer_IDs { ArrayBuffer, NumBuffers }; }; GLuint VAOs[NumVAOs]; GLuint Buffe…
环境 OS:win7 旗舰版SP1 64位 编译器: VS 2013 express 的cl 软件 glut. 在这个页面https://www.opengl.org/resources/libraries/glut/glut_downloads.php 搜glutdlls37beta.zip,里面有头文件和编译好的lib,dll glew. 在这个页面http://glew.sourceforge.net/下载 Windows 32-bit and 64-bit版本 配制 %VS_HOME%代…
////////////////////////////////////////////////////////////////////////////// // // Triangles.cpp // ////////////////////////////////////////////////////////////////////////////// #include "vgl.h" #include "LoadShaders.h" enum VAO_IDs…
1.使用CMake Configure中选择VS2017 Win64 , Finish: 点击Generate. 2.进入build目录 打开GLFW.sln , 生成解决方案. 打开vermilion9.sln , 生成解决方案. 3.进入bin目录 查看编译好的.exe文件. 转载链接:https://blog.csdn.net/qq_41595874/article/details/89741898 其它参考链接: 1.opengl编程指南第9版源码编译注意事项 2.OpenGL红宝书第九…
OpenGL编程指南(第七版) 转自:http://blog.csdn.net/w540982016044/article/details/21287645 在接触OpenGL中,配置显得相当麻烦,特别是在VS2012下配置时,存在许多问题,而网上的很多方法仅仅适用于VS2008,甚至仅适用于VC6.0,笔者经过自身的实践,参考了许多网上的资料,总结了一下配置的方法,当然这仅仅是笔者的个人理解,笔者个人水平有限,因此未必是万能的,如果解说存在错误或者不明白的地方,还望读者原谅和更正,谢谢. 一.…
前言 大家好.这是开通本号的第一篇文章.从事IT行业已经20年了,从使用PowerBuilder做企业信息系统开始,做了七八年开发,然后转型Java不是很成功,从07年之后,我转做产品经理,机缘巧合,在2012年之后,又接触到.Net编程,在2016年正式回归到开发的行列,整整10年.最近几年,在技术上要补以前落下的课,所以变化很快,进步也很快,16年基于DevExpress做Winform开发,17年转到基于asp.net mvc做web开发,再转java web开发,又转Andriod Ja…
最近去图书馆借了一本书<OpenGL编程指南(原书第八版)>,今天倒腾了一天才把第一个例子运行出来. 所以,给大家分享一下,希望能快速解决配置问题. 一.下载需要的库文件 首先,我们需要去该书的网站中下载相关的配置文件,书中给的是“红宝书”的官方网址:http://www.opengl-redbook.com/ 但现在已经更新至第九版,里面的库不是很完整,不适宜用于此书示例. 所以我们要找一个第八版的资源:http://pan.baidu.com/s/1kVpv1MR 下载完之后,我们先把ma…
前言 本篇我们继续讲解本章其余的部分:构造函数.只读字段.匿名类型.结构详解.部分类.静态类.Object类.扩展方法,等. 01 类 构造函数 构造函数是一种特殊的方法: 与类同名 没有返回值,甚至不能写void(但可以写修饰符public,private,protected) 未指定构造函数时,编译器会自动创建默认构造函数:一旦手工创建了构造函数,编译器就不会再创建默认构造函数 构造函数可重载,同方法一样 静态构造函数:构造函数加static关键字:它只执行一次,一般用于初始化静态字段或者属…
前言 新年好,本篇开始进入第三章,<对象和类型>,深刻理解C#的对象,对于使用好.Net类库非常重要. 01 类和结构 从使用角度看,结构和类的区别很小,比如,将结构定义转换为类,只需要将关键字struct改为class即可.创建结构的时候,也同样可以用关键字new.它们的本质区别是,结构是值类型,存储在栈上,而类存储在堆上. 但我还没碰到什么情况下需要使用结构.因为一般的业务代码,在设计时很难提炼出足够可泛化的含义,而如果只是少数情况下采用结构,对性能的提升微乎其微.但我们也可以发现在.Ne…
前言 本篇讲述Main方法,控制台,注释,预处理指令,编程规范等.这些概念比较琐碎,为避免长篇大论,主要以列举要点的方式来说明. 01 Main方法 Main方法并不是所有应用类型的入口方法,它只是控制台程序.Winform程序的入口方法. 创建项目时自动生成的Main方法,其修饰符是未指定的(未指定时默认为private),这说明入口方法并不要求public修饰符. 可以为应用程序指定多个Main方法,但编译时你必须显式的告诉编译器以哪个方法作为入口,否则编译会报错.所谓显式的告诉编译器,就是…
前言 本篇讲述枚举和名称空间. 01 枚举 首先需要明确枚举的概念:枚举是用户定义的整数类型.使用枚举的目标是,使用一组容易记忆的名称,来使得代码更容易编写和维护. 我们对比枚举的定义和类的定义,会发现它们有像的地方,有不像的地方,这不同之处体现了枚举的特性.我们按下图举例: C#中,一般习惯于一个文件定义一个类.而一个项目中可能有大量枚举,一般建议将多个枚举定义在一个文件中. 很多书中对于枚举只有一个称谓“枚举”,但是,如上图,到底是OrgType1是枚举,还是Vendor是枚举?实际上准确的…
前言 控制流是语言中最基础的部分,我们不谈具体的细节,只讲讲一些关键和有趣的点. 01 流控制 条件语句:if, else if, else if语句的使用非常值得细讲,如何是好的使用习惯.有一点非常重要,就是尽可能的避免太多层次的嵌套,这将带来可读性灾难.我自己的原则是,if嵌套一般不超过2层,最多不超过3层.可读性是什么?是指:不只是你自己写的代码你自己能读懂,更重要的是当别人接手你的代码的时候,别人能读懂. If嵌套导致的可读性灾难在Java程序里非常常见,我看别人的遗留代码就是这个感受.…
前言 接下来讲讲预定义数据类型.关于数据类型,其实是非常值得透彻研究的. 01 预定义数据类型 值类型和引用类型 C#将把数据类型分为两种,值类型和引用类型,值类型存储在堆栈上,引用类型存储在托管堆上.因此,对于值类型,如果: Int a = 1; Int b = a; 那么内存中就有两份的值1. 而对应引用类型,如果: User userA = new User(); User userB = userA: 那么内存中只有一份User对象,userA和userB都指向它. 需要提到一句的是,结…
前言 讲到核心C#的语法,其实很难讲,因为大部分是基础知识.如果只讲入门的基础知识,那细节又多,意义也不大.我们就不讲一般性的内容,而是找一些有趣的点,展开讲讲. 01 Hello World Hello World 一般开始编程的开头,都是写一个Hello World程序,这本书也是不能免俗.我们发现,Hello World基本都是用控制台(Console)程序写的.为什么是控制台程序?控制台程序只是一个测试用,学习用的框架吗?并不是这样.了解Java程序的同学可能都会发现,很多Java程序运…
01 程序集 程序集是包含编译好的.基于.Net Framework的代码逻辑单元.一般来说,在Visual Studio中的一个项目即一个程序集,而一个项目中包含多种不同的代码文件.程序集分为可执行程序集和库程序集,比如一个Winform项目就编译为可执行程序集,而Winform项目所包含的其他库项目则编译为库程序集.可执行程序集包含主程序入口点,而库程序集不包含. 程序集的特点是,它是完全自描述的,这和传统的COM组件非常不同,而自描述的程序集正是要解决传统COM组件的信息分离问题.一个CO…
01 中间语言(IL) .Net中间语言(IL)的特性,很大程度上来自于要支持多语言互操作性.要支持多语言互操作性,是因为微软想搞一个大事情,将它的老产品线VB和VC++,VJ++都装入.Net架构中.要支持多语言互操作,就需要实现这些基本功能: 1) 继承:一种语言的类能继承另一种语言编写的类. 2) 组合:一种语言的类可以包含另外一种语言的类的实例. 3) 调用:一个对象能够调用其他语言编写的对象的方法. 4) 传递:值和对象应该能在不同类的方法之间传递(传递数据). 5) 调试:调试器应能…
1.OpenGL使用的是RGB颜色空间,例如三个颜色分量各占8位,那么就说这个颜色值色深24,能够表示2^24中颜色. 2.多重采样是基于采样的抗锯齿技术,有OGAA(ordered grid anti-sliasing).SGAA(sparse grid anti-aliasing).MSAA(multi-sampling anti-aliasing).CSAA(coverage sampling anti-aliasing)等众多实现方式.fragment shader中有gl_Sample…
目录(Catalogs)   MEF 特性编程模型的核心价值,拥有通过目录动态地发现部件的能力.目录允许应用程序轻松地使用那些通过 Export Attribute 注册自身的导出.下面列出 MEF 提供的目录.      程序集目录(Assembly Catalog)   为了发现给定程序集所有导出,需要使用 [System.ComponentModel.Composition.Hosting.AssemblyCatalog].   var catalog = new AssemblyCata…
第一章 opengl简单介绍 1.1 什么是opengl opengl是图形硬件的一种软件接口.        1>渲染(rendering)是计算机依据模型创建图像的过程. 2>模型(model)是依据几何图元创建的,也成为物体(object). 3>几何图元包含点.直线.和多边形等,它们是通过顶点(vertex)指定的. 4>像素是显示硬件能够在屏幕上显示的最小可视元素. 5>OpenGL是一个状态机. 6>OpenGL渲染管线 的一些关键阶段 1. 显示列表 不论…
1. 先上代码 头文件glCommon.h #include <GL/glew.h> #include <GL/GL.h> #include <GL/GLU.h> #define MAX_LEN 2048 void GLLog(const char *pszFormat, ...); void SetupPixelFomat( HWND hWnd, HDC &hDC ); bool InitGL(HDC hDC, HGLRC &hRC); void De…
前言 今天,我们开始进入第四章的解读.本章讲的是继承.要做稍微复杂一些的开发,便不可避免的会使用到继承.本篇文章我们主要解读"实现继承". 另外,从本文开始,我开始使用Markdown格式来书写文章,它可以提供更好的布局风格和代码样式. 继承的类型 我们可能都知道,C++支持多继承,但Java和C#都不支持多继承.多继承非常繁琐和复杂,但现实世界中却又有很多多继承的情况,很简单的比如我们每个人都继承自父母,那么怎么用对象化的视角来对现实世界建模呢? 对于C#来说,就是实现继承和接口继承…
//http://blog.csdn.net/longhuihu/article/details/7701874 1.绘图基础 清除窗口 glClearColor(0.0, 0.0, 0.0, 0.0);glClear(GL_COLOR_BUFFER_BIT); 第一句代码设置”清除颜色“,第二句代码将当前颜色缓冲区重置为“清除颜色”. 图形硬件除了color buffer(颜色缓冲区.对应屏幕上的像素颜色),还有其他缓冲区,比如Depth,Stencil,Accumulation,设置这些缓冲…
转自://http://blog.csdn.net/longhuihu/article/details/8477614 纹理(texture)是一块矩形数据序列,存储的数据为颜色.亮度.alpha值.纹理数据的每个单位叫做texel,纹理数据可以被映射到任何几何形状的表面. 1.纹理映射基础 使用纹理是一个相对复杂的操作,一般需要以下几个步骤:1.创建texture对象,并指定数据:纹理数据可以是二维的图像,也可以是一维或三维的: 2.指定texture将被以何种方式与像素进行映射:有四种函数可…
1.使用纹理 GLSL从纹理中读取数据使用内置函数texture的多种重载方法 Gvec4 texture(gsampler1D, float texCoord[,float bias]) Gvec4 texture(gsampler2D, vec2 texCoord[,float bias])//这里开头的g代表的是任意类型的占位符,[]是可选参数 2.纹理坐标 一般是逐顶点提供纹理坐标,然后根据图元间的线段在光栅化对每个片元进行插值得到片元纹理坐标.纹理坐标的范围为[0.0, 1.0],超过…
1.OpenGL支持同时使用多个纹理单元,使用GL_TEXTUREi进行标识,使用前需要先激活对应的纹理单元,默认GL_TEXTURE0是激活绑定的. void glActiveTexture(GLenum texture) 注意,在对uniform进行设置时,纹理的写入并不是其对应的id而是其使用纹理单元的下标序号,这点对于初学者很容易混淆. 2.创建纹理对象后,需要为其设置存储空间与数据格式,设置之后在生命周期内不能被重新定义,那么OpenGL可以不需要跟踪纹理对象的某些数据格式发生的变化.…
1.OpenGL用户裁剪需要使用一个vertex shader的内置变量gl_ClipDistance,它是一个声明的时没有指定大小的数组,因此需要重新声明它的大小或者将它作为一个编译时的常量使用(啥意思???). gl_ClipDistance每一个元素对应一个平面,平面数目有限通常为8个,可以通过gl_MaxClipDistances获取平台支持的最大值.这个数组大小包括了已经启用的其它裁剪面,vertex shader必须写入所有已经启用裁剪面的距离,否则表现不可预测,通过裁剪的片元可以读…
1.帧缓冲对象 帧缓冲对象对于离屏渲染.纹理贴图更新.缓存乒乓技术(buffer ping-pongqing,GPGPU的一种数据传输方式)的实现意义非凡,它减少了大量的数据拷贝工作. 建立帧缓冲需要负责建立帧缓冲使用的其它缓冲内容,也就是说,新建的帧缓冲只是一个空壳,具体的渲染缓冲对象被称之为帧缓冲附件.下面是一个简单的可用帧缓冲建立示例: 帧缓冲是比较消耗内存的,所以OpenGL提供了可以将帧缓冲一部分或者全部无效化从而立即释放内存的操作 void glInvalidFramebuffer(…
1.OpenGL对共享的边有严格的规定:1)共享边上的像素因为同事被两者所覆盖,因此不可能不受到光照计算的影响: 2)共享边上的像素值,不可能受到多于一个三角形的光照计算的影响. 2.多边形存在正面与反面,为了能够明显地观察多边形的顶点,可以使用void glPolygonMode(GLenum face,GLenum mode)设置绘制方式 face必须是GL_FRONT_AND_BACK,mode可以是GL_POINT.GL_LINE.GL_FILL,默认使用的是GL_FILL 填充模式.…