亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? occlusionquery.c

?? OpeNGL超級寶典源代碼. OpeNGL超級寶典源代碼.
?? C
字號:
// OcclusionQuery.c
// OpenGL SuperBible, Chapter 17
// Demonstrates occlusion queries
// Program by Benjamin Lipchak

#include "../../Common/OpenGLSB.h"	// System and OpenGL Stuff
#include "../../Common/GLTools.h"	// OpenGL toolkit
#include <stdio.h>

PFNGLBEGINQUERYPROC        glBeginQuery;
PFNGLDELETEQUERIESPROC     glDeleteQueries;
PFNGLENDQUERYPROC          glEndQuery;
PFNGLGENQUERIESPROC        glGenQueries;
PFNGLGETQUERYIVPROC        glGetQueryiv;
PFNGLGETQUERYOBJECTIVPROC  glGetQueryObjectiv;

GLint windowWidth = 512;                // window size
GLint windowHeight = 512;

GLint mainMenu, bboxMenu;               // menu handles

GLboolean occlusionDetection = GL_TRUE;
GLboolean showBoundingVolume = GL_FALSE;
GLint boundingVolume = 0;
GLuint queryIDs[27];

GLfloat ambientLight[] = { 0.4f, 0.4f, 0.4f, 1.0f};
GLfloat diffuseLight[] = { 0.9f, 0.9f, 0.9f, 1.0f};
GLfloat lightPos[]     = { 100.0f, 300.0f, 100.0f, 1.0f};
GLfloat cameraPos[]    = { 200.0f, 300.0f, 400.0f, 1.0f};

// Called to draw the occluding grid
void DrawOccluder(void)
{
    glColor3f(0.5f, 0.25f, 0.0f);

    glPushMatrix();
    glScalef(30.0f, 30.0f, 1.0f);
    glTranslatef(0.0f, 0.0f, 50.0f);
    glutSolidCube(10.0f);
    glTranslatef(0.0f, 0.0f, -100.0f);
    glutSolidCube(10.0f);
    glPopMatrix();

    glPushMatrix();
    glScalef(1.0f, 30.0f, 30.0f);
    glTranslatef(50.0f, 0.0f, 0.0f);
    glutSolidCube(10.0f);
    glTranslatef(-100.0f, 0.0f, 0.0f);
    glutSolidCube(10.0f);
    glPopMatrix();

    glPushMatrix();
    glScalef(30.0f, 1.0f, 30.0f);
    glTranslatef(0.0f, 50.0f, 0.0f);
    glutSolidCube(10.0f);
    glTranslatef(0.0f, -100.0f, 0.0f);
    glutSolidCube(10.0f);
    glPopMatrix();
}

// Called to draw sphere
void DrawSphere(GLint sphereNum)
{
    GLboolean occluded = GL_FALSE;

    if (occlusionDetection)
    {
        GLint passingSamples;

        // Check if this sphere would be occluded
        glGetQueryObjectiv(queryIDs[sphereNum], GL_QUERY_RESULT, 
                           &passingSamples);
        if (passingSamples == 0)
            occluded = GL_TRUE;
    }

    if (!occluded)
    {
        glutSolidSphere(50.0f, 100, 100);
    }
}

