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



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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内容简介: 《OpenGL编程指南(原书第7版)》对OpenGL以及OpenGL实用函数库进行了全面而又权威的介绍,素有“OpenGL红宝书”之誉。《OpenGL编程指南(原书第7版)》的上一个版本覆盖了到OpenGL 2.1版的内容。本版涵盖了OpenGL 3.0和3.1的最新特性。本书以清晰的语言描述了OpenGL的功能以及许多基本的计算机图形技巧,例如创建和渲染3d模型、从不同的透视角度观察物体、使用着色、光照和纹理贴图使场景更加逼真等。另外,本书还深入探讨了许多高级技巧,包括纹理贴图、抗锯齿、雾和大气效果、nurbs、图像处理子集等。此外,《OpenGL编程指南(原书第7版)》还对一些重要的主题进行了讨论,例如提高性能、OpenGL扩展以及跨平台技术等。本书内容详实,讲解生动,图文并茂,是OpenGL程序员的绝佳编程指南OpenGL是一种功能强大的软件接口,既可以用于生成高质量的计算机图像,也可以用于编写使用2d和3d物体、位图和彩色图像的交互式应用程序。 《OpenGL编程指南(原书第7版)》对OpenGL以及OpenGL实用函数库进行了全面而又权威的介绍,素有“OpenGL红宝书”之誉。《OpenGL编程指南(原书第7版)》的上一个版本覆盖了截止OpenGL 2.1版的内容。这一版涵盖了OpenGL 3.0和3.1的最新特性。《OpenGL编程指南(原书第7版)》清晰的语言描述了OpenGL的功能以及许多基本的计算机图形技巧,例如创建和渲染3d模型、从不同的透视角度观察物体、使用着色、光照和纹理贴图使场景更加逼真等。本书还深入探讨了许多高级技巧,包括纹理贴图、抗锯齿、雾和大气效果、nurbs、图像处理等。另外,《OpenGL编程指南(原书第7版)》还对一些重要的主题进行了讨论,例如提高性能、OpenGL扩展以及跨平台技术等。 《OpenGL编程指南(原书第7版)》进行了一些更新,涵盖了OpenGL 3.0和3.1的最新特性,包括: 使用帧缓冲区对象进行离屏渲染和纹理更新。 各种新的缓冲区对象类型的示例,包括uniform缓冲区对象、变换反馈缓冲区和顶点数组对象。 使用纹理数组提高使用众多纹理的性能。 使用图元重启和条件渲染来高效地进行渲染。 介绍OpenGL的废弃机制,以及如何针对OpenGL未来版本验证程序。 《OpenGL编程指南(原书第7版)》继续对OpenGL着色语言(glsl)展开讨论,并解释了使用这种语言创建复杂图形效果并提升OpenGL计算威力的机制。OpenGL技术资料库(OpenGL technical library)提供了大量的OpenGL教程和参考书籍,它可以帮助程序员深入理解OpenGL,完全释放OpenGL的潜力。这个资料库最初由sgi开发,目前由khronos OpenGL体系结构审核委员会(arb)工作组维护,这是负责指导OpenGL以及相关技术发展和演变的行业协会。 作者简介: Dave Shreiner是ARM公司的图形技术总监,长期担任SGI核心OpenGL组的成员。他首次开设了OpenGL的商业培训课程,拥有二十多年的计算机图形应用开发经验。Dava定期参加SIGGRAPH和其他全球性的图形工作会议。他是《OpenGL ES 2.0 Programming Guide》和《OpenGL Reference Manual》的作者,也是Addison-Wesley的OpenGL系列的编辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值