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

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

?? vertexblending.c

?? OpeNGL超級寶典源代碼. OpeNGL超級寶典源代碼.
?? C
?? 第 1 頁 / 共 2 頁
字號:
// VertexBlending.c
// OpenGL SuperBible, Chapter 22
// Demonstrates vertex blending
// 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;
PFNGLVERTEXATTRIB1FARBPROC glVertexAttrib1fARB;
#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;
PFNGLUNIFORM3FVARBPROC glUniform3fvARB;
PFNGLUNIFORMMATRIX4FVARBPROC glUniformMatrix3fvARB;
PFNGLUNIFORMMATRIX4FVARBPROC glUniformMatrix4fvARB;
PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB;
PFNGLGETATTRIBLOCATIONARBPROC glGetAttribLocationARB;

GLboolean lowLevelAvailable = GL_FALSE;
GLboolean highLevelAvailable = GL_FALSE;
GLboolean useHighLevel = GL_FALSE;
GLboolean useBlending = GL_TRUE;
GLboolean showBones = GL_FALSE;

#define TOTAL_SHADERS 1
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] = {"skinning"};

#define WEIGHT_SLOT        1            // locations for low-level attrib and program local parameters
#define LIGHT_POS_SLOT     0
#define MODELVIEW2_SLOT    1

GLint lightPosLoc, mv2Loc, mv2ITLoc;    // locations for high-level uniforms
GLint weightLoc;                        // locations for high-level attribs

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

GLint mainMenu;                         // menu handles

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

GLfloat cameraPos[] = { 50.0f, 75.0f, 50.0f, 1.0f};
GLfloat lightPos[] =  { -50.0f, 100.0f, 50.0f, 1.0f};

GLfloat elbowBend = 45.0f;
GLfloat sphereOfInfluence = 1.0f;       // how much of each limb gets blended

#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);
        }

        lightPosLoc = glGetUniformLocationARB(progObj[0], "lightPos");
        mv2Loc = glGetUniformLocationARB(progObj[0], "mv2");
        mv2ITLoc = glGetUniformLocationARB(progObj[0], "mv2IT");
        weightLoc = glGetAttribLocationARB(progObj[0], "weight");

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

// Draw a cylinder with supplied dimensions
void DrawCylinder(GLfloat length, GLfloat diameter1, GLfloat diameter2, 
                  GLfloat startWeight, GLfloat endWeight)
{
    int numFacets = 50;
    int numSections = 50;
    GLfloat angleIncr = (2.0f * 3.14159f) / (float)numFacets;
    GLfloat sectionLength = length / numSections;
    GLfloat wEnd, influenceStart;
    int i, j;

    // Determine where our influence starts for this limb
    if (startWeight == 0.5f)
    {
        influenceStart = sphereOfInfluence;
    }
    else
    {
        influenceStart = 1.0f - sphereOfInfluence;
    }

    // Skin
    for (i = 0; i < numFacets; i++)
    {
        // Calculate geometry for this facet
        GLfloat angle1 = i * angleIncr;
        GLfloat angle2 = ((i+1)%numFacets) * angleIncr;
        GLfloat y1AtFirstEnd = sin(angle1) * diameter1;
        GLfloat y1AtOtherEnd = sin(angle1) * diameter2;
        GLfloat z1AtFirstEnd = cos(angle1) * diameter1;
        GLfloat z1AtOtherEnd = cos(angle1) * diameter2;
        GLfloat y2AtFirstEnd = sin(angle2) * diameter1;
        GLfloat y2AtOtherEnd = sin(angle2) * diameter2;
        GLfloat z2AtFirstEnd = cos(angle2) * diameter1;
        GLfloat z2AtOtherEnd = cos(angle2) * diameter2;
        GLfloat n1y = y1AtFirstEnd;
        GLfloat n1z = z1AtFirstEnd;
        GLfloat n2y = y2AtFirstEnd;
        GLfloat n2z = z2AtFirstEnd;

        // One strip per facet
        glBegin(GL_QUAD_STRIP);

        glVertexAttrib1fARB(useHighLevel ? weightLoc : WEIGHT_SLOT, 
                            useBlending ? startWeight : 1.0f);
        glNormal3f(0.0f, n1y, n1z);
        glVertex3f(0.0f, y1AtFirstEnd, z1AtFirstEnd);
        glNormal3f(0.0f, n2y, n2z);
        glVertex3f(0.0f, y2AtFirstEnd, z2AtFirstEnd);

        for (j = 0; j < numSections; j++)
        {
            // Calculate geometry for end of this quad
            GLfloat paramEnd = (float)(j+1) / (float)numSections;
            GLfloat lengthEnd = paramEnd * length;
            GLfloat y1End = y1AtFirstEnd + (paramEnd * (y1AtOtherEnd - y1AtFirstEnd));
            GLfloat z1End = z1AtFirstEnd + (paramEnd * (z1AtOtherEnd - z1AtFirstEnd));
            GLfloat y2End = y2AtFirstEnd + (paramEnd * (y2AtOtherEnd - y2AtFirstEnd));
            GLfloat z2End = z2AtFirstEnd + (paramEnd * (z2AtOtherEnd - z2AtFirstEnd));

            // Calculate vertex weights
            if (!useBlending)
            {
                wEnd = 1.0f;
            }
            else if (paramEnd <= influenceStart)
            {
                // Map params [0,influenceStart] to weights [0,1]
                GLfloat p = (paramEnd * (1.0f/influenceStart));

                // We're in the first half of the cylinder: startWeight -> 1
                wEnd = startWeight + p * (1.0f - startWeight);
            }
            else
            {
                // Map params [influenceStart,1] to weights [0,1]
                GLfloat p = (paramEnd-influenceStart) * (1.0f/(1.0f-influenceStart));

                // We're in the second half of the cylinder: 1 -> endWeight
                wEnd = 1.0f + p * (endWeight - 1.0f);
            }

            glVertexAttrib1fARB(useHighLevel ? weightLoc : WEIGHT_SLOT, wEnd);
            glNormal3f(0.0f, n1y, n1z);
            glVertex3f(lengthEnd, y1End, z1End);
            glNormal3f(0.0f, n2y, n2z);
            glVertex3f(lengthEnd, y2End, z2End);
        }

        // End facet strip
        glEnd();
    }

    if (showBones)
    {
        // Skeleton
        glDisable(GL_DEPTH_TEST);
        glEnable(GL_BLEND);
        glColor4f(1.0f, 1.0f, 1.0f, 0.75f);
        glNormal3f(0.0f, 1.0f, 0.0f);
        glVertexAttrib1fARB(useHighLevel ? weightLoc : WEIGHT_SLOT, 1.0f);
        glBegin(GL_LINES);
            glVertex3f(0.0f, 0.0f, 0.0f);
            glVertex3f(length, 0.0f, 0.0f);
        glEnd();
        glColor3f(1.0f, 1.0f, 0.0f);
        glBegin(GL_POINTS);
            glVertex3f(0.0f, 0.0f, 0.0f);
            glVertex3f(length, 0.0f, 0.0f);
        glEnd();
        glEnable(GL_DEPTH_TEST);
        glDisable(GL_BLEND);
    }
}