// Called to draw scene objects
void DrawModels(void)
{
    GLint r, g, b;

    if (occlusionDetection || showBoundingVolume)
    {
        // Draw bounding boxes after drawing the main occluder
        DrawOccluder();

        // All we care about for bounding box is resulting depth values
        glShadeModel(GL_FLAT);
        glDisable(GL_LIGHTING);
        glDisable(GL_COLOR_MATERIAL);
        glDisable(GL_NORMALIZE);
        // Texturing is already disabled
        if (!showBoundingVolume)
            glColorMask(0, 0, 0, 0);

        // Draw 27 spheres in a color cube
        for (r = 0; r < 3; r++)
        {
            for (g = 0; g < 3; g++)
            {
                for (b = 0; b < 3; b++)
                {
                    if (showBoundingVolume)
                        glColor3f(r * 0.5f, g * 0.5f, b * 0.5f);

                    glPushMatrix();
                    glTranslatef(100.0f * r - 100.0f, 
                                 100.0f * g - 100.0f, 
                                 100.0f * b - 100.0f);
                    glBeginQuery(GL_SAMPLES_PASSED, queryIDs[(r*9)+(g*3)+b]);
                    switch (boundingVolume)
                    {
                    case 0:
                        glutSolidCube(100.0f);
                        break;
                    case 1:
                        glScalef(150.0f, 150.0f, 150.0f);
                        glutSolidTetrahedron();
                        break;
                    case 2:
                        glScalef(90.0f, 90.0f, 90.0f);
                        glutSolidOctahedron();
                        break;
                    case 3:
                        glScalef(40.0f, 40.0f, 40.0f);
                        glutSolidDodecahedron();
                        break;
                    case 4:
                        glScalef(65.0f, 65.0f, 65.0f);
                        glutSolidIcosahedron();
                        break;
                    }
                    glEndQuery(GL_SAMPLES_PASSED);
                    glPopMatrix();
                }
            }
        }

        if (!showBoundingVolume)
            glClear(GL_DEPTH_BUFFER_BIT);

        // Restore normal drawing state
        glShadeModel(GL_SMOOTH);
        glEnable(GL_LIGHTING);
        glEnable(GL_COLOR_MATERIAL);
        glEnable(GL_NORMALIZE);
        glColorMask(1, 1, 1, 1);
    }

    DrawOccluder();

    // Turn on texturing just for spheres
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_TEXTURE_GEN_S);
    glEnable(GL_TEXTURE_GEN_T);

    // Draw 27 spheres in a color cube
    for (r = 0; r < 3; r++)
    {
        for (g = 0; g < 3; g++)
        {
            for (b = 0; b < 3; b++)
            {
                glColor3f(r * 0.5f, g * 0.5f, b * 0.5f);

                glPushMatrix();
                glTranslatef(100.0f * r - 100.0f, 
                             100.0f * g - 100.0f, 
                             100.0f * b - 100.0f);
                DrawSphere((r*9)+(g*3)+b);
                glPopMatrix();
            }
        }
    }

    glDisable(GL_TEXTURE_2D);
    glDisable(GL_TEXTURE_GEN_S);
    glDisable(GL_TEXTURE_GEN_T);
}

// Called to draw scene
void RenderScene(void)
{
    static GLTStopwatch stopWatch;
    static int frameCounter = 0;
    
    // Get initial time
    if (frameCounter == 0)
        gltStopwatchReset(&stopWatch);


    frameCounter++;
    if (frameCounter == 100)
    {
        frameCounter = 0;
        fprintf(stdout, "FPS: %f\n", 100.0f / gltStopwatchRead(&stopWatch));
        gltStopwatchReset(&stopWatch);
    }

    // Track camera angle
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0f, 1.0f, 10.0f, 10000.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(cameraPos[0], cameraPos[1], cameraPos[2], 
              0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);

    // Clear the window with current clearing color
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    // Draw objects in the scene
    DrawModels();

    if (glGetError() != GL_NO_ERROR)
    {
        fprintf(stderr, "GL Error!\n");
        Sleep(5000);
    }

    // Flush drawing commands
    glutSwapBuffers();

    glutPostRedisplay();
}

