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

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

?? vertexshaders.c

?? OpeNGL超級寶典源代碼. OpeNGL超級寶典源代碼.
?? C
?? 第 1 頁 / 共 2 頁
字號:
// VertexShaders.c
// OpenGL SuperBible, Chapter 22
// Demonstrates vertex shaders
// Program by Benjamin Lipchak

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

#ifndef __APPLE__
PFNGLPROGRAMSTRINGARBPROC glProgramStringARB;
PFNGLBINDPROGRAMARBPROC glBindProgramARB;
PFNGLDELETEPROGRAMSARBPROC glDeleteProgramsARB;
PFNGLGENPROGRAMSARBPROC glGenProgramsARB;
PFNGLPROGRAMLOCALPARAMETER4FARBPROC glProgramLocalParameter4fARB;
PFNGLPROGRAMLOCALPARAMETER4FVARBPROC glProgramLocalParameter4fvARB;
#endif

PFNGLDELETEOBJECTARBPROC glDeleteObjectARB;
PFNGLGETHANDLEARBPROC glGetHandleARB;
PFNGLDETACHOBJECTARBPROC glDetachObjectARB;
PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB;
PFNGLSHADERSOURCEARBPROC glShaderSourceARB;
PFNGLCOMPILESHADERARBPROC glCompileShaderARB;
PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB;
PFNGLATTACHOBJECTARBPROC glAttachObjectARB;
PFNGLLINKPROGRAMARBPROC glLinkProgramARB;
PFNGLVALIDATEPROGRAMARBPROC glValidateProgramARB;
PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB;
PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB;
PFNGLGETINFOLOGARBPROC glGetInfoLogARB;
PFNGLUNIFORM1FARBPROC glUniform1fARB;
PFNGLUNIFORM3FVARBPROC glUniform3fvARB;
PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB;

#ifndef __APPLE__
PFNGLACTIVETEXTUREPROC glActiveTexture;
#endif

GLboolean lowLevelAvailable = GL_FALSE;
GLboolean highLevelAvailable = GL_FALSE;
GLboolean useHighLevel = GL_FALSE;

#define SIMPLE        0
#define DIFFUSE       1
#define SPECULAR      2
#define SEPSPEC       3
#define TEXSPEC       4
#define THREELIGHTS   5
#define FOGCOORD      6
#define FOG           7
#define PTSIZE        8
#define STRETCH       9
#define TOTAL_SHADERS 10

GLuint ids[TOTAL_SHADERS];                                   // low-level shader object names
GLhandleARB vShader[TOTAL_SHADERS], progObj[TOTAL_SHADERS];  // high-level shader object handles
GLboolean needsValidation[TOTAL_SHADERS];
char *shaderNames[TOTAL_SHADERS] = {"simple", "diffuse", "specular", "sepspec", "texspec", 
                                    "3lights", "fogcoord", "fog", "ptsize", "stretch"};

GLint whichShader = SIMPLE;             // current shader

#define LIGHT0_POS_SLOT     0           // locations for low-level program local parameters
#define LIGHT1_POS_SLOT     1
#define LIGHT2_POS_SLOT     2
#define SQUASH_STRETCH_SLOT 1
#define DENSITY_SLOT        1

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

GLint mainMenu, shaderMenu;             // menu handles

GLint maxTexSize;                       // maximum allowed size for 1D/2D texture

GLfloat cameraPos[] = { 100.0f, 75.0f, 150.0f, 1.0f};
GLfloat lightPos0[] = { 140.0f, 250.0f, 140.0f, 1.0f};
GLfloat lightPos1[] = { -140.0f, 250.0f, 140.0f, 1.0f};
GLfloat lightPos2[] = { 0.0f, 250.0f, -200.0f, 1.0f};

GLfloat squashStretch[] = {1.0f, 1.5f, 0.75f, 1.0f};
GLfloat fogColor[] = {0.5f, 0.8f, 0.5f, 1.0f};
GLfloat lightRotation = 0.0f;
GLfloat density = 0.005f;

