OpenGL--点参数
来源:互联网 发布:屏幕投影软件 编辑:程序博客网 时间:2024/06/05 04:56
- 理论基础
点参数:在有些情况下,我们对如圆或球体的渲染时,不想用效率较低的多边形近似模拟。这时我们可以用点参数,它根据点和观察点的距离,对点的大小和亮度进行衰减。如:雨滴,飞溅的血滴等。
- 代码示例
#include "GLTools.h"#include "GLShaderManager.h"#ifdef __APPLE__#include <glut/glut.h>#else#define FREEGLUT_STATIC#include <GL/glut.h>#endif/*不识别glPointParameterfEXT(),glPointParameterfvEXT()的解决方案*/#define GL_DISTANCE_ATTENUATION_EXT 0x8129#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128#define GL_POINT_SIZE_MIN_EXT 0x8126#define GL_POINT_SIZE_MAX_EXT 0x8127#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129PFNGLPOINTPARAMETERFARBPROC glPointParameterfEXT;PFNGLPOINTPARAMETERFVARBPROC glPointParameterfvEXT;static GLfloat psize = 7.0;static GLfloat pmax[1];static GLfloat constant[3] = {1.0, 0.0, 0.0};static GLfloat linear[3] = {0.0, 0.12, 0.0};static GLfloat quadratic[3] = {0.0, 0.0, 0.01};void init(void){ glPointParameterfEXT = (PFNGLPOINTPARAMETERFARBPROC)glutGetProcAddress("glPointParameterfARB"); glPointParameterfvEXT = (PFNGLPOINTPARAMETERFVARBPROC)glutGetProcAddress("glPointParameterfvARB"); int i; srand (12345); //随机绘制250个点 glNewList(1, GL_COMPILE); glBegin (GL_POINTS); for (i = 0; i < 250; i++) { glColor3f (1.0, ((rand()/(float) RAND_MAX) * 0.5) + 0.5, rand()/(float) RAND_MAX); /*-5 < x < 5; -5 < y < 5; -5 < z < -45 */ glVertex3f ( ((rand()/(float)RAND_MAX) * 10.0) - 5.0, ((rand()/(float)RAND_MAX) * 10.0) - 5.0, ((rand()/(float)RAND_MAX) * 40.0) - 45.0); } glEnd(); glEndList(); glEnable(GL_DEPTH_TEST); glEnable(GL_POINT_SMOOTH);//点抗锯齿(点是正方形的,开启抗锯齿修正为圆点) glEnable(GL_BLEND);//使用混合形式抗锯齿 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glPointSize(psize);//设置点大小 glGetFloatv(GL_POINT_SIZE_MAX_EXT, pmax);//获得系统支持的最大点 /*param就是一个包含三个浮点值(a,b,c)的数组,分别包含了常 数,线性或二次衰减系数用于根据点与观察点的距离d来计算点的大 小和亮度*/ glPointParameterfvEXT (GL_DISTANCE_ATTENUATION_EXT, linear);}void display(void){ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glCallList (1);//绘制250个点 glutSwapBuffers ();}void reshape (int w, int h){ glViewport (0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode (GL_PROJECTION); glLoadIdentity (); gluPerspective (35.0, 1.0, 0.25, 200.0); glMatrixMode (GL_MODELVIEW); glTranslatef (0.0, 0.0, -10.0);}void keyboard(unsigned char key, int x, int y){ switch (key) { //调整观察点位置 case 'b': glMatrixMode (GL_MODELVIEW); glTranslatef (0.0, 0.0, -0.5); glutPostRedisplay(); break; case 'f': glMatrixMode (GL_MODELVIEW); glTranslatef (0.0, 0.0, 0.5); glutPostRedisplay(); break; case 'c': //根据常数的形式来算点大小与亮度 glPointParameterfvEXT (GL_DISTANCE_ATTENUATION_EXT, constant); glutPostRedisplay(); break; case 'l': //根据线性的形式计算点大小与亮度 glPointParameterfvEXT (GL_DISTANCE_ATTENUATION_EXT, linear); glutPostRedisplay(); break; case 'q': //根据二次衰减系数的形式计算点大小与亮度 glPointParameterfvEXT (GL_DISTANCE_ATTENUATION_EXT, quadratic); glutPostRedisplay(); break; //调整点大小 case '+': if (psize < (pmax[0] + 1.0)) psize = psize + 1.0; glPointSize (psize); glutPostRedisplay(); break; case '-': if (psize >= 2.0) psize = psize - 1.0; glPointSize (psize); glutPostRedisplay(); break; case 27: exit(0); break; }}int main(int argc, char** argv){ glutInit(&argc, argv); glutInitDisplayMode (GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowSize (500, 500); glutInitWindowPosition (100, 100); glutCreateWindow (argv[0]); init (); glutDisplayFunc (display); glutReshapeFunc (reshape); glutKeyboardFunc (keyboard); glutMainLoop(); return 0;}
0 0
- OpenGL--点参数
- 11.OpenGL--点参数
- 《高效学习OpenGL》 之 点参数 glPointParameter()
- OpenGL 红宝书 反走样 雾 点参数 多边形偏移
- OpenGL: 反走样 雾 点参数 多边形偏移
- opengl点的绘制
- OpenGL: 变换观察点
- OpenGL画点函数
- Opengl绘制点
- opengl画点
- opengl基础画点
- OpenGL画点
- 【OpenGL】绘制一个点
- opengl 点精灵的使用
- opengl 教程(20) 点光源
- OpenGL中鼠标点取
- openGL ES Android 绘制点
- OpenGL中的一些注意点
- dedecms的data目录名称修改方法,data目录修改
- mysql alter修改列字段的长度类型名称详解
- 转载C语言指针
- git 本地忽略跟踪文件
- git版本管理 .gitignore设置
- OpenGL--点参数
- Cordys 给XForm input添加样式,input label 添加 *
- Java深入 - Java虚拟机 常用监控和故障处理工具
- 写给那些在技术路上奔跑的人们!!!!!加油!
- ADF 11g中文件上传配置
- Unity WebSocket
- 百度前端培训 task1
- Spring管理线程
- 中国P2P行业体量已超越美国成为全球第一