问题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 红宝书的更多相关文章

  1. 《OpenGL编程指南第七版》学习——编译时提示“error C2381: “exit” : 重定义;__declspec(noreturn) 不同”错误的解决办法

    解决办法一. #if defined(_WIN32) # ifndef GLUT_BUILDING_LIBextern _CRTIMP void __cdecl exit(int); 上面是glut. ...

  2. 编译opengl编程指南第八版示例代码通过

    最近在编译opengl编程指南第八版的示例代码,如下 #include <iostream> #include "vgl.h" #include "LoadS ...

  3. OpenGl编程指南第7版(红宝书)环境配制

    环境 OS:win7 旗舰版SP1 64位 编译器: VS 2013 express 的cl 软件 glut. 在这个页面https://www.opengl.org/resources/librar ...

  4. OpenGL编程指南(第九版) Tiangles 学习笔记

    ////////////////////////////////////////////////////////////////////////////// // // Triangles.cpp / ...

  5. [转]OpenGL编程指南(第9版)环境搭建--使用VS2017

    1.使用CMake Configure中选择VS2017 Win64 , Finish: 点击Generate. 2.进入build目录 打开GLFW.sln , 生成解决方案. 打开vermilio ...

  6. OpenGL编程指南(第七版)

    OpenGL编程指南(第七版) 转自:http://blog.csdn.net/w540982016044/article/details/21287645 在接触OpenGL中,配置显得相当麻烦,特 ...

  7. 解读经典《C#高级编程》第七版 Page68-79.对象和类型.Chapter3

    前言 新年好,本篇开始进入第三章,<对象和类型>,深刻理解C#的对象,对于使用好.Net类库非常重要. 01 类和结构 从使用角度看,结构和类的区别很小,比如,将结构定义转换为类,只需要将 ...

  8. 解读经典-《C#高级编程》第七版-Chapter1-.Net体系结构-Page6-13

    01 中间语言(IL) .Net中间语言(IL)的特性,很大程度上来自于要支持多语言互操作性.要支持多语言互操作性,是因为微软想搞一个大事情,将它的老产品线VB和VC++,VJ++都装入.Net架构中 ...

  9. 解读经典-《C#高级编程》第七版-Chapter1-.Net体系结构-Page1-6

    前言 大家好.这是开通本号的第一篇文章.从事IT行业已经20年了,从使用PowerBuilder做企业信息系统开始,做了七八年开发,然后转型Java不是很成功,从07年之后,我转做产品经理,机缘巧合, ...

随机推荐

  1. 【JAVA编码专题】总结 分类: B1_JAVA 2015-02-11 15:11 290人阅读 评论(0) 收藏

    第一部分:编码基础 为什么需要编码:用计算机看得懂的语言(二进制数)表示各种各样的字符. 一.基本概念 ASCII.Unicode.big5.GBK等为字符集,它们只定义了这个字符集内有哪些字符,以及 ...

  2. jquery-12 jquery中的工具方法有哪些

    jquery-12 jquery中的工具方法有哪些 一.总结 一句话总结:四个较常用方法.1.isArray();2.isFunction();3.isEmptyObejct();4.trim(); ...

  3. ios开发runtime学习二:runtime交换方法

    #import "ViewController.h" /* Runtime(交换方法):主要想修改系统的方法实现 需求: 比如说有一个项目,已经开发了2年,忽然项目负责人添加一个功 ...

  4. ios开发网络学八:NSURLSession相关代理方法

    #import "ViewController.h" @interface ViewController ()<NSURLSessionDataDelegate> /* ...

  5. [Compose] 11. Use Task for Asynchronous Actions

    We refactor a standard node callback style workflow into a composed task-based workflow. For example ...

  6. SendMessageTimeout 的使用

    在WINDOW编程中,发送消息的常用API有SendMessage,PostMessage,PostThreadMessage. 一般每个线程有两个队列:一个用来接收通过Send函数的消息,另外一个队 ...

  7. Linux非图形界面安装程序

    安装Linux程序的时候一般不会调取图形界面,这样输错内容,返回上一步时需要使用命令 previous ,相应的exit 与 next..在中文操作的时候,不会提示,所以要记住 在安装过程中,我们可能 ...

  8. 记录一次对接XX支付SDK过程中报错问题

    我们支付平台以前我不做对接上游的,偶然间替别人做"对接了XX支付的相关接口的工作".在工作过程中发现SDK和对外提供服务过程中很容易出问题.在此做个记录,为了以后相关工作中作为自己 ...

  9. qt-4.8.4安装和环境变量配置

    在Linux中分别安装应用于不同平台的Qt:PC.嵌入式X86:ARM. 这三者PC版.嵌入式X86版和ARM版的差别主要体如今:当configure时分别加了不同的參数,详细差别是: PC平台(X1 ...

  10. 行列式(determinant)的物理意义及性质

    1. 物理(几何)意义 detA=output areainput area 首选,矩阵代表的是线性变换(linear transformation).上式说明一个矩阵的行列式(detA)几何意义上, ...