#define MAX_INFO_LOG_SIZE 2048

// Create 1D texture to map NdotH to NdotH^128
GLvoid CreatePowMap(GLfloat r, GLfloat g, GLfloat b)
{
    GLfloat texels[512 * 4];
    GLint texSize = (maxTexSize > 512) ? 512 : maxTexSize;
    GLint x;

    for (x = 0; x < texSize; x++)
    {
        // Incoming N.H has been scaled by 8 and biased by -7 to take better
        // advantage of the texture space.  Otherwise, the texture will be
        // entirely zeros until ~7/8 of the way into it.  This way, we expand
        // the useful 1/8 of the range and get better precision.
        texels[x*4+0] = r * pow(((double)x / (double)(texSize-1)) * 0.125f + 0.875f, 128.0);
        texels[x*4+1] = g * pow(((double)x / (double)(texSize-1)) * 0.125f + 0.875f, 128.0);
        texels[x*4+2] = b * pow(((double)x / (double)(texSize-1)) * 0.125f + 0.875f, 128.0);
        texels[x*4+3] = 1.0f;
    }
    // Make sure the first texel is exactly zero.  Most
    // incoming texcoords will clamp to this texel.
    texels[0] = texels[1] = texels[2] = 0.0f;

    glTexImage1D(GL_TEXTURE_1D, 0, GL_RGBA16, texSize, 0, GL_RGBA, GL_FLOAT, texels);
}

// Load shader from disk into a null-terminated string
GLubyte *LoadShaderText(const char *fileName)
{
    GLubyte *shaderText = NULL;
    GLint shaderLength = 0;
    FILE *fp;

    fp = fopen(fileName, "r");
    if (fp != NULL)
    {
        while (fgetc(fp) != EOF)
        {
            shaderLength++;
        }
        rewind(fp);
        shaderText = (GLubyte *)malloc(shaderLength+1);
        if (shaderText != NULL)
        {
            fread(shaderText, 1, shaderLength, fp);
        }
        shaderText[shaderLength] = '\0';
        fclose(fp);
    }

    return shaderText;
}

// Compile shaders
void PrepareShader(GLint shaderNum)
{
    char fullFileName[255];
    GLubyte *vsString;

    // Create low-level shader objects and specify shader text
    if (lowLevelAvailable)
    {
        GLint errorPos;

        #ifdef __APPLE__
        sprintf(fullFileName, "%s.vp", shaderNames[shaderNum]);
        #else
        sprintf(fullFileName, ".\\shaders\\%s.vp", shaderNames[shaderNum]);
        #endif
        vsString = LoadShaderText(fullFileName);
        if (!vsString)
        {
            fprintf(stderr, "Unable to load \"%s\"\n", fullFileName);
            Sleep(5000);
            exit(0);
        }
        glBindProgramARB(GL_VERTEX_PROGRAM_ARB, ids[shaderNum]);
        glProgramStringARB(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(vsString), vsString);
        free(vsString);
        glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errorPos);
        if (errorPos != -1)
        {
            fprintf(stderr, "Error in low-level vertex shader #%d at position %d!\n", shaderNum, errorPos);
            fprintf(stderr, "Error string: %s\n", glGetString(GL_PROGRAM_ERROR_STRING_ARB));
            Sleep(5000);
            exit(0);
        }
    }

    // Create high-level shader objects and specify shader text
    if (highLevelAvailable)
    {
        GLcharARB *vsStringPtr[1];
        GLint success;

        sprintf(fullFileName, ".\\shaders\\%s.vs", shaderNames[shaderNum]);
        vsString = LoadShaderText(fullFileName);
        if (!vsString)
        {
            fprintf(stderr, "Unable to load \"%s\"\n", fullFileName);
            Sleep(5000);
            exit(0);
        }
        vShader[shaderNum] = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
        vsStringPtr[0] = vsString;
        glShaderSourceARB(vShader[shaderNum], 1, vsStringPtr, NULL);
        free(vsString);

        // Compile shaders and check for any errors
        glCompileShaderARB(vShader[shaderNum]);
        glGetObjectParameterivARB(vShader[shaderNum], GL_OBJECT_COMPILE_STATUS_ARB, &success);
        if (!success)
        {
            GLbyte infoLog[MAX_INFO_LOG_SIZE];
            glGetInfoLogARB(vShader[shaderNum], MAX_INFO_LOG_SIZE, NULL, infoLog);
            fprintf(stderr, "Error in high-level vertex shader #%d compilation!\n", shaderNum);
            fprintf(stderr, "Info log: %s\n", infoLog);
            Sleep(10000);
            exit(0);
        }

        // Create program object, attach shader, then link
        progObj[shaderNum] = glCreateProgramObjectARB();
        glAttachObjectARB(progObj[shaderNum], vShader[shaderNum]);

        glLinkProgramARB(progObj[shaderNum]);
        glGetObjectParameterivARB(progObj[shaderNum], GL_OBJECT_LINK_STATUS_ARB, &success);
        if (!success)
        {
            GLbyte infoLog[MAX_INFO_LOG_SIZE];
            glGetInfoLogARB(progObj[shaderNum], MAX_INFO_LOG_SIZE, NULL, infoLog);
            fprintf(stderr, "Error in high-level program #%d linkage!\n", shaderNum);
            fprintf(stderr, "Info log: %s\n", infoLog);
            Sleep(10000);
            exit(0);
        }

        // Program object has changed, so we should revalidate
        needsValidation[shaderNum] = GL_TRUE;
    }
}

