您的位置:首页 > 运维架构

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: