• glsl 多重纹理


    #include"glsl.h"
    void SHADER::drawBox()
    {
        glBegin(GL_QUADS);
        // Front Face
        glNormal3f( 0.0f, 0.0f, 1.0f);
        glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);
        glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);
        glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);
        glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);
        // Back Face
        glNormal3f( 0.0f, 0.0f,-1.0f);
        glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
        glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);
        glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);
        glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
        // Top Face
        glNormal3f( 0.0f, 1.0f, 0.0f);
        glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);
        glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,  1.0f,  1.0f);
        glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,  1.0f,  1.0f);
        glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);
        // Bottom Face
        glNormal3f( 0.0f,-1.0f, 0.0f);
        glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
        glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
        glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);
        glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);
        // Right face
        glNormal3f( 1.0f, 0.0f, 0.0f);
        glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
        glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);
        glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);
        glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);
        // Left Face
        glNormal3f(-1.0f, 0.0f, 0.0f);
        glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
        glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);
        glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);
        glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);
        glEnd();
    }
    
    void SHADER::drawMuBox()
    {
        glBegin(GL_QUADS);
        glMultiTexCoord2f(GL_TEXTURE0,0.0f, 0.0f);
        glMultiTexCoord2f(GL_TEXTURE1,0.0f, 0.0f);
        glVertex2f(-10.0 , -10.0 );
    
        glMultiTexCoord2f(GL_TEXTURE0,1.0f, 0.0f);
        glMultiTexCoord2f(GL_TEXTURE1,1.0f, 0.0f);
        glVertex2f(10 , -10.0 );
    
        glMultiTexCoord2f(GL_TEXTURE0,1.0f, 1.0f);
        glMultiTexCoord2f(GL_TEXTURE1,1.0f, 1.0f);
        glVertex2f(10.0 , 10.0 );
    
        glMultiTexCoord2f(GL_TEXTURE0,0.0f, 1.0f);
        glMultiTexCoord2f(GL_TEXTURE1,0.0f, 1.0f);
        glVertex2f(-10.0 , 10.0);
        glEnd();
    }
    void SHADER::setup()
    {
        init_light();
        setShaders();
        m_fps.setup();
        m_img1.Load("2.jpg");
        m_img2.Load("3.jpg");
    }
    char * SHADER::textFileRead(char *fn) 
    {
    
    
        FILE *fp;
        char *content = NULL;
    
        int count=0;
    
        if (fn != NULL) 
        {
            fp = fopen(fn,"rt");
    
            if (fp != NULL) 
            {
    
                fseek(fp, 0, SEEK_END);
                count = ftell(fp);
                rewind(fp);
    
                if (count > 0) 
                {
                    content = (char *)malloc(sizeof(char) * (count+1));
                    count = fread(content,sizeof(char),count,fp);
                    content[count] = '';
                }
                fclose(fp);
            }
        }
        return content;
    }
    
    
    
    void SHADER::setShaders()
    {
        char *vs = NULL,*fs = NULL,*fs2 = NULL;
        v = glCreateShader(GL_VERTEX_SHADER);
        f = glCreateShader(GL_FRAGMENT_SHADER);
        f2 = glCreateShader(GL_FRAGMENT_SHADER);
    
        vs = textFileRead("toonf2.vert");
        fs = textFileRead("toonf2.frag");
    
        const char * vv = vs;
        const char * ff = fs;
    
        glShaderSource(v, 1, &vv,NULL);
        glShaderSource(f, 1, &ff,NULL);
    
        free(vs);free(fs);
    
        glCompileShader(v);
        glCompileShader(f);
    
        printShaderInfoLog(v);
        printShaderInfoLog(f);
        printShaderInfoLog(f2);
    
        p = glCreateProgram();
        glAttachShader(p,v);
        glAttachShader(p,f);
    
        glLinkProgram(p);
        printProgramInfoLog(p);
    
        glUseProgram(p);
        loc = glGetUniformLocation(p,"time");
    
        samplerA = glGetUniformLocation(p, "texA");
        glUniform1i(samplerA, 0); // pass in texture
    
        samplerB = glGetUniformLocation(p, "texB");
        glUniform1i(samplerB, 1); // pass in texture
    }
    
    
    void SHADER::draw()
    {
        static float angle =0.0f;
        static float time =0.0f;
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    
    
        glLoadIdentity();
        glTranslatef(0,-5,-100);
        glRotatef(angle++,0,1,0);
            
        glUniform1f(loc, time);
        glScalef(6.0,6.0f,6.0);
        //glutSolidTeapot(1);
        glEnable(GL_TEXTURE_2D);
        glActiveTexture(GL_TEXTURE0); 
        glBindTexture(GL_TEXTURE_2D, m_img1.ID);  
        glActiveTexture(GL_TEXTURE1); 
        glBindTexture(GL_TEXTURE_2D,m_img2.ID); 
    //    glBindTexture(GL_TEXTURE_2D,m_img1.ID);
        drawBox();
        //drawMuBox();
        glDisable(GL_TEXTURE_2D);
        time+=0.01f;
        m_fps.update();
        //printf("fps:%d 
    ",m_fps.getFPS());
        
    }
    
    
    void SHADER::init_light()
    {
        static GLfloat LightAmbient[]= { 0.5f, 0.5f, 0.5f, 1.0f };                 // 环境光参数
        static GLfloat LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 1.0f };                 // 漫射光参数
        static GLfloat LightPosition[]= { 0.0f, 100.0f, 2.0f, 1.0f };                 // 光源位置
    
    
    
        glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient);                // 设置环境光
        glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);                // 设置漫射光
        glLightfv(GL_LIGHT1, GL_POSITION,LightPosition);            // 设置光源位置
    
        glEnable(GL_LIGHT1);                            // 启用一号光源
        glEnable(GL_LIGHTING);
    
    }
    
    
    int SHADER::printOglError(char *file, int line)
    {
        //
        // Returns 1 if an OpenGL error occurred, 0 otherwise.
        //
        GLenum glErr;
        int    retCode = 0;
    
        glErr = glGetError();
        while (glErr != GL_NO_ERROR)
        {
            printf("glError in file %s @ line %d: %s
    ", file, line, gluErrorString(glErr));
            retCode = 1;
            glErr = glGetError();
        }
        return retCode;
    }
    
    
    void SHADER::printShaderInfoLog(GLuint obj)
    {
        int infologLength = 0;
        int charsWritten  = 0;
        char *infoLog;
    
        glGetShaderiv(obj, GL_INFO_LOG_LENGTH,&infologLength);
    
        if (infologLength > 0)
        {
            infoLog = (char *)malloc(infologLength);
            glGetShaderInfoLog(obj, infologLength, &charsWritten, infoLog);
            printf("%s
    ",infoLog);
            free(infoLog);
        }
    }
    
    void SHADER::printProgramInfoLog(GLuint obj)
    {
        int infologLength = 0;
        int charsWritten  = 0;
        char *infoLog;
    
        glGetProgramiv(obj, GL_INFO_LOG_LENGTH,&infologLength);
    
        if (infologLength > 0)
        {
            infoLog = (char *)malloc(infologLength);
            glGetProgramInfoLog(obj, infologLength, &charsWritten, infoLog);
            printf("%s
    ",infoLog);
            free(infoLog);
        }
    }

    顶点着色器代码

    uniform float time;
    varying float colorx;
    varying vec4 TexCoord;
    void main(void)
    {
        vec4 v = vec4(gl_Vertex);
        float temp;
        temp = sin(time*5.0);
        colorx =temp;
        if(colorx<0.2)
        colorx =0.2;
        if(temp<0.5)
        temp=0.5;
        if(temp>1.0)
        temp =1.0;
        //v =v*temp;
        v.z =v.z*temp;
        gl_TexCoord[0] =gl_MultiTexCoord0;
        TexCoord = gl_MultiTexCoord0;
        gl_Position = gl_ModelViewProjectionMatrix * v;
    } 

    像素着色器代码:

    varying float colorx;
    
    varying vec4 TexCoord;
    uniform sampler2D texA;
    uniform sampler2D texB;
    void main(void)
    {
         
        vec3 color = texture2D(texA,gl_TexCoord[0].st).rgb + texture2D(texB,gl_TexCoord[0].st).rgb;
        //vec3 color = texture2D(texB,gl_TexCoord[0].st).rgb;
        //vec3 color = texture2D(texA,gl_TexCoord[0].st).rgb;
        color.r =color.r*colorx;
        color.g =color.g*colorx;
        color.b =color.b*colorx;
            gl_FragColor =vec4(color,1.0);  
        
    }

    效果:

  • 相关阅读:
    子元素如何不继承父元素透明度
    js深度复制对象
    webstorm快捷键
    js触屏滑动事件
    DOM学习笔记
    attribute & property --- jquery attr() & prop()
    javascript学习笔记(通用)-2015-08
    javascript学习笔记(数组)-2015-08
    mustache语法整理
    代码优化
  • 原文地址:https://www.cnblogs.com/dragon2012/p/3147975.html
Copyright © 2020-2023  润新知