OpenGL_7:用两个片段着色器和着色器程序分别画2个不同颜色的三角形
来源:互联网 发布:双十一淘宝店铺宣言 编辑:程序博客网 时间:2024/06/08 19:03
#include <stdio.h>#include <GLAD/glad.h>#include <GLFW/glfw3.h>const char *vertexShaderSource = "#version 330 core\n" "layout (location = 0) in vec3 aPos;\n" "void main(){\n" "gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0f);\n" "}\n\0";const char *fragmentShaderSource_1 = "#version 330 core\n" "out vec4 FragColor;\n" "void main(){\n" "FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n" "}\n\0";const char *fragmentShaderSource_2 = "#version 330 core\n" "out vec4 FragColor;\n" "void main(){\n" "FragColor = vec4(1.0f, 1.0f, 0.0f, 1.0f);\n" "}\n\0";void processInput(GLFWwindow *glfWwindow);void framebuffer_size_callback(GLFWwindow* glfWwindow, int width, int height);int main() { glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); GLFWwindow *glfWwindow = glfwCreateWindow(800, 600, "twoTriangle", NULL, NULL); if (NULL == glfWwindow){ printf("Failed to create window \n"); glfwTerminate(); return -1; } glfwMakeContextCurrent(glfWwindow); glfwSetFramebufferSizeCallback(glfWwindow, framebuffer_size_callback); if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){ printf("Failed to initialize GLAD\n"); } unsigned int 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("Failed to compile vertexShader:%s \n", infoLog); } unsigned int fragmentShader_1 = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fragmentShader_1, 1, &fragmentShaderSource_1, NULL); glCompileShader(fragmentShader_1); glGetShaderiv(fragmentShader_1, GL_COMPILE_STATUS, &success); if (!success){ glGetShaderInfoLog(fragmentShader_1, 512, NULL, infoLog); printf("Failed to compile fragmentShader:%s \n", infoLog); } unsigned int fragmentShader_2 = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fragmentShader_2, 1, &fragmentShaderSource_2, NULL); glCompileShader(fragmentShader_2); glGetShaderiv(fragmentShader_2, GL_COMPILE_STATUS, &success); if (!success){ glGetShaderInfoLog(fragmentShader_2, 512, NULL, infoLog); printf("Failed to compile fragmentShader:%s \n", infoLog); } unsigned int shaderProgram_1 = glCreateProgram(); glAttachShader(shaderProgram_1, vertexShader); glAttachShader(shaderProgram_1, fragmentShader_1); glLinkProgram(shaderProgram_1); glGetShaderiv(shaderProgram_1, GL_LINK_STATUS, &success); if (!success){ glGetProgramInfoLog(shaderProgram_1, 512, NULL, infoLog); printf("Failed to link shaderProgram:%s \n", infoLog); } unsigned int shaderProgram_2 = glCreateProgram(); glAttachShader(shaderProgram_2, vertexShader); glAttachShader(shaderProgram_2, fragmentShader_2); glLinkProgram(shaderProgram_2); glGetShaderiv(shaderProgram_2, GL_LINK_STATUS, &success); if (!success){ glGetProgramInfoLog(shaderProgram_2, 512, NULL, infoLog); printf("Failed to link shaderProgram:%s \n", infoLog); } glDeleteShader(vertexShader); glDeleteShader(fragmentShader_1); glDeleteShader(fragmentShader_2); float vertices_1[] = { // first triangle -0.9f, -0.5f, 0.0f, // left -0.0f, -0.5f, 0.0f, // right -0.45f, 0.5f, 0.0f // top }; float vertices_2[] = { // second triangle 0.0f, -0.5f, 0.0f, // left 0.9f, -0.5f, 0.0f, // right 0.45f, 0.5f, 0.0f // top }; unsigned int VBO[2], VAO[2]; glGenVertexArrays(2, VAO); glGenBuffers(2, VBO); glBindVertexArray(VAO[0]); glBindBuffer(GL_ARRAY_BUFFER, VBO[0]); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices_1), vertices_1, GL_STATIC_DRAW); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); glEnableVertexAttribArray(0);// glBindVertexArray(0); //no need to unbind at all as we directly bind a different VAO the next few lines// glBindBuffer(GL_ARRAY_BUFFER, 0); glBindVertexArray(VAO[1]); glBindBuffer(GL_ARRAY_BUFFER, VBO[1]); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices_2), vertices_2, GL_STATIC_DRAW); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); glEnableVertexAttribArray(0); // glBindVertexArray(0); // not really necessary as well, but beware of calls that could affect VAOs while this one is bound (like binding element buffer objects, or enabling/disabling vertex attributes)// glBindBuffer(GL_ARRAY_BUFFER, 0); /** * 当目标是GL_ELEMENT_ARRAY_BUFFER的时候,VAO会储存glBindBuffer的函数调用。 * 这也意味着它也会储存解绑调用,所以确保你没有在解绑VAO之前解绑索引数组缓冲, * 否则它就没有这个EBO配置了。 * */ //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); //glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); while (!glfwWindowShouldClose(glfWwindow)){ processInput(glfWwindow); glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glUseProgram(shaderProgram_1); glBindVertexArray(VAO[0]); glDrawArrays(GL_TRIANGLES, 0, 3); glUseProgram(shaderProgram_2); glBindVertexArray(VAO[1]); glDrawArrays(GL_TRIANGLES, 0, 3);// glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); glfwSwapBuffers(glfWwindow); glfwPollEvents(); } glDeleteVertexArrays(2, VAO); glDeleteBuffers(2, VBO); glfwTerminate(); return 0;}void processInput(GLFWwindow *glfWwindow){ if (glfwGetKey(glfWwindow, GLFW_KEY_ESCAPE)) glfwSetWindowShouldClose(glfWwindow, GLFW_TRUE);}void framebuffer_size_callback(GLFWwindow* glfWwindow, int width, int height){ glViewport(0, 0, width, height);}
阅读全文
0 0
- OpenGL_7:用两个片段着色器和着色器程序分别画2个不同颜色的三角形
- 顶点和片段着色器
- 顶点和片段着色器
- Unity顶点着色器和片段着色器
- 顶点、片段着色器
- 顶点,片段着色器
- OpenGL用着色器画绿色三角形
- 用着色器编写第一个程序
- shader 入门 《顶点着色器 的输出 和 片段着色器的 输入》
- 增加顶点和片段着色器
- 【OpenGL ES】片段着色器
- 39 WebGL着色器和着色器程序对象:initShader()函数的作用
- 40 WebGL着色器和着色器程序对象:initShader()函数的内部流程
- GLSL中的gl_Color在顶点着色器和片段着色器中的不同意义
- [转]Stage3D 翻译系列之四:了解顶点着色器和片段(像素)着色器
- GLSL中的gl_Color在顶点着色器和片段着色器中的不同意义
- OpenGL实践3之第一个着色器程序2
- flash3D开发基础------- 顶点和片段着色器(转)
- 如何将xml解析成datatable
- 欢迎使用CSDN-markdown编辑器
- 非金融是作风啊
- 链队列的实现
- tf.shape()与tf.get_shape()
- OpenGL_7:用两个片段着色器和着色器程序分别画2个不同颜色的三角形
- c\c++中比较两个字符串或string对象是否相等
- 大数据,是虚还是实?(为Hadoop预热)
- InternalResourceViewResolver
- CSDN博客的积分计算方法和博客排名规律
- Linux中vim的基本操作以及配置文件更改
- 有关HashTable、HashMap、ConcurrentHashMap
- hdu 5983 Pocket Cube (模拟)
- Wannafly挑战赛1 C