// This function does any needed initialization on the rendering
// context. 
void SetupRC()
{
    const GLubyte *version;
    GLboolean glVersion15 = GL_FALSE;
    GLint queryCounterBits;

    fprintf(stdout, "Occlusion Query Demo\n\n");

    // Make sure required functionality is available!
    version = glGetString(GL_VERSION);
    if ((version[0] == '1') && (version[1] == '.') &&
        (version[2] >= '5') && (version[2] <= '9'))
    {
        glVersion15 = GL_TRUE;
    }

    if (!glVersion15 && !gltIsExtSupported("GL_ARB_occlusion_query"))
    {
        fprintf(stderr, "Neither OpenGL 1.5 nor GL_ARB_occlusion_query"
                        " extension is available!\n");
        Sleep(2000);
        exit(0);
    }

    // Load the function pointers
    if (glVersion15)
    {
        glBeginQuery = gltGetExtensionPointer("glBeginQuery");
        glDeleteQueries = gltGetExtensionPointer("glDeleteQueries");
        glEndQuery = gltGetExtensionPointer("glEndQuery");
        glGenQueries = gltGetExtensionPointer("glGenQueries");
        glGetQueryiv = gltGetExtensionPointer("glGetQueryiv");
        glGetQueryObjectiv = gltGetExtensionPointer("glGetQueryObjectiv");
    }
    else
    {
        glBeginQuery = gltGetExtensionPointer("glBeginQueryARB");
        glDeleteQueries = gltGetExtensionPointer("glDeleteQueriesARB");
        glEndQuery = gltGetExtensionPointer("glEndQueryARB");
        glGenQueries = gltGetExtensionPointer("glGenQueriesARB");
        glGetQueryiv = gltGetExtensionPointer("glGetQueryivARB");
        glGetQueryObjectiv = gltGetExtensionPointer("glGetQueryObjectivARB");
    }

    if (!glBeginQuery || !glDeleteQueries || !glEndQuery || !glGenQueries ||
        !glGetQueryiv || !glGetQueryObjectiv)
    {
        fprintf(stderr, "Not all entrypoints were available!\n");
        Sleep(2000);
        exit(0);
    }

    // Make sure query counter bits is non-zero
    glGetQueryiv(GL_SAMPLES_PASSED, GL_QUERY_COUNTER_BITS, &queryCounterBits);
    if (queryCounterBits == 0)
    {
        fprintf(stderr, "Occlusion queries not really supported!\n");
        fprintf(stderr, "Available query counter bits: 0\n");
        Sleep(2000);
        exit(0);
    }
    
    fprintf(stdout, "Controls:\n");
    fprintf(stdout, "\tRight-click for menu\n\n");
    fprintf(stdout, "\tx/X\t\tMove +/- in x direction\n");
    fprintf(stdout, "\ty/Y\t\tMove +/- in y direction\n");
    fprintf(stdout, "\tz/Z\t\tMove +/- in z direction\n\n");
    fprintf(stdout, "\tq\t\tExit demo\n\n");
    
    // Generate occlusion query names
    glGenQueries(27, queryIDs);
    
    // Black background
    glClearColor(0.3f, 0.3f, 0.3f, 1.0f );

    // Hidden surface removal
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);

    // Set up some lighting state that never changes
    glShadeModel(GL_SMOOTH);
    glEnable(GL_LIGHTING);
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_NORMALIZE);
    glEnable(GL_LIGHT0);
    glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);
    glLightfv(GL_LIGHT0, GL_POSITION, lightPos);

    // Set up texturing for spheres
    glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
    glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    {
        GLfloat p[4] = {1.0f/50.0f, 0.0f, 0.0f, -0.5f};
        GLint w, h, c;
        GLenum format;
        GLbyte *texels = gltLoadTGA("logo.tga", &w, &h, &c, &format);
        glTexImage2D(GL_TEXTURE_2D, 0, c, w, h, 0, format, GL_UNSIGNED_BYTE, texels);
        free(texels);
        glTexGenfv(GL_S, GL_OBJECT_PLANE, p);
        p[0] = 0.0f;
        p[1] = 1.0f/50.0f;
        glTexGenfv(GL_T, GL_OBJECT_PLANE, p);
    }
}

void ProcessMenu(int value)
{
    switch(value)
    {
    case 1:
        occlusionDetection = !occlusionDetection;
        if (occlusionDetection)
        {
            glutChangeToMenuEntry(1, "Toggle occlusion query (currently ON)", 1);
        }
        else
        {
            glutChangeToMenuEntry(1, "Toggle occlusion query (currently OFF)", 1);
        }
        break;

    case 2:
        showBoundingVolume = !showBoundingVolume;
        if (showBoundingVolume)
        {
            glutChangeToMenuEntry(2, "Toggle bounding volume (currently ON)", 2);
        }
        else
        {
            glutChangeToMenuEntry(2, "Toggle bounding volume (currently OFF)", 2);
        }
        break;

    default:
        boundingVolume = value - 3;
        glutSetMenu(mainMenu);
        switch (boundingVolume)
        {
        case 0:
            glutChangeToSubMenu(3, "Choose bounding volume (currently BOX)", bboxMenu);
            break;
        case 1:
            glutChangeToSubMenu(3, "Choose bounding volume (currently TETRAHEDRON)", bboxMenu);
            break;
        case 2:
            glutChangeToSubMenu(3, "Choose bounding volume (currently OCTAHEDRON)", bboxMenu);
            break;
        case 3:
            glutChangeToSubMenu(3, "Choose bounding volume (currently DODECAHEDRON)", bboxMenu);
            break;
        case 4:
            glutChangeToSubMenu(3, "Choose bounding volume (currently ICOSAHEDRON)", bboxMenu);
            break;
        }
        break;
    }

    // Refresh the Window
    glutPostRedisplay();
}

