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
原创粉丝点击