你的glPointSize()会失效吗?

在Windows下第一次使用glPointSize(),发现竟然没有效果orz……
在网上搜了一下,相关文章不多,也没找到答案。
我的代码是参考《计算机图形学》(Computer Graphics with OpenGL,  3e, by Donald Hearn, M. Pauline Baker)中的例子写的。glPointSize在glBegin()和glEnd()之间。书中特别说明,glPointSize()可以在其中使用,改变点的属性。

glBegin (GL_POINTS);
glVertex2i (50,100);
glPointSize (2.0);
glVertex2i (75, 150);
glPointSize (3.0);
glVertex2i (100, 200);
glEnd ();

可惜,根本用不了。

我尝试了一下,发觉把glPointSize()放在glBegin()和glEnd()之外,就可以了。不知道这是不是Windows下的特殊问题,总之有些不方便。


~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~  ~ ~ ~ ~ ~ ~ 
不但glPointSize(),像glLineWidth()这样的函数也不能用在glBegin()和glEnd()之间。
《OpenGL超级宝典》中明确说明“初学者必须注意,必须在glBegin()/glEnd()语句之外调用glPointSize()函数”。可见《计算机图形中》这段代码这错误的。



这里是用C++和图形库OpenGL实现一个简单的动的爱心的示例代码。具体实现方式如下: ```c++ #include <GL/glut.h> #include <math.h> // 设置窗口大小 const GLint W = 800, H = 600; // 设置心形大小 const GLfloat a = 1.5, b = 1.5; // 设置步长 const GLfloat delta = 0.01; // 初始化函数 void init() { glClearColor(0.0, 0.0, 0.0, 0.0); // 设置背景为黑色 glMatrixMode(GL_PROJECTION); // 设置投影模式 glLoadIdentity(); gluOrtho2D(-W / 2, W / 2, -H / 2, H / 2); // 设置正交投影区域 } // 画出一个点 void drawPoint(GLfloat x, GLfloat y) { glBegin(GL_POINTS); glVertex2f(x, y); glEnd(); } // 画出一个心形 void drawHeart() { GLfloat x, y, theta; for (theta = 0.0; theta <= 2 * M_PI; theta += delta) { x = a * pow(sin(theta), 3); y = b * pow(cos(theta), 3); drawPoint(x, y); } } // 显示函数 void display() { glClear(GL_COLOR_BUFFER_BIT); // 清屏 glColor3f(1.0, 0.0, 0.0); // 设置颜色为红色 glPointSize(2.0); // 设置点的大小 drawHeart(); // 画出心形 glutSwapBuffers(); // 切换缓冲区 } // 定时器函数 void timer(int value) { static GLfloat x = 0.0, y = 0.0; static GLfloat dx = 0.02, dy = 0.02; x += dx; y += dy; if (x > W / 2 || x < -W / 2) { dx = -dx; } if (y > H / 2 || y < -H / 2) { dy = -dy; } glMatrixMode(GL_MODELVIEW); // 设置模型视图模式 glLoadIdentity(); glTranslatef(x, y, 0.0); // 平移 glutPostRedisplay(); // 刷新屏幕 glutTimerFunc(50, timer, 0); // 重新注册定时器 } // 主函数 int main(int argc, char** argv) { glutInit(&argc, argv); // 初始化glut库 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); // 设置显示模式 glutInitWindowSize(W, H); // 设置窗口大小 glutInitWindowPosition(100, 100); // 设置窗口位置 glutCreateWindow("Heart"); // 创建窗口 init(); // 初始化 glutDisplayFunc(display); // 注册显示回调函数 glutTimerFunc(50, timer, 0); // 注册定时器函数 glutMainLoop(); // 进入事件循环 return 0; } ``` 运行上述代码后,显示出一个动的爱心,爱心在窗口中上下左右移动。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值