OpenGl学习 如何画出一个红色三角形

代码以及代码的解释如下,使用的是右手坐标系,X-大拇指,Y-食指,Z-中指,大拇指指向右边,食指冲天,注意shader的用法,并不是在编译器里面编译用到,而是在生成exe文件之后被exe调用,所以shader要和exe文件放在一起


// 引入头文件

#include
#include
#include
#include
GLFWwindow* window;
#include
using namespace glm;


#include


int main( void )
{
// 初始化GLFW
if( !glfwInit() )
{
fprintf( stderr, "Failed to initialize GLFW\n" );
getchar();
return -1;
}


glfwWindowHint(GLFW_SAMPLES, 4);//4* 反走样
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//使用OpenGL core profile
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);


//创建一个窗口并且给它的边框上写上内容
window = glfwCreateWindow( 1024, 768, "Tutorial 02 ~~~Red triangle", 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;
}
glfwMakeContextCurrent(window);//??


// 初始化 GLEW
glewExperimental = true; // Needed for core profile
if (glewInit() != GLEW_OK) {
fprintf(stderr, "Failed to initialize GLEW\n");
getchar();
glfwTerminate();
return -1;
}


// 按下任意键退出
glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE);


//背景的颜色
glClearColor(0.2f, 0.3f, 0.4f, 0.0f);


GLuint VertexArrayID;
glGenVertexArrays(1, &VertexArrayID);
glBindVertexArray(VertexArrayID);


//引入两个shader,这两个shader并不是编译的时候用到,而是生成exe文件之后再调用,所以要把它和生成的exe文件放在一起
GLuint programID = LoadShaders( "SimpleVertexShader.vertexshader", "SimpleFragmentShader.fragmentshader" );


//三角形的三个点,使用右手坐标系,X-大拇指,Y-食指,Z-中指,大拇指指向右边,食指冲天
static const GLfloat g_vertex_buffer_data[] = { 
-1.0f, -1.0f, 0.0f,//原点在(0,0,0),(-1.0f, -1.0f, 0.0f)里面三个坐标对应x,y,z。是最左下角的点
1.0f, -1.0f, 0.0f,//最右下角
0.0f,  0.5f, 0.0f,//最上角
};


GLuint vertexbuffer;//定义顶点缓冲区
glGenBuffers(1, &vertexbuffer);//生成一个缓冲区,在vertexbuffer中放置结果标识符
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);//绑定缓冲区
glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);// 把顶点给OpenGL


do{


// Clear the screen
glClear( GL_COLOR_BUFFER_BIT );


// 使用shader
glUseProgram(programID);


// 第一个属性缓冲区:顶点缓冲区
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glVertexAttribPointer(
0,                  //要匹配shader的层数
3,                  // 指定每个顶点属性的组件数量。必须为1、2、3或者4。初始值为4。(如position是由3个(x,y,z)组成,而颜色是4个(r,g,b,a))
GL_FLOAT,           // 类型
GL_FALSE,           // 指定当被访问时,固定点数据值是否应该被归一化(GL_TRUE)或者直接转换为固定点值(GL_FALSE)。
0,                  // 指定连续顶点属性之间的偏移量。如果为0,那么顶点属性会被理解为:它们是紧密排列在一起的。初始值为0。
(void*)0            // 指定一个指针,指向数组中第一个顶点属性的第一个组件。初始值为0。
);


// 画出三角形
glDrawArrays(GL_TRIANGLES, 0, 3); // 从0画到3


glDisableVertexAttribArray(0);//禁止顶点属性数组


//清除缓存
glfwSwapBuffers(window);
glfwPollEvents();


} // 检查esc是否被按下或者窗口被关闭
while( glfwGetKey(window, GLFW_KEY_ESCAPE ) != GLFW_PRESS &&
  glfwWindowShouldClose(window) == 0 );


// 清除VBO,通过VBO我们可以把需要渲染的图元的顶点信息,直接上传存储在GPU的显存中。 而没有VBO的时候,是需要频繁赋值给GPU。VBO就是通过那几个函数,在GPU显存中创建一块BUFFER,用于存储和顶点以及其属性相关的信息
glDeleteBuffers(1, &vertexbuffer);
glDeleteVertexArrays(1, &VertexArrayID);
glDeleteProgram(programID);


// 关闭OpenGL,停止GLFW
glfwTerminate();


return 0;

}




shader的代码:


1.片段着色器的代码:

#version 330 core


// Ouput data
out vec3 color;


void main()
{


// Output color = red 
color = vec3(1,0,0);//三原色,这里是只使用红色


}


2.顶点着色器的代码

#version 330 core


// Input vertex data, different for all executions of this shader.
layout(location = 0) in vec3 vertexPosition_modelspace;


void main(){


    gl_Position.xyz = vertexPosition_modelspace;
    gl_Position.w = 1.0;


}


你可能感兴趣的:(OpenGL学习)