// Called to draw scene objects
void DrawModels(void)
{
    GLTVector3 lightPosEye0, lightPosEye1, lightPosEye2;
    GLTMatrix mv;

    // Transform light position to eye space
    glPushMatrix();
    glRotatef(lightRotation, 0.0, 1.0, 0.0);
    glGetFloatv(GL_MODELVIEW_MATRIX, mv);
    gltTransformPoint(lightPos0, mv, lightPosEye0);
    if (whichShader == THREELIGHTS)
    {
        gltTransformPoint(lightPos1, mv, lightPosEye1);
        gltTransformPoint(lightPos2, mv, lightPosEye2);
    }
    glPopMatrix();

    if (useHighLevel)
    {
        GLint uniformLoc = glGetUniformLocationARB(progObj[whichShader], "lightPos0");
        if (uniformLoc != -1)
        {
            glUniform3fvARB(uniformLoc, 1, lightPosEye0);
        }
        uniformLoc = glGetUniformLocationARB(progObj[whichShader], "lightPos1");
        if (uniformLoc != -1)
        {
            glUniform3fvARB(uniformLoc, 1, lightPosEye1);
        }
        uniformLoc = glGetUniformLocationARB(progObj[whichShader], "lightPos2");
        if (uniformLoc != -1)
        {
            glUniform3fvARB(uniformLoc, 1, lightPosEye2);
        }
        uniformLoc = glGetUniformLocationARB(progObj[whichShader], "squashStretch");
        if (uniformLoc != -1)
        {
            glUniform3fvARB(uniformLoc, 1, squashStretch);
        }
        uniformLoc = glGetUniformLocationARB(progObj[whichShader], "density");
        if (uniformLoc != -1)
        {
            glUniform1fARB(uniformLoc, density);
        }
    }
    else
    {
        glProgramLocalParameter4fvARB(GL_VERTEX_PROGRAM_ARB, LIGHT0_POS_SLOT, lightPosEye0);
        if (whichShader == THREELIGHTS)
        {
            glProgramLocalParameter4fvARB(GL_VERTEX_PROGRAM_ARB, LIGHT1_POS_SLOT, lightPosEye1);
            glProgramLocalParameter4fvARB(GL_VERTEX_PROGRAM_ARB, LIGHT2_POS_SLOT, lightPosEye2);
        } else if (whichShader == STRETCH)
        {
            glProgramLocalParameter4fvARB(GL_VERTEX_PROGRAM_ARB, SQUASH_STRETCH_SLOT, squashStretch);
        } else if (whichShader == FOG)
        {
            glProgramLocalParameter4fARB(GL_VERTEX_PROGRAM_ARB, DENSITY_SLOT, density, 0.0f, 0.0f, 0.0f);
        }
    }

    // Draw plane that the objects rest on
    glColor3f(0.0f, 0.0f, 0.90f); // Blue
    glNormal3f(0.0f, 1.0f, 0.0f);
    glBegin(GL_QUADS);
        glVertex3f(-100.0f, -25.0f, -100.0f);
        glVertex3f(-100.0f, -25.0f, 100.0f);		
        glVertex3f(100.0f,  -25.0f, 100.0f);
        glVertex3f(100.0f,  -25.0f, -100.0f);
    glEnd();

    // Draw red cube
    glColor3f(1.0f, 0.0f, 0.0f);
    glutSolidCube(48.0f);

    // Draw green sphere
    glColor3f(0.0f, 1.0f, 0.0f);
    glPushMatrix();
    glTranslatef(-60.0f, 0.0f, 0.0f);
    glutSolidSphere(25.0f, 50, 50);
    glPopMatrix();

    // Draw magenta torus
    glColor3f(1.0f, 0.0f, 1.0f);
    glPushMatrix();
    glTranslatef(0.0f, 0.0f, 60.0f);
    glutSolidTorus(8.0f, 16.0f, 50, 50);
    glPopMatrix();

    if (whichShader == STRETCH)
    {
        // Cone and teapot are rotated such that their
        // Y and Z squash scales must be switched
        GLfloat rotatedSquashStretch[4];

        rotatedSquashStretch[0] = squashStretch[0];
        rotatedSquashStretch[1] = squashStretch[2];
        rotatedSquashStretch[2] = squashStretch[1];
        rotatedSquashStretch[3] = squashStretch[3];

        if (useHighLevel)
        {
            GLint uniformLoc = glGetUniformLocationARB(progObj[whichShader], "squashStretch");
            if (uniformLoc != -1)
            {
                glUniform3fvARB(uniformLoc, 1, rotatedSquashStretch);
            }
        }
        else
        {
            glProgramLocalParameter4fvARB(GL_VERTEX_PROGRAM_ARB, SQUASH_STRETCH_SLOT, rotatedSquashStretch);
        }
    }

    // Draw yellow cone
    glColor3f(1.0f, 1.0f, 0.0f);
    glPushMatrix();
    glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
    glTranslatef(60.0f, 0.0f, -24.0f);
    glutSolidCone(25.0f, 50.0f, 50, 50);
    glPopMatrix();

    // Draw cyan teapot
    glColor3f(0.0f, 1.0f, 1.0f);
    glPushMatrix();
    glTranslatef(0.0f, 0.0f, -60.0f);
    glutSolidTeapot(25.0f);
    glPopMatrix();
}

