ZBLOG

写一个使用glfw把纹理缩放成1/2并显示的例子

下面是一个使用GLFW库将纹理缩放为1/2并显示的例子,基于OpenGL:

  1. #include <iostream>
  2. #include <GLFW/glfw3.h>
  3. #define STB_IMAGE_IMPLEMENTATION
  4. #include <stb_image.h>
  5. // 窗口大小
  6. const int WINDOW_WIDTH = 800;
  7. const int WINDOW_HEIGHT = 600;
  8. void framebuffer_size_callback(GLFWwindow* window, int width, int height)
  9. {
  10. glViewport(0, 0, width, height);
  11. }
  12. int main()
  13. {
  14. // 初始化GLFW
  15. if (!glfwInit())
  16. {
  17. std::cout << "Failed to initialize GLFW" << std::endl;
  18. return -1;
  19. }
  20. // 创建窗口和上下文
  21. GLFWwindow* window = glfwCreateWindow(WINDOW_WIDTH, WINDOW_HEIGHT, "Texture Scaling", nullptr, nullptr);
  22. if (window == nullptr)
  23. {
  24. std::cout << "Failed to create GLFW window" << std::endl;
  25. glfwTerminate();
  26. return -1;
  27. }
  28. glfwMakeContextCurrent(window);
  29. // 设置视口大小回调函数
  30. glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
  31. // 加载图像数据
  32. int imageWidth, imageHeight, nrChannels;
  33. unsigned char* imageData = stbi_load("texture.jpg", &imageWidth, &imageHeight, &nrChannels, 0);
  34. if (imageData == nullptr)
  35. {
  36. std::cout << "Failed to load texture" << std::endl;
  37. glfwTerminate();
  38. return -1;
  39. }
  40. glPixelStorei(GL_UNPACK_ALIGNMENT, 1); // 对齐字节
  41. GLuint texture;
  42. glGenTextures(1, &texture);
  43. glBindTexture(GL_TEXTURE_2D, texture);
  44. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  45. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  46. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  47. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  48. if (nrChannels == 3)
  49. {
  50. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, imageWidth / 2, imageHeight / 2,
  51. 0, GL_RGB, GL_UNSIGNED_BYTE, imageData);
  52. }
  53. else if (nrChannels == 4)
  54. {
  55. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, imageWidth / 2,
  56. imageHeight / 2,
  57. 0, GL_RGBA,GL_UNSIGNED_BYTE,imageData);
  58. }
  59. else
  60. {
  61. std::cout << "Unsupported format" << std::endl;
  62. stbi_image_free(imageData);
  63. glfwTerminate();
  64. return -1;
  65. }
  66. // 渲染循环
  67. while (!glfwWindowShouldClose(window))
  68. {
  69. glClear(GL_COLOR_BUFFER_BIT);
  70. // 绘制矩形,并使用纹理进行填充
  71. glBegin(GL_QUADS);
  72. glTexCoord2f(0.0f, 1.0f); glVertex2f(-1.0f,-1.0f);
  73. glTexCoord2f(1.0f ,1.0f); glVertex2f(1.0f,-1.0f);
  74. glTexCoord2f(1.0f , 0.5f); glVertex2f(1.0f , 1.5 );
  75. glTexCoord2f(0.0 ,-imageHeight/float(imageHeight * 4)); glVertex2f(-1.0 , 1.5 );
  76. glEnd();
  77. // 交换缓冲区和获取输入
  78. glfwSwapBuffers(window);
  79. glfwPollEvents();
  80. }
  81. // 清理资源
  82. stbi_image_free(imageData);
  83. glfwTerminate();
  84. return 0;
  85. }

在上述代码中,我们使用了glfw创建了一个窗口,加载并绑定了纹理数据,并通过GL_QUADS绘制一个矩形,并使用纹理进行填充。其中纹理的尺寸被缩放为原来的一半,即imageWidth / 2 和 imageHeight / 2。

请确保在运行代码之前将”texture.jpg”替换为你自己的纹理图片路径,并且安装并配置好GLFW库以及stb_image库。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=9089

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?