跟我一起学openGL-第一个三角形
来源:互联网 发布:天津大学软件下载 编辑:程序博客网 时间:2024/05/22 02:02
上一篇讲述了OpenGL相关的基本概念,下面开始通过实例描述opengl的使用。
triangle.cpp 1 #include <GL/glew.h> 2 #include <GL/freeglut.h> 3 #include <iostream> 4 5 #define BUFFER_OFFSET(x) ((const void*) (x)) 6 7 enum VAO_IDs {Triangles, NumVAOs}; 8 enum Buffer_IDs {ArrayBuffer, NumBuffers}; 9 enum Attrib_IDs {vPosition = 0}; 10 11 GLuint VAOs[NumVAOs]; 12 GLuint Buffers[NumBuffers]; 13 GLuint program; 14 15 const GLchar* vertex_shader = "#version 430 core \n" 16 "layout(location = 0)\n" 17 "in vec4 vPosition;\n" 18 "void main()\n" 19 "{\n" 20 "gl_Position = vPosition;\n" 21 "}\n"; 22 23 const GLchar* fragment_shader = "#version 430 core \n" 24 "uniform vec4 color;\n" 25 "out vec4 fColor;\n" 26 "void main()\n" 27 "{\n" 28 "fColor = color;\n" 29 "}\n"; 30 void init_shader() 31 { 32 // vertex shader 33 GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER); 34 glShaderSource(vertexShader, 1, &vertex_shader, NULL); 35 glCompileShader(vertexShader); 36 // check vertex shader compiling status 37 GLint compiled; 38 GLchar log[256]; 39 glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &compiled); 40 if (!compiled) 41 { 42 glGetShaderInfoLog(vertexShader, 256, NULL, log); 43 std::cerr << "vertex shader compile failed" << log << std::endl; 44 } 45 46 // fragment shader 47 GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); 48 glShaderSource(fragmentShader, 1, &fragment_shader, NULL); 49 glCompileShader(fragmentShader); 50 // check fragment shader compiling status 51 glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &compiled); 52 if (!compiled) 53 { 54 glGetShaderInfoLog(fragmentShader, 256, NULL, log); 55 std::cerr << "fragment shader compile failed" << log << std::endl; 56 } 57 58 // link shaders 59 program = glCreateProgram(); 60 glAttachShader(program, vertexShader); 61 glAttachShader(program, fragmentShader); 62 glLinkProgram(program); 63 //check link status 64 GLint linked; 65 glGetProgramiv(program, GL_LINK_STATUS, &linked); 66 if (!linked) 67 { 68 glGetProgramInfoLog(program, 256, NULL, log); 69 std::cerr << "shader linking failed" << log << std::endl; 70 } 71 // delete shader 72 glDeleteShader(vertexShader); 73 glDeleteShader(fragmentShader); 74 } 75 76 void init_data() 77 { 78 glClearColor(1, 1, 1, 0); 79 glClear(GL_COLOR_BUFFER_BIT); 80 81 glGenVertexArrays(NumVAOs, VAOs); 82 glBindVertexArray(VAOs[Triangles]); 83 84 GLfloat vertices[3][2] = { 85 { -0.8, -0.9 }, 86 { 0.8, -0.9 }, 87 { 0, 0.9 }, 88 }; 89 90 glGenBuffers(NumBuffers, Buffers); 91 glBindBuffer(GL_ARRAY_BUFFER, Buffers[ArrayBuffer]); 92 glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); 93 94 glUseProgram(program); 95 // control fragment color 96 GLint loc = glGetUniformLocation(program, "color"); 97 glUniform4f(loc, 1.0f, 0.0f, 0.0f, 1.0f); 98 glVertexAttribPointer(vPosition, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); 99 glEnableVertexAttribArray(vPosition);100 101 }102 103 void display()104 {105 glClear(GL_COLOR_BUFFER_BIT);106 107 glBindVertexArray(VAOs[Triangles]);108 glDrawArrays(GL_TRIANGLES, 0, 3);109 glFlush();110 }111 112 int main(int argc, char* argv[])113 {114 glutInit(&argc, argv);115 glutInitDisplayMode(GLUT_RGBA);116 glutInitWindowSize(300 ,300);117 glutInitWindowPosition(100, 100);118 glutCreateWindow("Learn opengl: first triangle");119 120 glewExperimental = GL_TRUE;121 if(glewInit())122 {123 std::cout << "Unable to Initialize" << std::endl;124 exit(1);125 }126 init_shader();127 init_data();128 glutDisplayFunc(display);129 glutMainLoop();130 }
在Ubuntu上运行: g++ triangle.cpp -lGL -lGLU -lglut -lGLEW
即可得到下图所示的三角形:
0 0
- 跟我一起学openGL-第一个三角形
- 跟我一起学openGL-基本概念
- 跟我一起学C++(第一季)
- 【一步步学OpenGL 3】-《第一个三角形》
- 跟我一起学Windows界面封装(二) 之 前奏篇:显示第一个窗口
- 跟我一起学Windows界面封装(五) 之 封装第一个控件:按钮
- OpenGL 第一个三角形
- 跟我一起学java
- 跟我一起学摄影
- 跟我一起学makefile
- 跟我一起学Makefile
- 跟我一起学Makefile
- 《跟我一起学C++》
- 跟我一起学makefile
- 跟我一起学CMake
- 跟我一起学Makefile
- 跟我一起学Kubernetes
- 跟我一起学Makefile
- 经典排序算法
- tensorflow30《TensorFlow实战》笔记-03 TensorFlow第一步 code
- sqoop --split-by详解
- MySQL
- 使用jdbc连接oracle数据库
- 跟我一起学openGL-第一个三角形
- 封装的好处
- java程序:数据类型 流程控制语句 操作符
- MySQL
- iOS开发笔记(5) -- 推送证书的创建及合并
- thinkphp执行删除操作然后成功success后页面跳转失败问题
- BZOJ3090: Coci2009 [podjela]
- MSSQL报错:参数数据类型 text 对于 replace 函数的参数 1 无效的解决办法
- 奇偶校验,异或校验,和校验,nios串口校验