#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>
using namespace std;
float color1=0.0, color2 = 0.0, color3 = 0.0, color4 = 0.0;
float vertices[] =
{
-0.9,0,0,
-0.45,0.45,0,
0,0,0,
};
float vertices2[] =
{
0,0,0,
0.45,0.45,0,
0.9,0,0
};
int indices[] = { 0,1,2,2,3,4 };
int success;
char infolog[512];
const char* vertexShaderSource = "#version 330 core\n"
"layout (location = 0) in vec3 aPos;\n"
"void main()\n"
"{\n"
" gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
"}\0";
const char* fragmentShaderSource = "#version 330 core\n"
"out vec4 FragColor;\n"
"void main()\n"
"{\n"
" FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n"
"}\n\0";
const char* vertexShaderSource2 = "#version 330 core\n"
"layout (location = 0) in vec3 aPos;\n"
"void main()\n"
"{\n"
" gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
"}\0";
const char* fragmentShaderSource2 = "#version 330 core\n"
"out vec4 FragColor;\n"
"void main()\n"
"{\n"
" FragColor = vec4(1.0f, 0.9f, 0.2f, 1.0f);\n"
"}\n\0";
void framebuffer_size_callback(GLFWwindow* window, int width, int heigth);
void processInput(GLFWwindow* window);
void clearscreen(GLFWwindow* window);
int main()
{
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//设置版本号为3.3
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//设置使用核心模式
GLFWwindow* window = glfwCreateWindow(800, 600, "mygl", NULL, NULL);
if (window == NULL)
{
cout << "failed to create glfw window" << endl;
return 0;
}
//设置这个window为当前上下文,即使用对象
glfwMakeContextCurrent(window);
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
cout << "failed to initialize glad" << endl;
return 0;
}
//设置帧缓冲大小回调函数
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
glViewport(0, 0, 800, 600);
//顶点着色器
unsigned int vertexShader1;
vertexShader1 = glCreateShader(GL_VERTEX_SHADER);
//绑定着色源代码
glShaderSource(vertexShader1, 1, &vertexShaderSource, NULL);
//编译着色源代码
glCompileShader(vertexShader1);
//获取编译状态
glGetShaderiv(vertexShader1, GL_COMPILE_STATUS, &success);
if (success)
{
cout << "vertexshader compile seccessfully" << endl;
}
else
{
glGetShaderInfoLog(vertexShader1, 512, NULL, infolog);
cout << "vertexshader compile failed" << endl<<infolog<<endl;
}
//片段着色器
unsigned int fragmentShader1;
fragmentShader1 = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader1, 1, &fragmentShaderSource, NULL);
glCompileShader(fragmentShader1);
glGetShaderiv(fragmentShader1, GL_COMPILE_STATUS, &success);
if (success)
{
cout << "fragmentShader compile seccessfully" << endl;
}
else
{
glGetShaderInfoLog(fragmentShader1, 512, NULL, infolog);
cout << "fragmentShader compile failed" << endl << infolog << endl;
}
//着色器程序
unsigned int shaderProgram1;
shaderProgram1 = glCreateProgram();
//将着色器附加到着色程序并链接
glAttachShader(shaderProgram1, vertexShader1);
glAttachShader(shaderProgram1, fragmentShader1);
glLinkProgram(shaderProgram1);
glGetProgramiv(shaderProgram1, GL_LINK_STATUS, &success);
if (success)
{
cout << "fshaderProgram link seccessfully" << endl;
}
else
{
glGetProgramInfoLog(shaderProgram1, 512, NULL, infolog);
cout << "fshaderProgram link failed" << endl << infolog << endl;
}
//顶点着色器
unsigned int vertexShader2;
vertexShader2 = glCreateShader(GL_VERTEX_SHADER);
//绑定着色源代码
glShaderSource(vertexShader2, 1, &vertexShaderSource2, NULL);
//编译着色源代码
glCompileShader(vertexShader2);
//获取编译状态
glGetShaderiv(vertexShader2, GL_COMPILE_STATUS, &success);
if (success)
{
cout << "vertexshader compile seccessfully" << endl;
}
else
{
glGetShaderInfoLog(vertexShader2, 512, NULL, infolog);
cout << "vertexshader compile failed" << endl << infolog << endl;
}
//片段着色器
unsigned int fragmentShader2;
fragmentShader2 = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader2, 1, &fragmentShaderSource2, NULL);
glCompileShader(fragmentShader2);
glGetShaderiv(fragmentShader2, GL_COMPILE_STATUS, &success);
if (success)
{
cout << "fragmentShader compile seccessfully" << endl;
}
else
{
glGetShaderInfoLog(fragmentShader2, 512, NULL, infolog);
cout << "fragmentShader compile failed" << endl << infolog << endl;
}
//着色器程序
unsigned int shaderProgram2;
shaderProgram2 = glCreateProgram();
//将着色器附加到着色程序并链接
glAttachShader(shaderProgram2, vertexShader2);
glAttachShader(shaderProgram2, fragmentShader2);
glLinkProgram(shaderProgram2);
glGetProgramiv(shaderProgram2, GL_LINK_STATUS, &success);
if (success)
{
cout << "fshaderProgram link seccessfully" << endl;
}
else
{
glGetProgramInfoLog(shaderProgram2, 512, NULL, infolog);
cout << "fshaderProgram link failed" << endl << infolog << endl;
}
//顶点缓冲对象 1是vb0的id
unsigned int VB0;
glGenBuffers(1, &VB0);
unsigned int VB1;
glGenBuffers(2, &VB1);
//顶点数组对象
unsigned int VA0;
glGenVertexArrays(1, &VA0);
unsigned int VA1;
glGenVertexArrays(2, &VA1);
unsigned int EB0;
glGenBuffers(1, &EB0);
//绑定VA1 任何随后的顶点属性调用都会储存在这个VA1中。
glBindVertexArray(VA1);
//把顶点数组复制到缓冲中供OpenGL使用
glBindBuffer(GL_ARRAY_BUFFER, VB1);//array_buffer绑定至vb1 下一句是将vertices绑定至vb1。继而确认了array_buffer为vertices;
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices2), vertices2, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
// glBindVertexArray(0);
glBindVertexArray(VA0);
glBindBuffer(GL_ARRAY_BUFFER, VB0);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
// glBindVertexArray(0);
//使用索引缓冲
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EB0);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
//链接顶点属性 设置顶点属性指针
//每个顶点属性从一个VBO管理的内存中获得它的数据,而具体是从哪个VBO(程序中可以有多个VBO)获取则是通过在调用glVertexAttribPointer时绑定到GL_ARRAY_BUFFER的VBO决定的。由于在调用glVertexAttribPointer之前绑定的是先前定义的VBO对象,顶点属性0现在会链接到它的顶点数据。
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
//glBindBuffer(GL_ARRAY_BUFFER, 0);
//glBindVertexArray(0);
int i = 1;
while (!glfwWindowShouldClose(window))
{
//使用shaderProgram
if (i == 1) {
glUseProgram(shaderProgram2);
i = 0;
}
else {
i = 1;
glUseProgram(shaderProgram1);
}
processInput(window);
glClear(GL_COLOR_BUFFER_BIT);
glBindVertexArray(VA0);
//绘制
//根据已经确认的array_buffer数组进行绘制 从0开始绘制3个点
glDrawArrays(GL_TRIANGLES, 0, 3);//不能是5,因为5的话,剩下两个点没有办法绘制为三角形
glBindVertexArray(VA1);
glDrawArrays(GL_TRIANGLES, 0, 3);
/*
* 利用glDrawArrays绘制顶点数组中的三角形
* glDrawArrays(GL_TRIANGLES, 0, 3);
* glDrawArrays(GL_TRIANGLES, 3, 3);
*/
//使用索引缓冲进行绘制
// glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
glfwSwapBuffers(window);
glfwPollEvents();
}
//删除 释放资源
glDeleteShader(vertexShader1);
glDeleteShader(fragmentShader1);
glDeleteBuffers(1, &VB0);
glDeleteVertexArrays(1, &VA0);
glDeleteProgram(shaderProgram1);
glfwTerminate();
return 0;
}
void framebuffer_size_callback(GLFWwindow* window, int width, int heigth)
{
glViewport(0, 0, width, heigth);
cout << width << " " << heigth << endl;
}
void processInput(GLFWwindow* window)
{
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
{
glfwSetWindowShouldClose(window, true);
}
}
void clearscreen(GLFWwindow* window)
{
glClearColor(color1, color2, color3, color4);
color1 += 0.01;
//color2 += 0.01;
color3 += 0.01;
//color4 += 0.01;
}
OpenGL 绘制三角形
最新推荐文章于 2022-11-15 10:00:00 发布