Github link
#include#include #include #include #include void userInit(); //自定义初始化 void display(void); GLuint VAO; GLuint VBO; GLuint EBO; GLuint texture1; GLuint texture2; unsigned int vertexShader; unsigned int fragmentShader; unsigned int shaderProgram; float vertices[] = { // positions // colors // texture coords 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, // top right 0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, // bottom right -0.5f, -0.5f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, // bottom left -0.5f, 0.5f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f // top left }; unsigned int indices[] = { 0, 1, 3, // first triangle 1, 2, 3 // second triangle }; const char* vertexShaderSource = "#version 330 coren" "layout (location = 0) in vec3 aPos;n" "layout (location = 1) in vec3 aColor;n" "layout (location = 2) in vec2 aTexCoord;n" "out vec3 ourColor;n" "out vec2 TexCoord;n" "void main()n" "{n" " gl_Position = vec4(aPos, 1.0);n" "ourColor = aColor;n" "TexCoord = vec2(aTexCoord.x, aTexCoord.y);n" "}n"; const char* fragmentShaderSource = "#version 330 coren" "out vec4 FragColor;n" "in vec3 ourColor; n" "in vec2 TexCoord; n" "uniform sampler2D texture1; n" "uniform sampler2D texture2; n" "void main()n" "{n" "FragColor = mix(texture(texture1, TexCoord), texture(texture2, TexCoord), 0.5); n" //"FragColor = texture(texture2 , TexCoord) * vec4(ourColor, 1.0);n" "}n"; int main(int argc, char**argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); glutInitWindowPosition(100, 100); glutInitWindowSize(500, 500); glutCreateWindow("face_demo"); //使用glew,需要执行glewInit,不然运行过程会报错 //glewInit要放在glut完成了基本的初始化之后执行 glewInit(); //自定义初始化,生成VAO,VBO对象 userInit(); const GLubyte* vendor = glGetString(GL_SHADING_LANGUAGE_VERSION); if (vendor) { std::cout << vendor << std::endl; } else { std::cout << "Error" << std::endl; } glutDisplayFunc(display); glutMainLoop(); return 0; } void userInit() { //1、VAO、VBO、EBO、Texture__setting glEnable(GL_TEXTURE_2D); glGenVertexArrays(1, &VAO); glGenBuffers(1, &VBO); glGenBuffers(1, &EBO); glBindVertexArray(VAO); glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); // position attribute glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0); glEnableVertexAttribArray(0); // color attribute glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float))); glEnableVertexAttribArray(1); // texture coord attribute glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float))); glEnableVertexAttribArray(2); glGenTextures(1, &texture1); glGenTextures(1, &texture2); glBindTexture(GL_TEXTURE_2D, texture2); // set the texture wrapping parameters glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); // set texture wrapping to GL_REPEAT (default wrapping method) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); // set texture filtering parameters glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // load image, create texture and generate mipmaps GLubyte* pixels; cv::Mat I = cv::imread("C://Users//Yao//Desktop//3.png"); int pixellength = I.cols * I.rows * 3; pixels = new GLubyte[pixellength]; memcpy(pixels, I.data, pixellength * sizeof(char)); if (pixels) { glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 512, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, pixels); glGenerateMipmap(GL_TEXTURE_2D); } else { std::cout << "Failed to load texture" << std::endl; } // --------- glBindTexture(GL_TEXTURE_2D, texture1); // set the texture wrapping parameters glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); // set texture wrapping to GL_REPEAT (default wrapping method) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); // set texture filtering parameters glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // load image, create texture and generate mipmaps GLubyte* pixels2; cv::Mat I2 = cv::imread("C://Users//Yao//Desktop//face1.png"); pixellength = I2.rows*I2.cols* 3; pixels2 = new GLubyte[pixellength]; memcpy(pixels2, I2.data, pixellength * sizeof(char)); if (pixels2) { glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, I2.cols, I2.rows, 0, GL_RGB, GL_UNSIGNED_BYTE, pixels2); glGenerateMipmap(GL_TEXTURE_2D); } else { std::cout << "Failed to load texture" << std::endl; } vertexShader = glCreateShader(GL_VERTEX_SHADER); glShaderSource(vertexShader, 1, &vertexShaderSource, NULL); glCompileShader(vertexShader); // check for shader compile errors int success; char infoLog[512]; glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success); if (!success) { glGetShaderInfoLog(vertexShader, 512, NULL, infoLog); std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILEDn" << infoLog << std::endl; } // fragment shader fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, texture1); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, texture2); glUniform1i(glGetUniformLocation(shaderProgram, "texture1"), 0); glUniform1i(glGetUniformLocation(shaderProgram, "texture2"), 1); glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL); glCompileShader(fragmentShader); // check for shader compile errors glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success); if (!success) { glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog); std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILEDn" << infoLog << std::endl; } // link shaders shaderProgram = glCreateProgram(); glAttachShader(shaderProgram, vertexShader); glAttachShader(shaderProgram, fragmentShader); gllinkProgram(shaderProgram); // check for linking errors glGetProgramiv(shaderProgram, GL_link_STATUS, &success); if (!success) { glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog); std::cout << "ERROR::SHADER::PROGRAM::linkING_FAILEDn" << infoLog << std::endl; }; glDeleteShader(vertexShader); glDeleteShader(fragmentShader); glUseProgram(0); glDisable(GL_TEXTURE_2D); } //绘制回调函数 void display(void) { glEnable(GL_TEXTURE_2D); // render glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); // bind textures on corresponding texture units glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, texture1); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, texture2); glBindVertexArray(VAO); glUseProgram(shaderProgram); glUniform1i(glGetUniformLocation(shaderProgram, "texture1"), 0); glUniform1i(glGetUniformLocation(shaderProgram, "texture2"), 1); glDisable(GL_TEXTURE_2D); //glBindVertexArray(VAO); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); glBindVertexArray(0); glBindTexture(GL_TEXTURE_2D, 0); glUseProgram(0); glDisable(GL_TEXTURE_2D); glutSwapBuffers(); }
reslut:



