OpenGL Tutorial 2 : The first triangle
2016-10-14 00:56
246 查看
教程地址:http://www.opengl-tutorial.org/beginners-tutorials/tutorial-2-the-first-triangle/
代码备忘:
代码备忘:
// Include standard headers #include <stdio.h> #include <stdlib.h> // Include GLEW #include <GL/glew.h> // Include GLFW #include <glfw3.h> GLFWwindow* window; // Include GLM #include <glm/glm.hpp> using namespace glm; // Include shader #include <common/shader.hpp> int main(void) { // Initialise GLFW // 初始化GLFW if (!glfwInit()) { fprintf(stderr, "Failed to initialize GLFW\n"); getchar(); return -1; } glfwWindowHint(GLFW_SAMPLES, 4);// 4x antialiasing,4倍反锯齿 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);// We want OpenGL 3.3 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // To make MacOS happy; should not be needed glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // Open a window and create its OpenGL context // 创建窗口 window = glfwCreateWindow(1024, 768, "MyOpenGL", NULL, NULL); if (window == NULL) { fprintf(stderr, "Failed to open GLFW window. If you have an Intel GPU, they are not 3.3 compatible. Try the 2.1 version of the tutorials.\n"); getchar(); glfwTerminate(); return -1; } // 创建OpenGL上下文 glfwMakeContextCurrent(window); // Initialize GLEW // GLEW是用来管理OpenGL的函数指针的,所以在调用任何OpenGL的函数之前我们需要初始化GLEW glewExperimental = true; // Needed for core profile // 初始化GLEW if (glewInit() != GLEW_OK) { fprintf(stderr, "Failed to initialize GLEW\n"); getchar(); glfwTerminate(); return -1; } // Ensure we can capture the escape key being pressed below // 捕捉键盘 glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE); // Ensure we can capture the escape key being pressed below glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE); // Grey background // 背景颜色 RGBA表示 glClearColor(0.0f, 0.0f, 0.4f, 0.0f); GLuint VertexArrayID; glGenVertexArrays(1, &VertexArrayID); glBindVertexArray(VertexArrayID); // Create and compile our GLSL program from the shaders // 创建两个着色器 GLuint programID = LoadShaders("SimpleVertexShader.vertexshader", "SimpleFragmentShader.fragmentshader"); // An array of 3 vectors which represents 3 vertices // 临时定义三角形的顶点坐标 static const GLfloat g_vertex_buffer_data[] = { -1.0f, -1.0f, 0.0f, 1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, }; // This will identify our vertex buffer // GLuint相当于unsigned int GLuint vertexbuffer; // Generate 1 buffer, put the resulting identifier in vertexbufferID // 获取buffer的ID glGenBuffers(1, &vertexbuffer); // The following commands will talk about our 'vertexbufferID' buffer // 指定缓冲区 glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); // Give our vertices to OpenGL. // 将缓冲区的三角形传给opengl glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW); do { // Clear the screen. It's not mentioned before Tutorial 02, but it can cause flickering, so it's there nonetheless. // 清除颜色缓冲 glClear(GL_COLOR_BUFFER_BIT); // Use our shader // 使用加载的着色器 glUseProgram(programID); // 1rst attribute buffer : vertices // 启用着色器 glEnableVertexAttribArray(0); glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); glVertexAttribPointer( 0, // attribute 0. No particular reason for 0, but must match the layout in the shader. 3, // size GL_FLOAT, // type GL_FALSE, // normalized? 0, // stride (void*)0 // array buffer offset ); // Draw the triangle ! // 画三角形 glDrawArrays(GL_TRIANGLES, 0, 3); // Starting from vertex 0; 3 vertices total -> 1 triangle glDisableVertexAttribArray(0); // Swap buffers glfwSwapBuffers(window); glfwPollEvents(); } // Check if the ESC key was pressed or the window was closed while (glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS && glfwWindowShouldClose(window) == 0); // Cleanup VBO glDeleteBuffers(1, &vertexbuffer); glDeleteVertexArrays(1, &VertexArrayID); glDeleteProgram(programID); // Close OpenGL window and terminate GLFW glfwTerminate(); return 0; }
相关文章推荐
- OpenGL ES Tutorial for Android – Part I – Setting up the view
- OpenGL ES Tutorial for Android – Part I – Setting up the view
- OpenGL ES Tutorial for Android – Part I – Setting up the view
- Rolling with Rails 2.0 - The First Full Tutorial - Part 1
- Rolling with Rails 2.0 - The First Full Tutorial - Part 2
- OpenGL ES Tutorial for Android – Part I – Setting up the view
- Rolling with Rails 2.0 - The First Full Tutorial (中文)
- 欧拉项目 Problem 12 of What is the value of the first triangle number to have over five hundred divisors
- OpenGL step by step - tutorial_3 "hello triangle"
- 记:解决Namespace declaration statement has to be the very first statement in the script 错误
- ReactiveCocoa Tutorial – The Definitive Introduction: Part 2/2
- 细品Java 8 之《java8-the-missing-tutorial》
- The ultimate end-to-end tutorial to create and deploy a fully decentralized Dapp in ethereum
- The first one
- GCC - the GNU Compiler Collection - Tutorial
- The specified child already has a parent. You must call removeView() on the child's parent first.
- The first article for testing
- the first try for clang
- Changing the type of a property with EF Code First
- The java ee tutorial 学习记录