// Called to draw scene objects
void DrawModels(void)
{
    GLTVector3 lightPosEye;
    GLTMatrix mv, mv2;

    // Transform light position to eye space
    glGetFloatv(GL_MODELVIEW_MATRIX, mv);
    gltTransformPoint(lightPos, mv, lightPosEye);

    if (useHighLevel)
    {
        glUniform3fvARB(lightPosLoc, 1, lightPosEye);
    }
    else
    {
        glProgramLocalParameter4fvARB(GL_VERTEX_PROGRAM_ARB, LIGHT_POS_SLOT, lightPosEye);
    }

    // Setup modelview matrices for upper arm
    glPushMatrix();
    glRotatef(elbowBend, 0.0f, 0.0f, 1.0f);
    glTranslatef(-50.0f, 0.0f, 0.0f);
    glGetFloatv(GL_MODELVIEW_MATRIX, mv2);
    glPopMatrix();
    glTranslatef(-50.0f, 0.0f, 0.0f);

    if (useHighLevel)
    {
        GLTMatrix mv2IT_4x4;
        GLfloat mv2IT_3x3[9];
        GLint i;

        glUniformMatrix4fvARB(mv2Loc, 1, GL_FALSE, mv2);

        gltInvertMatrix(mv2, mv2IT_4x4);

        // Take upper left 3x3 for 2nd normal matrix
        for (i = 0; i < 9; i++)
        {
            mv2IT_3x3[i] = mv2IT_4x4[((i/3)*4)+(i%3)];
        }
        glUniformMatrix3fvARB(mv2ITLoc, 1, GL_TRUE, mv2IT_3x3);
    }
    else
    {
        glMatrixMode(GL_MATRIX0_ARB);
        glLoadMatrixf(mv2);
        glMatrixMode(GL_MODELVIEW);
    }

    // Draw upper arm cylinder
    glColor3f(0.0f, 0.0f, 0.90f);      // Blue
    // 50 long, 10 shoulder, 9 elbow, with weights applied to second half
    DrawCylinder(50.0f, 15.0f, 9.0f, 1.0f, 0.5f);

    // Setup modelview matrices for forearm
    glTranslatef(50.0f, 0.0f, 0.0f);
    glPushMatrix();
    glGetFloatv(GL_MODELVIEW_MATRIX, mv2);
    glPopMatrix();
    glRotatef(elbowBend, 0.0f, 0.0f, 1.0f);

    if (useHighLevel)
    {
        GLTMatrix mv2IT_4x4;
        GLfloat mv2IT_3x3[9];
        GLint i;

        glUniformMatrix4fvARB(mv2Loc, 1, GL_FALSE, mv2);

        gltInvertMatrix(mv2, mv2IT_4x4);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品视频免费看| 国产精品看片你懂得 | 在线视频国内自拍亚洲视频| 69成人精品免费视频| 国产精品色在线观看| 日本欧美久久久久免费播放网| 国产高清成人在线| 91精品久久久久久久91蜜桃| ...中文天堂在线一区| 久久狠狠亚洲综合| 欧美视频一二三区| 1024成人网| 国产91在线看| 精品国产乱码久久久久久闺蜜| 亚洲主播在线播放| 97精品国产97久久久久久久久久久久 | 日本高清不卡aⅴ免费网站| 成人欧美一区二区三区| 日韩av一区二区三区四区| 91原创在线视频| 国产日韩欧美高清在线| 精品午夜一区二区三区在线观看| 91国内精品野花午夜精品| 国产精品剧情在线亚洲| 国产激情视频一区二区三区欧美| 精品国产乱码久久久久久浪潮| 免费在线成人网| 欧美一区二区不卡视频| 日本vs亚洲vs韩国一区三区| 欧美午夜电影一区| 亚洲高清视频中文字幕| 欧美性极品少妇| 亚洲成人av福利| 欧美亚洲高清一区二区三区不卡| 亚洲最色的网站| 欧美三级视频在线| 天堂成人免费av电影一区| 7777精品伊人久久久大香线蕉最新版| 午夜精品久久久久久久久| 欧美日韩国产美| 日本成人中文字幕| 精品久久国产老人久久综合| 国产麻豆欧美日韩一区| 国产精品污网站| 91视频观看视频| 亚洲一区二区美女| 日韩丝袜美女视频| 国产成人亚洲综合色影视| 国产精品三级视频| 色综合久久综合网欧美综合网| 亚洲精品一卡二卡| 欧美日韩你懂的| 久久丁香综合五月国产三级网站| www一区二区| 99精品在线免费| 亚洲国产精品一区二区久久| 91精品国产色综合久久ai换脸 | 九一九一国产精品| 国产免费成人在线视频| 91香蕉视频污| 免费视频一区二区| 国产午夜亚洲精品羞羞网站| 日本道免费精品一区二区三区| 777xxx欧美| 久久99精品国产.久久久久| 日韩精品成人一区二区三区| 精品国产乱码久久久久久夜甘婷婷 | 美女久久久精品| 国产精品传媒入口麻豆| 欧美日韩一区二区在线观看 | 96av麻豆蜜桃一区二区| 婷婷久久综合九色综合绿巨人| 欧美v日韩v国产v| 91麻豆国产精品久久| 日韩av在线播放中文字幕| 国产精品久久久久久久裸模 | 老司机午夜精品| 色偷偷久久一区二区三区| 欧美中文字幕一二三区视频| 蜜桃精品在线观看| 亚洲欧美在线aaa| 日韩视频免费观看高清完整版在线观看| 国产91精品在线观看| 亚洲chinese男男1069| 中文字幕免费在线观看视频一区| 欧美日韩国产中文| youjizz国产精品| 久久99久久精品欧美| 亚洲一区二区美女| 国产精品每日更新| 日韩欧美国产午夜精品| 欧美色偷偷大香| 91丝袜美女网| 国产成人av电影在线观看| 日本sm残虐另类| 亚洲国产精品综合小说图片区| 国产精品看片你懂得| 欧美精品一区二区三区蜜臀| 欧美精品丝袜中出| 欧美在线一区二区三区| 成人黄色片在线观看| 国产综合色视频| 美女视频黄频大全不卡视频在线播放| 亚洲最新视频在线观看| 综合久久国产九一剧情麻豆| 国产日韩欧美综合一区| 欧美成人精品高清在线播放| 9191久久久久久久久久久| 色综合夜色一区| 99久久精品国产导航| 国产成人在线色| 国产成人av电影在线播放| 黄网站免费久久| 久久99日本精品| 久88久久88久久久| 精品一区二区成人精品| 另类小说一区二区三区| 麻豆精品一区二区三区| 久久99国产精品久久| 九色porny丨国产精品| 黄一区二区三区| 国产精品 欧美精品| 国产福利电影一区二区三区| 国产精品一区二区在线看| 国产精品亚洲第一| 国产精品一区在线观看你懂的| 国产成a人无v码亚洲福利| 99久久精品一区| 一本大道久久精品懂色aⅴ| 91福利视频在线| 欧美日韩国产色站一区二区三区| 欧美伦理电影网| 精品国产乱码久久久久久1区2区| 精品久久久久99| 国产精品免费久久久久| 亚洲精品乱码久久久久久日本蜜臀| 一区二区三区四区在线播放| 亚洲18女电影在线观看| 黄色精品一二区| 成人精品国产一区二区4080| 91成人国产精品| 欧美一区二区在线看| 久久香蕉国产线看观看99| 国产精品嫩草99a| 亚洲成人资源在线| 激情综合网av| 色网站国产精品| 日韩欧美在线影院| 中文字幕中文字幕一区二区| 亚洲亚洲精品在线观看| 极品瑜伽女神91| 91国产视频在线观看| 欧美变态口味重另类| 亚洲色图视频免费播放| 久久精工是国产品牌吗| 91视频.com| 久久久久久久久久久99999| 亚洲区小说区图片区qvod| 精品在线一区二区三区| 91在线视频观看| 久久综合色综合88| 亚洲午夜精品网| 丁香婷婷综合色啪| 在线播放视频一区| 亚洲色图19p| 国产精品99久久久久久久vr| 欧美午夜片在线看| 欧美国产日本韩| 麻豆91免费观看| 欧美在线一二三四区| 久久久精品国产免费观看同学| 亚洲第四色夜色| www.欧美色图| 久久久精品天堂| 日日夜夜精品视频免费| 一本大道久久a久久精二百| 久久精品这里都是精品| 水蜜桃久久夜色精品一区的特点| bt欧美亚洲午夜电影天堂| 精品国内二区三区| 午夜a成v人精品| 色综合久久天天| 国产精品久久久久四虎| 国产精品一线二线三线精华| 欧美一区二区三区免费| 午夜精品爽啪视频| 在线影视一区二区三区| 亚洲三级电影网站| 成人午夜碰碰视频| 久久蜜桃香蕉精品一区二区三区| 日韩不卡免费视频| 91精品蜜臀在线一区尤物| 亚洲国产aⅴ天堂久久| 欧美吞精做爰啪啪高潮| 亚洲人快播电影网| 91捆绑美女网站| 自拍偷自拍亚洲精品播放| 波多野结衣一区二区三区| 国产精品情趣视频| 成人午夜看片网址|