diff --git a/OpenGL/hello/resources/awesomeface.png b/OpenGL/hello/resources/awesomeface.png new file mode 100644 index 0000000..c7bfec6 Binary files /dev/null and b/OpenGL/hello/resources/awesomeface.png differ diff --git a/OpenGL/hello/src/main.cpp b/OpenGL/hello/src/main.cpp index 3548169..ed53e3b 100644 --- a/OpenGL/hello/src/main.cpp +++ b/OpenGL/hello/src/main.cpp @@ -57,31 +57,6 @@ int main() { // 创建着色器程序 Shader shader = Shader("src/tex.vs", "src/tex.fs"); - // 创建纹理 - unsigned int texture; - glGenTextures(1, &texture); - glBindTexture(GL_TEXTURE_2D, texture); - // 设置纹理环绕方式 - 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_LINEAR_MIPMAP_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - - // 加载并生成纹理 - int width, height, nrChannels; - unsigned char *data = - stbi_load("resources/container.jpg", &width, &height, &nrChannels, 0); - if (data) { - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, - GL_UNSIGNED_BYTE, data); - glGenerateMipmap(GL_TEXTURE_2D); - } else { - std::cout << "Failed to load texture" << std::endl; - } - stbi_image_free(data); - unsigned int VAO, VBO, EBO; // 创建顶点数组对象 glGenVertexArrays(1, &VAO); @@ -110,6 +85,66 @@ int main() { (void *)(6 * sizeof(float))); glEnableVertexAttribArray(2); + // 创建纹理 + unsigned int texture1, texture2; + glGenTextures(1, &texture1); + glBindTexture(GL_TEXTURE_2D, texture1); + // 设置纹理环绕方式 + 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_LINEAR_MIPMAP_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + // 加载并生成纹理 + int width, height, nrChannels; + // 图片翻转y轴 + stbi_set_flip_vertically_on_load(true); + unsigned char *data = + stbi_load("resources/container.jpg", &width, &height, &nrChannels, 0); + if (data) { + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, + GL_UNSIGNED_BYTE, data); + glGenerateMipmap(GL_TEXTURE_2D); + } else { + std::cout << "Failed to load texture" << std::endl; + } + stbi_image_free(data); + + glGenTextures(1, &texture2); + glBindTexture(GL_TEXTURE_2D, texture2); + // 设置纹理环绕方式 + 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_LINEAR_MIPMAP_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + + // 加载并生成纹理 + // 图片翻转y轴 + stbi_set_flip_vertically_on_load(true); + data = + stbi_load("resources/awesomeface.png", &width, &height, &nrChannels, 0); + if (data) { + + // note that the awesomeface.png has transparency and thus an alpha channel, + // so make sure to tell OpenGL the data type is of GL_RGBA + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, + GL_UNSIGNED_BYTE, data); + glGenerateMipmap(GL_TEXTURE_2D); + } else { + std::cout << "Failed to load texture" << std::endl; + } + stbi_image_free(data); + + // 激活着色器 + shader.use(); + // 绑定纹理 + shader.setInt("texture1", 0); + shader.setInt("texture2", 1); + // 循环渲染 while (!glfwWindowShouldClose(window)) { // 处理输入 @@ -120,15 +155,15 @@ int main() { glClear(GL_COLOR_BUFFER_BIT); // 绑定纹理 - glBindTexture(GL_TEXTURE_2D, texture); - - // 激活着色器 - shader.use(); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, texture1); + glActiveTexture(GL_TEXTURE1); + glBindTexture(GL_TEXTURE_2D, texture2); // 绘制三角形 + shader.use(); glBindVertexArray(VAO); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); - glBindVertexArray(0); // 检查并调用事件,交换缓冲 glfwSwapBuffers(window); diff --git a/OpenGL/hello/src/tex.fs b/OpenGL/hello/src/tex.fs index 1b549f5..b762a3a 100644 --- a/OpenGL/hello/src/tex.fs +++ b/OpenGL/hello/src/tex.fs @@ -4,9 +4,10 @@ out vec4 FragColor; in vec3 ourColor; in vec2 TexCoord; -uniform sampler2D ourTexture; +uniform sampler2D texture1; +uniform sampler2D texture2; void main() { - FragColor = texture(ourTexture, TexCoord) * vec4(ourColor, 1.0);; + FragColor = mix(texture(texture1, TexCoord), texture(texture2, TexCoord), 0.2); } \ No newline at end of file