void KeyPressFunc(unsigned char key, int x, int y)
{
    switch (key)
    {
    case 'b':
    case 'B':
        boundingVolume = (boundingVolume+1)%5;
        break;
    case 's':
    case 'S':
        showBoundingVolume = !showBoundingVolume;
        break;
    case 'o':
    case 'O':
        occlusionDetection = !occlusionDetection;
        break;
    case 'x':
        cameraPos[0] += 5.0f;
        break;
    case 'X':
        cameraPos[0] -= 5.0f;
        break;
    case 'y':
        cameraPos[1] += 5.0f;
        break;
    case 'Y':
        cameraPos[1] -= 5.0f;
        break;
    case 'z':
        cameraPos[2] += 5.0f;
        break;
    case 'Z':
        cameraPos[2] -= 5.0f;
        break;
    case 'q':
    case 'Q':
    case 27 : /* ESC */
        exit(0);
    }

    // Refresh the Window
    glutPostRedisplay();
}

void SpecialKeys(int key, int x, int y)
{
    switch (key)
    {
    case GLUT_KEY_LEFT:
        cameraPos[0] += 5.0f;
        break;
    case GLUT_KEY_RIGHT:
        cameraPos[0] -= 5.0f;
        break;
    case GLUT_KEY_UP:
        cameraPos[1] += 5.0f;
        break;
    case GLUT_KEY_DOWN:
        cameraPos[1] -= 5.0f;
        break;
    default:
        break;
    }

    // Refresh the Window
    glutPostRedisplay();
}

void ChangeSize(int w, int h)
{
    windowWidth = w;
    windowHeight = h;

    glViewport(0, 0, windowWidth, windowHeight);
}

