Esempio n. 1
0
int setupTextureShader(GLuint &textureID, const mesh& object)
{
    glewInit();
    if(!glewIsSupported("GL_VERSION_2_0 GL_ARB_multitexture GL_EXT_framebuffer_object")) 
    {
        fprintf(stderr, "Required OpenGL extensions missing\n");
        return -1;
    }

    /* create texture */
    glGenTextures(1, &textureID);
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, textureID);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

    /* load texture file */
    int width, height, components;
    unsigned char *data = stbi_load("static/uv_color_map.png",
            &width, &height, &components, 0);

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB,
            GL_UNSIGNED_BYTE, data);
    
    stbi_image_free(data);

    /* load UV data from mesh */
    std::vector<glm::vec2> texture_uvs = object.getTextureUVs();
    unsigned int uvsize = texture_uvs.size();
    unsigned int uvmem = 2*uvsize*sizeof(GLfloat);
    GLfloat *uv_buffer_data = (GLfloat *)malloc(uvmem);
    for(int i = 0; i < uvsize; i++)
    {
        uv_buffer_data[2*i] = texture_uvs.at(i).x;
        uv_buffer_data[2*i + 1] = texture_uvs.at(i).y;
    }

    /* pass data to shader */
    GLuint uvBuffer;
    glGenBuffers(1, &uvBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, uvBuffer);
    glBufferData(GL_ARRAY_BUFFER, uvmem, uv_buffer_data, GL_STATIC_DRAW);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (void*)0);

    free(uv_buffer_data);

    glm::ivec2 shaders = loadShaders("src/texture.vert", "src/texture.frag");
    GLuint vertexShader = shaders.x;
    GLuint fragmentShader = shaders.y;

    /* create and link program */
    int program = glCreateProgram();

    glBindAttribLocation(program, 0, "vertexUV");
    int loc = glGetUniformLocation(program, "texsampler");
    glUniform1i(loc, 0);

    glAttachShader(program, vertexShader);
    glAttachShader(program, fragmentShader);
    glLinkProgram(program);

    GLint pstatus;
    glGetProgramiv(program, GL_LINK_STATUS, &pstatus);
    if(pstatus != GL_TRUE)
    {
        char log[2048];
        int len;
        glGetProgramInfoLog(program, 2048, (GLsizei*)&len, log);
        fprintf(stderr, "%s", log);
        glDeleteProgram(program);
        return -1;
    }
    return program;
}