// Called to draw scene
void RenderScene(void)
{
    // Track camera angle
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0f, 1.0f, 1.0f, 1000.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(cameraPos[0], cameraPos[1], cameraPos[2], 
              0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
    glViewport(0, 0, windowWidth, windowHeight);
    
    if ((whichShader == FOGCOORD) || (whichShader == FOG))
    {
        // Use a green-gray color for fog
        glClearColor(fogColor[0], fogColor[1], fogColor[2], fogColor[3]);
        glFogf(GL_FOG_DENSITY, density);
    }
    else
    {
        glClearColor(0.0f, 0.0f, 0.0f, 1.0f );
    }
    
    // Clear the window with current clearing color
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    // Validate our shader before first use
    if (needsValidation[whichShader])
    {
        GLint success;

        glValidateProgramARB(progObj[whichShader]);
        glGetObjectParameterivARB(progObj[whichShader], GL_OBJECT_VALIDATE_STATUS_ARB, &success);
        if (!success)
        {
            GLbyte infoLog[MAX_INFO_LOG_SIZE];
            glGetInfoLogARB(progObj[whichShader], MAX_INFO_LOG_SIZE, NULL, infoLog);
            fprintf(stderr, "Error in program #%d validation!\n", whichShader);
            fprintf(stderr, "Info log: %s\n", infoLog);
            Sleep(10000);
            exit(0);
        }

        needsValidation[whichShader] = GL_FALSE;
    }
    
    // Draw objects in the scene
    DrawModels();
    
    if (glGetError() != GL_NO_ERROR)
        fprintf(stderr, "GL Error!\n");

    // Flush drawing commands
    glutSwapBuffers();
}

// This function does any needed initialization on the rendering
// context. 
void SetupRC()
{
    const GLubyte *version;
    GLint i;

    fprintf(stdout, "Vertex Shaders Demo\n\n");

    // Make sure required functionality is available!
    if (gltIsExtSupported("GL_ARB_vertex_shader") &&
        gltIsExtSupported("GL_ARB_shader_objects") &&
        gltIsExtSupported("GL_ARB_shading_language_100"))
    {

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久天堂av| 91高清在线观看| 久久综合成人精品亚洲另类欧美 | 精品久久久久久久久久久久久久久久久| 亚洲黄色小视频| 在线视频观看一区| 蜜桃视频一区二区| 在线不卡免费av| 国产一区二区三区观看| 国产日韩欧美综合在线| 99久久精品久久久久久清纯| 一区二区三区.www| 精品视频一区二区不卡| 美女视频免费一区| 国产亚洲欧美日韩俺去了| 不卡视频免费播放| 一区二区三区成人在线视频| 欧美日韩精品一区二区天天拍小说| 日本不卡一二三| 欧美极品aⅴ影院| 欧美亚洲自拍偷拍| 经典三级在线一区| 亚洲欧美乱综合| 欧美一区二区久久| caoporn国产一区二区| 午夜视黄欧洲亚洲| 国产精品视频免费看| 欧美亚洲国产一区二区三区| 久久国产婷婷国产香蕉| 中文字幕一区二区三区蜜月| 欧美日韩大陆一区二区| 国产不卡在线一区| 日韩av中文字幕一区二区| 中国色在线观看另类| 欧美肥大bbwbbw高潮| 成人18视频在线播放| 亚洲一卡二卡三卡四卡无卡久久 | 国产999精品久久久久久绿帽| 一区二区三区**美女毛片| 26uuu精品一区二区在线观看| 在线精品视频一区二区| 国产精品一区二区在线观看网站 | 国产精品99久久久久| 一区二区视频在线| 国产亚洲欧美色| 日韩欧美高清dvd碟片| 91视频免费看| 国产精品亚洲午夜一区二区三区| 亚洲午夜在线电影| 国产精品毛片高清在线完整版| 欧美一区二区三区在线电影| 91性感美女视频| 成人精品视频一区| 激情综合色播五月| 日韩激情av在线| 亚洲一本大道在线| 1024成人网色www| 国产亚洲婷婷免费| 日韩一区和二区| 精品视频999| 91成人国产精品| 99精品1区2区| 波多野结衣中文字幕一区| 国产在线精品一区二区不卡了| 日韩精品视频网站| 亚洲地区一二三色| 亚洲综合视频在线| 亚洲一区二区五区| 一区二区三区免费看视频| 国产精品国产三级国产三级人妇 | 国产91富婆露脸刺激对白| 免费一级欧美片在线观看| 天天影视色香欲综合网老头| 亚洲第一成人在线| 午夜精品免费在线观看| 亚瑟在线精品视频| 污片在线观看一区二区| 亚洲图片欧美一区| 日韩电影在线观看网站| 日本网站在线观看一区二区三区| 香蕉成人伊视频在线观看| 亚洲电影在线播放| 日韩黄色免费电影| 久久91精品久久久久久秒播| 极品尤物av久久免费看| 国产成人综合视频| av在线不卡电影| 欧美性极品少妇| 欧美一区二区三区婷婷月色 | 粉嫩绯色av一区二区在线观看| 国产精一区二区三区| 国产不卡免费视频| 91在线免费播放| 欧美日韩久久一区| 欧美肥妇free| 久久精品视频一区二区三区| 国产精品伦一区| 亚洲精品成a人| 水野朝阳av一区二区三区| 伦理电影国产精品| 成人污视频在线观看| 欧美在线高清视频| 欧美一区日本一区韩国一区| 国产日韩精品一区| 一区二区在线免费观看| 蜜乳av一区二区| 成人app下载| 欧美精品国产精品| 久久久久久电影| 亚洲一区二区3| 国产麻豆精品theporn| 91丨porny丨国产| 精品国产亚洲一区二区三区在线观看| 欧美激情在线一区二区三区| 亚洲精品综合在线| 精品一区二区在线视频| www.爱久久.com| 欧美精品vⅰdeose4hd| 国产日韩欧美综合一区| 亚洲国产一区二区在线播放| 国产九色sp调教91| 欧美日韩视频专区在线播放| 欧美激情中文不卡| 日韩高清一区二区| 99在线热播精品免费| 日韩亚洲欧美一区| 亚洲色图一区二区| 国产一区 二区 三区一级| 欧美亚一区二区| 国产精品欧美极品| 免费在线看成人av| 欧美视频一区在线| 国产精品美女久久久久aⅴ| 美腿丝袜亚洲综合| 欧美性受极品xxxx喷水| 中国色在线观看另类| 久久 天天综合| 欧美一区二视频| 亚洲午夜羞羞片| 色综合 综合色| 国产欧美日韩久久| 奇米888四色在线精品| 91成人免费电影| 亚洲精选视频免费看| 波多野结衣中文字幕一区| 精品国产乱码久久久久久牛牛| 亚洲国产精品一区二区久久恐怖片| 成人av资源站| 国产精品久久久久一区二区三区共| 久久99精品一区二区三区| 91精品免费在线| 丝袜美腿亚洲色图| 欧美午夜理伦三级在线观看| 亚洲美女免费视频| 99精品视频在线免费观看| 欧美国产一区二区| 懂色av中文一区二区三区| 久久久久成人黄色影片| 国内精品视频666| 久久婷婷成人综合色| 久久精品99久久久| 日韩精品一区二区三区视频在线观看| 日韩中文字幕亚洲一区二区va在线| 精品视频1区2区| 日韩制服丝袜av| 日韩免费视频一区二区| 激情综合网最新| 国产视频一区不卡| 国产.欧美.日韩| 亚洲欧洲av另类| 91极品美女在线| 亚洲成a人片综合在线| 欧美日韩一区在线| 日韩不卡一区二区三区| 日韩一级精品视频在线观看| 欧美aa在线视频| 久久你懂得1024| 99视频精品在线| 夜夜嗨av一区二区三区| 欧美日韩在线播放三区四区| 日韩电影免费一区| 精品裸体舞一区二区三区| 国产一区二区主播在线| 国产精品入口麻豆九色| av亚洲精华国产精华| 亚洲综合视频网| 日韩免费观看2025年上映的电影| 韩日av一区二区| 成人欧美一区二区三区1314| 欧美中文字幕一区| 日本亚洲免费观看| 国产日韩三级在线| 欧美天堂亚洲电影院在线播放 | 麻豆精品新av中文字幕| 精品国产一区二区三区久久影院 | 国产成人精品一区二区三区四区| 国产丝袜美腿一区二区三区| 91在线播放网址| 日本成人中文字幕在线视频| 日韩亚洲欧美综合|