int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(windowWidth, windowHeight);
    glutCreateWindow("Occlusion Query Demo");
    glutReshapeFunc(ChangeSize);
    glutKeyboardFunc(KeyPressFunc);
    glutSpecialFunc(SpecialKeys);
    glutDisplayFunc(RenderScene);

    // Create the Menu
    bboxMenu = glutCreateMenu(ProcessMenu);
    glutAddMenuEntry("BOX (CUBE)", 3);
    glutAddMenuEntry("TETRAHEDRON", 4);
    glutAddMenuEntry("OCTAHEDRON", 5);
    glutAddMenuEntry("DODECAHEDRON", 6);
    glutAddMenuEntry("ICOSAHEDRON", 7);

    mainMenu = glutCreateMenu(ProcessMenu);
    glutAddMenuEntry("Toggle occlusion query (currently ON)", 1);
    glutAddMenuEntry("Show bounding volume (currently OFF)", 2);
    glutAddSubMenu("Choose bounding volume (currently BOX)", bboxMenu);
    glutAttachMenu(GLUT_RIGHT_BUTTON);

    SetupRC();

    glutMainLoop();

    if (glDeleteQueries)
        glDeleteQueries(27, queryIDs);

    return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩欧美色综合| 国产精品一区二区黑丝| 91精品国产色综合久久| 美女视频一区在线观看| 2023国产精品自拍| 激情深爱一区二区| 国产精品午夜电影| 在线精品亚洲一区二区不卡| 蜜臀av一区二区在线观看| 国产欧美一区二区三区在线看蜜臀 | 91麻豆视频网站| 日韩精品国产欧美| 中文字幕亚洲精品在线观看| 91麻豆国产在线观看| 国内一区二区视频| 亚洲一级片在线观看| 久久先锋影音av| 欧美肥大bbwbbw高潮| 成人91在线观看| 亚洲国产精品久久人人爱| 国产精品乱码妇女bbbb| 欧美一区二区久久| 91麻豆文化传媒在线观看| 麻豆91精品视频| 亚洲欧美激情一区二区| 精品久久国产97色综合| 3atv一区二区三区| 色老汉一区二区三区| 国产精品一线二线三线精华| 免费在线看成人av| 亚洲一区自拍偷拍| 国产精品夫妻自拍| 日韩一区二区三区观看| 91成人免费在线视频| 国产成人亚洲综合a∨猫咪| 性欧美疯狂xxxxbbbb| 1区2区3区欧美| 国产亚洲婷婷免费| 欧美肥胖老妇做爰| 色哟哟国产精品免费观看| 成人午夜电影久久影院| 国产福利视频一区二区三区| 国产精品亚洲а∨天堂免在线| 久久99在线观看| 九色综合狠狠综合久久| 久久精品国产成人一区二区三区 | 亚洲最新视频在线观看| 一区二区三区资源| 亚洲va欧美va人人爽午夜| 亚洲成人激情av| 午夜电影一区二区三区| 日韩成人免费电影| 捆绑变态av一区二区三区| 精品亚洲欧美一区| 国产成人精品亚洲日本在线桃色| 国产高清亚洲一区| 成人av片在线观看| 91久久一区二区| 欧美电影一区二区| 欧美xxxxx裸体时装秀| 久久亚洲免费视频| 国产精品欧美一区喷水| 亚洲另类色综合网站| 亚洲一区视频在线观看视频| 亚洲国产成人av网| 免费在线看成人av| 国产河南妇女毛片精品久久久| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 激情综合一区二区三区| 国产成人免费视频精品含羞草妖精| jizzjizzjizz欧美| 欧洲av在线精品| 欧美va日韩va| 1024精品合集| 日韩黄色一级片| 成人永久看片免费视频天堂| 在线观看91精品国产入口| 日韩三级在线免费观看| 亚洲国产精品t66y| 亚洲国产中文字幕在线视频综合| 捆绑变态av一区二区三区| fc2成人免费人成在线观看播放| 欧美性猛交一区二区三区精品| 欧美成人一区二区三区在线观看 | 欧美一区在线视频| 久久精品欧美日韩| 亚洲第一会所有码转帖| 国产成人自拍网| 欧美乱妇15p| 国产亚洲精品超碰| 亚洲欧美另类小说视频| 美女视频黄频大全不卡视频在线播放| 不卡一区在线观看| 欧美一区二区日韩一区二区| 国产精品乱码人人做人人爱| 日本最新不卡在线| 99精品久久只有精品| 日韩午夜电影在线观看| 亚洲品质自拍视频| 国产一区二区三区美女| 欧美色欧美亚洲另类二区| 欧美激情自拍偷拍| 日本伊人色综合网| 91美女视频网站| 久久精品一区二区三区四区| 爽好多水快深点欧美视频| 91丨九色丨尤物| 国产女主播在线一区二区| 奇米四色…亚洲| 在线观看日韩毛片| 日本一区二区三区在线观看| 久久精品噜噜噜成人88aⅴ| 欧洲一区二区三区在线| 日本一区二区成人在线| 久久aⅴ国产欧美74aaa| 欧美久久高跟鞋激| 亚洲精品中文字幕在线观看| 成人久久视频在线观看| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 国产欧美视频在线观看| 日韩**一区毛片| 欧美美女bb生活片| 亚洲一区欧美一区| 色综合久久中文字幕综合网| 国产精品丝袜久久久久久app| 国产在线日韩欧美| 欧美v日韩v国产v| 九九久久精品视频| 欧美电影免费观看高清完整版在| 丝袜亚洲另类欧美| 欧美绝品在线观看成人午夜影视| 亚洲一区二区三区国产| 欧美在线小视频| 夜夜爽夜夜爽精品视频| 色94色欧美sute亚洲线路一ni| √…a在线天堂一区| aaa国产一区| 中文字幕亚洲视频| 色欧美88888久久久久久影院| 亚洲人成网站影音先锋播放| 色视频成人在线观看免| 亚洲国产另类av| 欧美美女一区二区三区| 蜜臀av一区二区在线观看 | 国产亚洲精品aa午夜观看| 国产成人午夜99999| 中文字幕的久久| 99精品视频在线观看| 一区二区三区加勒比av| 欧美日韩中文另类| 日本不卡一区二区| 欧美xxxxxxxx| 国产99久久精品| 亚洲欧美日韩中文字幕一区二区三区 | 视频一区二区中文字幕| 91精品国产91久久久久久一区二区| 麻豆精品精品国产自在97香蕉| 日韩伦理免费电影| 欧美主播一区二区三区| 日本最新不卡在线| 久久久久久久久久久电影| av色综合久久天堂av综合| 亚洲精品写真福利| 欧美日韩国产天堂| 精品一二三四在线| 国产精品国产三级国产普通话蜜臀| 日本道精品一区二区三区| 青青草精品视频| 国产校园另类小说区| 91色乱码一区二区三区| 日日欢夜夜爽一区| 国产校园另类小说区| 欧美视频自拍偷拍| 九色综合国产一区二区三区| 国产精品美女www爽爽爽| 精品视频1区2区| 国内精品在线播放| 1024成人网| 欧美成人一级视频| 91麻豆蜜桃一区二区三区| 日韩精彩视频在线观看| 国产女人18水真多18精品一级做| 日本精品一区二区三区高清| 美女视频免费一区| 亚洲另类在线视频| 久久久亚洲欧洲日产国码αv| 色综合久久综合中文综合网| 国内精品免费在线观看| 一区二区三区在线观看欧美| 精品国产乱码久久久久久夜甘婷婷| 99国产精品久久久| 久久99最新地址| 午夜影院在线观看欧美| 日本一区二区成人| 日韩欧美国产wwwww| 在线免费观看一区| 国产精品12区| 天堂在线亚洲视频| 亚洲免费av观看| 国产精品无圣光一区二区|