glfwSwapBuffers(GLFWwindow* window)

glfwSwapBuffers(GLFWwindow *window)

SwapBuffers翻译过来是交换缓冲区的意思,既然buffer加了s,也就意味着不止一个buffer,所以这里涉及到了一个双缓冲的概念.

因为电脑绘图是一个个像素逐一画的,需要时间,如果单一缓冲,我们可能会看到具体绘画过程,会造成屏幕闪烁等问题,而我们用户不需要具体看到你绘制的过程,所以为了解决这个问题,这里用了双缓冲技术,用两个内存区域来保存数据,分为前缓冲区和后缓冲区,前缓冲区用于展示屏幕上的内容,而后缓冲区就用来绘制,然后每一帧开始的时候,将两个缓冲区交换,这样后缓冲区又可以画新的内容。

#include<glad/glad.h> #include<GLFW/glfw3.h> #include<stdio.h> #include<errno.h> #include<math.h> #include<stdbool.h> #define STB_IMAGE_IMPLEMENTATION #include"stb/stb_image.h" #define Wwidth 1080 #define Wheight 960 //顶点着色器源码 const char* vertexShaderSource = "#version 330 core \n" "layout ( location = 0 ) in vec3 aPos; \n" //顶点位置 "layout ( location = 1 ) in vec3 aColor;\n" //顶点颜色 "layout ( location = 2 ) in vec2 aText; \n" //纹理坐标 "out vec3 verColor; \n" "out vec2 verText; \n" "void main() \n" "{ \n" " gl_Position = vec4(aPos, 1.0f); \n" " verColor = aColor; \n" " verText = aText; \n" "} \n" ; //片段着色器源码 const char* fragmentShaderSource = "#version 330 core \n" "in vec3 verColor; \n" "in vec2 verText; \n" "uniform sampler2D ourTexture; \n" "out vec4 FragColor; \n" "void main() \n" "{ \n" " FragColor = texture(ourTexture, verText);\n" "} \n" ; void framebuffer_size_callback(GLFWwindow* window, int width, int height) { glViewport(0, 0, width, height); } int main() { //初始化并配置glfw if(!glfwInit()) { perror("failed to init glfw"); return -1; } glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); //创建glfw上下文窗口 GLFWwindow* window = glfwCreateWindow(Wwidth, Wheight, "纹理", NULL, NULL); if (!window) { printf("failed to create glfw window"); return -1; } //将当前glfw窗口上下文绑定到当前线程上下文 glfwMakeContextCurrent(window); //设置帧缓冲回调函数 glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); //启动glad if(!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { printf("failed to load glad"); return -1; } //启动顶点着色器 GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER); glShaderSource(vertexShader, 1, &vertexShaderSource, NULL); glCompileShader(vertexShader); int success; char infoLog[512]; //获取编译状态 glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success); if(!success) { //生成日志信息 glGetShaderInfoLog(vertexShader, 512, NULL, infoLog); printf("%s\n", infoLog); return -1; } /***************************************************着色器****************************************************/ /*************************************************************************************************************/ //启动顶点着色器 GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL); glCompileShader(fragmentShader); //获取编译状态 glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success); if(!success) { //生成日志信息 glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog); printf("%s\n", infoLog); return -1; } //生成着色器项目 GLuint shaderProgram = glCreateProgram(); glAttachShader(shaderProgram, vertexShader); glAttachShader(shaderProgram, fragmentShader); glLinkProgram(shaderProgram); //获取链接状态 glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success); if(!success) { //生成日志信息 glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog); printf("%s\n", infoLog); } glDeleteShader(vertexShader); glDeleteShader(fragmentShader); /*************************************************************************************************************/ //顶点属性数组 float vertices[] = { //顶点坐标 //顶点颜色 //纹理坐标 -0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.5f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, -0.5f, 0.5f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f }; //索引数组 GLuint indices[] = { 0, 1, 2, 2, 3, 0 }; //创建 顶点数组对象, 顶点缓冲对象, 索引缓冲对象 GLuint VAO, VBO, EBO; glGenVertexArrays(1, &VAO); glGenBuffers(1, &VBO); glGenBuffers(1, &EBO); //绑定顶点数组对象 glBindVertexArray(VAO); //绑定顶点缓冲对象 glBindBuffer(GL_ARRAY_BUFFER, VBO); //填充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); //设置顶点位置属性,并启用 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8*sizeof(float), (void*)0); glEnableVertexAttribArray(0); //设置顶点颜色属性,并启用 glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8*sizeof(float), (void*)(3*sizeof(float))); glEnableVertexAttribArray(1); //设置纹理位置属性,并启用 glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8*sizeof(float), (void*)(6*sizeof(float))); glEnableVertexAttribArray(2); /*************************************************************************************************************/ //创建纹理 GLuint texture; glGenTextures(1, &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_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); int width, height, nrchannels; const char* path = "C:\\Users\\fusheng\\Desktop\\opengl\\texture\\pear.png"; stbi_set_flip_vertically_on_load(true); unsigned char* datas = stbi_load(path, &width, &height, &nrchannels, 0); if(datas) { glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, datas); glGenerateMipmap(GL_TEXTURE_2D); printf("yes\n"); } else { printf("failed to load png %s\n", stbi_failure_reason()); } stbi_image_free(datas); /*************************************************************************************************************/ glUseProgram(shaderProgram); GLuint uniformLocation = glGetUniformLocation(shaderProgram, "ourTexture"); glUniform1i(uniformLocation, 0); while(!glfwWindowShouldClose(window)) { glClearColor(0.0f, 1.0f, 1.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, texture); glUseProgram(shaderProgram); glBindVertexArray(VAO); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); glfwSwapBuffers(window); glfwPollEvents(); } glDeleteVertexArrays(1, &VAO); glDeleteBuffers(1, &VBO); glDeleteBuffers(1, &EBO); glDeleteProgram(shaderProgram); glfwTerminate(); return 0; }
最新发布
06-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值