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

效果:

原文地址:https://www.cnblogs.com/dragon2012/p/3147975.html