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

版权声明:本文博客原创文章,博客,未经同意,不得转载。

时间: 2024-07-29 01:04:44

opengl编程指南 第七版 源代码bug Page35 lines.c 红宝书的相关文章

opengl编程指南 第七版 源码有bug Page35 lines.c 红宝书

问题1:当我照着源码敲进去的时候发现,运行的结果不对.哪里不对?源码中没有glPushAttrib(GL_LINE_STIPPLE) glPopAttrib().所以会出现每次更新点画线时在下一次绘制时会以最后一次设置的信息重绘而覆盖掉之前已绘制好的点线.所以要进行状态压栈处理和谈栈处理,这样子在刷帧重绘才不会影响其他帧的绘制结果.(原因是什么目前我也不清楚,估计是状态机的管理问题.要了解内部的绘制机制才行.)但是每次手动添加压栈和弹栈太麻烦了,所以我处理C_style的宏定义形式去实现 问题2

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

解决办法一. #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

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

最近在编译opengl编程指南第八版的示例代码,如下 1 #include <iostream> 2 #include "vgl.h" 3 #include "LoadShaders.h" 4 5 using namespace std; 6 7 8 enum VAO_IDs { Triangles, NumVAOs }; 9 enum Buffer_IDs { ArrayBuffer, NumBuffers }; 10 enum Attrib_IDs

Visual Studio 2017上配置OpenGL编程指南第8版开发环境

一直想学习一下OpenGL,买了红宝书第8版,却因为工作原因一直没有时间看,最近利用周末尝试了一下配置开发环境,遇到了一些坑点,现在记录下来备用. 第一步:打开Visual Studio 2017,建立一个空的C++工程 第二步:新建triangles.cpp文件,并写入书本例子中的代码 /////////////////////////////////////////////////////////////////////// // // triangles.cpp // //////////

在Win7(64位)使用VS2015运行《OpenGL编程指南》第八版第一章程序的方法

前言:笔者第一次用vs2015来实现<OpenGL编程指南>第八版第一个程序时确实花费了不少时间,按照网上教程,尝试了各种方法,最终花费了两个上午加一个下午的时间, 成功运行了程序,花了这么多时间,确实让人懊恼,现在把运行程序的步骤记录下来,以便查阅. 1.第一步,下载oglpg-8th-edith. 如果去书本上的官网下载,下载的是第九版的,而不是第八版的源码. 去其他网站下载,下载的这个包里面没有第一章的源码,可以网上黏贴其他人的代码,建议下第八版源码,下载网址:链接:http://pan

VS15 openGL 编程指南 配置库 triangle例子

最近去图书馆借了一本书<OpenGL编程指南(原书第八版)>,今天倒腾了一天才把第一个例子运行出来. 所以,给大家分享一下,希望能快速解决配置问题. 一.下载需要的库文件 首先,我们需要去该书的网站中下载相关的配置文件,书中给的是"红宝书"的官方网址:http://www.opengl-redbook.com/ 但现在已经更新至第九版,里面的库不是很完整,不适宜用于此书示例. 所以我们要找一个第八版的资源:http://pan.baidu.com/s/1kVpv1MR 下载

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

前言 大家好.这是开通本号的第一篇文章.从事IT行业已经20年了,从使用PowerBuilder做企业信息系统开始,做了七八年开发,然后转型Java不是很成功,从07年之后,我转做产品经理,机缘巧合,在2012年之后,又接触到.Net编程,在2016年正式回归到开发的行列,整整10年.最近几年,在技术上要补以前落下的课,所以变化很快,进步也很快,16年基于DevExpress做Winform开发,17年转到基于asp.net mvc做web开发,再转java web开发,又转Andriod Ja

解读经典《C#高级编程》第七版 Page45-50.核心C#.Chapter2

前言 本篇讲述枚举和名称空间. 01 枚举 首先需要明确枚举的概念:枚举是用户定义的整数类型.使用枚举的目标是,使用一组容易记忆的名称,来使得代码更容易编写和维护. 我们对比枚举的定义和类的定义,会发现它们有像的地方,有不像的地方,这不同之处体现了枚举的特性.我们按下图举例: C#中,一般习惯于一个文件定义一个类.而一个项目中可能有大量枚举,一般建议将多个枚举定义在一个文件中. 很多书中对于枚举只有一个称谓"枚举",但是,如上图,到底是OrgType1是枚举,还是Vendor是枚举?实

解读经典《C#高级编程》第七版 Page50-68.核心C#.Chapter2

前言 本篇讲述Main方法,控制台,注释,预处理指令,编程规范等.这些概念比较琐碎,为避免长篇大论,主要以列举要点的方式来说明. 01 Main方法 Main方法并不是所有应用类型的入口方法,它只是控制台程序.Winform程序的入口方法. 创建项目时自动生成的Main方法,其修饰符是未指定的(未指定时默认为private),这说明入口方法并不要求public修饰符. 可以为应用程序指定多个Main方法,但编译时你必须显式的告诉编译器以哪个方法作为入口,否则编译会报错.所谓显式的告诉编译器,就是