opengl编程指南 第七版 源代码bug Page35 lines.c 红宝书
问题1:根据源代码时,我发现的时候去敲门。不正确实施效果。哪里是不正确?没有源代码glPushAttrib(GL_LINE_STIPPLE) glPopAttrib()。所以会出现最后的下一次抽奖提供的资料重绘每次更新的虚线时间前覆盖已制定好点线。和谈栈处理,这样子在刷帧重绘才不会影响其它帧的绘制结果。(原因是什么眼下我也不清楚,预计是状态机的管理问题。要了解内部的绘制机制才行。
)可是每次手动加入压栈和弹栈太麻烦了,所以我处理C_style的宏定义形式去实现
问题2:reshape的操作屏蔽掉之后发现仅仅要display中正确设置窗体參数,还是能正常绘制的。。
问题来了,reshape不应该是我拉伸窗体才会触发的吗?可是情况如改动仍能正常显示。百思不得其解,求不吝赐教。!
改动1源代码例如以下:
- #include "stdafx.h"
- #include <GL/freeglut.h>
- #define drawOneLine(x1,y1,x2,y2) glBegin(GL_LINES);\
- glVertex2f((x1),(y1));glVertex2f((x2),(y2));glEnd();
- void init(void)
- {
- glClearColor(0.0,0.0,0.0,0.0);
- glShadeModel(GL_FLAT);
- }
- void display(void)
- {
- //初初始化定义 窗体,我有益把这段搬出来測试reshape函数的调用,问题2:
- int w = 400,h =150;
- glViewport(0,0,static_cast<GLsizei>(w),static_cast<GLsizei>(h));
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluOrtho2D(0.0,static_cast<GLfloat>(w),0.0,static_cast<GLfloat>(h));
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- //int i;
- glClear(GL_COLOR_BUFFER_BIT);
- glPushMatrix();
- glColor3f(1.0,1.0,1.0);
- glEnable(GL_LINE_STIPPLE);
- //1st row
- glPushAttrib(GL_LINE_STIPPLE);
- //以二进制读取,从低位開始绘制,第一个參数为拉伸參数
- glLineStipple(1,0x0101);
- drawOneLine(50.0,125.0,150,125.0);
- glPopAttrib();
- glPushAttrib(GL_LINE_STIPPLE);
- glLineStipple(1,0x00FF);
- drawOneLine(150.0,125.0,250.0,125.0);
- glPopAttrib();
- glPushAttrib(GL_LINE_STIPPLE);
- glLineStipple(1,0x1c47);
- drawOneLine(250.0,125.0,350.0,125.0);
- glPopAttrib();
- //2nd row
- glLineWidth(5.0);
- glPushAttrib(GL_LINE_STIPPLE);
- //以二进制读取,从低位開始绘制,第一个參数为拉伸參数
- glLineStipple(1,0x0101);
- drawOneLine(50.0,100.0,150.0,100.0);
- glPopAttrib();
- glPushAttrib(GL_LINE_STIPPLE);
- glLineStipple(1,0x00ff);
- drawOneLine(150.0,100.0,250.0,100.0);
- glPopAttrib();
- glPushAttrib(GL_LINE_STIPPLE);
- glLineStipple(1,0x1c47);
- drawOneLine(250.0,100.0,350.0,100.0);
- glPopAttrib();
- glLineWidth(1.0);
- //3rd row
- glPushAttrib(GL_LINE_STIPPLE);
- glLineStipple(1,0x1c47);
- glBegin(GL_LINE_STRIP);
- for (int i = 0; i < 7; i++)
- {
- glVertex2f(50.0+static_cast<GLfloat>(i*50.0),75.0);
- }
- glEnd();
- glPopAttrib();
- glDisable(GL_LINE_STIPPLE);
- glPopMatrix();
- glFlush();
- }
- void reshape(int w,int h)
- {
- }
- int _tmain(int argc, char * argv[])
- {
- glutInit(&argc,argv);
- glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
- glutInitWindowSize(400,150);
- glutInitWindowPosition(0,0);
- glutCreateWindow(argv[0]);
- init();
- glutDisplayFunc(display);
- glutReshapeFunc(NULL);
- glutMainLoop();
- return 0;
- }
正确源代码示范:
- // Lines_P35.cpp : 定义控制台应用程序的入口点。
- //
- #include "stdafx.h"
- #include <GL/freeglut.h>
- #define drawOneLine(scale,stipple,x1,y1,x2,y2) \
- glPushAttrib(GL_LINE_STIPPLE);\
- glLineStipple((scale),(stipple));\
- glBegin(GL_LINES);\
- glVertex2f((x1),(y1));glVertex2f((x2),(y2));\
- glEnd();\
- glPopAttrib();
- void init(void)
- {
- glClearColor(0.0,0.0,0.0,0.0);
- glShadeModel(GL_FLAT);
- }
- void display(void)
- {
- glClear(GL_COLOR_BUFFER_BIT);
- glPushMatrix();
- glColor3f(1.0,1.0,1.0);
- glEnable(GL_LINE_STIPPLE);
- //1st row
- //以二进制读取,从低位開始绘制。第一个參数为拉伸參数
- drawOneLine(1,0x0101,50.0,125.0,150,125.0);
- drawOneLine(1,0x00FF,150.0,125.0,250.0,125.0);
- drawOneLine(1,0x1c47,250.0,125.0,350.0,125.0);
- //2nd row
- glLineWidth(5.0);
- //以二进制读取。从低位開始绘制。第一个參数为拉伸參数
- drawOneLine(1,0x0101,50.0,100.0,150.0,100.0);
- drawOneLine(1,0x00ff,150.0,100.0,250.0,100.0);
- drawOneLine(1,0x1c47,250.0,100.0,350.0,100.0);
- glLineWidth(1.0);
- //3rd row
- glPushAttrib(GL_LINE_STIPPLE);
- glLineStipple(1,0x1c47);
- glBegin(GL_LINE_STRIP);
- for (int i = 0; i < 7; i++)
- {
- glVertex2f(50.0+static_cast<GLfloat>(i*50.0),75.0);
- }
- glEnd();
- glPopAttrib();
- //4th
- for (int i = 0; i < 6; i++)
- {
- drawOneLine(1,0x1c47,50.0+static_cast<GLfloat>(i*50.0),50.0,50.0+static_cast<GLfloat>(i+1)*50.0,50.0);
- }
- //5th
- drawOneLine(5,0x1c47,50.0,25.0,350.0,25.0);
- glDisable(GL_LINE_STIPPLE);
- glPopMatrix();
- glFlush();
- }
- void reshape(int w,int h)
- {
- glViewport(0,0,static_cast<GLsizei>(w),static_cast<GLsizei>(h));
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluOrtho2D(0.0,static_cast<GLfloat>(w),0.0,static_cast<GLfloat>(h));
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- }
- int _tmain(int argc, char * argv[])
- {
- glutInit(&argc,argv);
- glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
- glutInitWindowSize(400,150);
- glutInitWindowPosition(0,0);
- glutCreateWindow(argv[0]);
- init();
- glutDisplayFunc(display);
- glutReshapeFunc(reshape);
- glutMainLoop();
- return 0;
- }
版权声明:本文博客原创文章,博客,未经同意,不得转载。
opengl编程指南 第七版 源代码bug Page35 lines.c 红宝书的更多相关文章
- 《OpenGL编程指南第七版》学习——编译时提示“error C2381: “exit” : 重定义;__declspec(noreturn) 不同”错误的解决办法
解决办法一. #if defined(_WIN32) # ifndef GLUT_BUILDING_LIBextern _CRTIMP void __cdecl exit(int); 上面是glut. ...
- 编译opengl编程指南第八版示例代码通过
最近在编译opengl编程指南第八版的示例代码,如下 #include <iostream> #include "vgl.h" #include "LoadS ...
- OpenGl编程指南第7版(红宝书)环境配制
环境 OS:win7 旗舰版SP1 64位 编译器: VS 2013 express 的cl 软件 glut. 在这个页面https://www.opengl.org/resources/librar ...
- OpenGL编程指南(第九版) Tiangles 学习笔记
////////////////////////////////////////////////////////////////////////////// // // Triangles.cpp / ...
- [转]OpenGL编程指南(第9版)环境搭建--使用VS2017
1.使用CMake Configure中选择VS2017 Win64 , Finish: 点击Generate. 2.进入build目录 打开GLFW.sln , 生成解决方案. 打开vermilio ...
- OpenGL编程指南(第七版)
OpenGL编程指南(第七版) 转自:http://blog.csdn.net/w540982016044/article/details/21287645 在接触OpenGL中,配置显得相当麻烦,特 ...
- 解读经典《C#高级编程》第七版 Page68-79.对象和类型.Chapter3
前言 新年好,本篇开始进入第三章,<对象和类型>,深刻理解C#的对象,对于使用好.Net类库非常重要. 01 类和结构 从使用角度看,结构和类的区别很小,比如,将结构定义转换为类,只需要将 ...
- 解读经典-《C#高级编程》第七版-Chapter1-.Net体系结构-Page6-13
01 中间语言(IL) .Net中间语言(IL)的特性,很大程度上来自于要支持多语言互操作性.要支持多语言互操作性,是因为微软想搞一个大事情,将它的老产品线VB和VC++,VJ++都装入.Net架构中 ...
- 解读经典-《C#高级编程》第七版-Chapter1-.Net体系结构-Page1-6
前言 大家好.这是开通本号的第一篇文章.从事IT行业已经20年了,从使用PowerBuilder做企业信息系统开始,做了七八年开发,然后转型Java不是很成功,从07年之后,我转做产品经理,机缘巧合, ...
随机推荐
- thinkphp5 tp5 七牛云 上传图片
七牛sdk地址https://files.cnblogs.com/files/zonglonglong/qiniu-php-sdk-7.2.2.rar 首先下载php的sdk将文件夹放到vendor ...
- 安卓 WebView加载本地图片时居中显示
在一个项目中使用WebView显示gif图片(自定义的View无法放大gif),当图片过小时只在左侧显示,经过研究发现无论设置android:layout_gravity="center_h ...
- Windows10终端优化方案:Ubuntu子系统+cmder+oh-my-zsh
原问地址:https://zhuanlan.zhihu.com/p/34152045 最近从MacBook换到了种草已久的Surface Book 2,而我的工作环境也自然要从macOS换到Windo ...
- Python 标准库 —— glob
glob库是最简单的模块之一,内容非常少.用它可以查找符合特定规则的文件路径名.跟使用 windows 下的文件搜索差不多.查找文件只用到三个匹配符: "*", 匹配 0 个或多个 ...
- iOS开发之Quartz2D 二:绘制直线,曲线,圆弧,矩形,椭圆,圆
#import "DrawView.h" @implementation DrawView /** * 作用:专门用来绘图 * 什么时候调用:当View显示的时候调用 * @par ...
- 【t084】数列
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 一个数列定义如下:f(1) = 1,f(2) = 1,f(n) = (A * f(n - 1) + B ...
- php超实用正则表达式有哪些
php超实用正则表达式有哪些 一.总结 一句话总结: 二.php几个超实用正则表达式 对于开发人员来说,正则表达式是一个非常有用的功能,它提供了 查找,匹配,替换 句子,单词,或者其他格式的字符串.这 ...
- Oracle中的sid与servicename
在平时自己创建库的时候,习惯的将sid与servicename取同名,但是在实际生产中这两个名字很有可能不一致,再使用jdbc连接数据库的url时就需要注意区分了,否则创建不了数据库连接 //serv ...
- [Erlang 0057] Erlang 排错利器: Erlang Crash Dump Viewer
http://www.cnblogs.com/me-sa/archive/2012/04/28/2475556.html Erlang Crash Dump Viewer真的是排错的天兵神器,还记得我 ...
- CodeForces 659E New Reform (图的遍历判环)
Description Berland has n cities connected by m bidirectional roads. No road connects a city to itse ...