C++ 如何在OpenGL中绘制两个或多个三角形?

C++ 如何在OpenGL中绘制两个或多个三角形?,c++,opengl,glfw,C++,Opengl,Glfw,有人能告诉我如何修改我的代码,这样我可以画多个三角形吗 我希望能完成如图所示的任务: //包括标准头 #包括 #包括 //包括GLEW #包括 //包括GLFW #包括 GLFWwindow*窗口; //包括GLM #包括 #包括 使用名称空间glm; #包括 内部主(空) { //初始化GLFW 如果(!glfwInit()) { fprintf(stderr,“未能初始化GLFW\n”); getchar(); 返回-1; } glfwWindowHint(GLFW_样本,4个); glf

有人能告诉我如何修改我的代码,这样我可以画多个三角形吗

我希望能完成如图所示的任务:

//包括标准头
#包括
#包括
//包括GLEW
#包括
//包括GLFW
#包括
GLFWwindow*窗口;
//包括GLM
#包括
#包括
使用名称空间glm;
#包括
内部主(空)
{
//初始化GLFW
如果(!glfwInit())
{
fprintf(stderr,“未能初始化GLFW\n”);
getchar();
返回-1;
}
glfwWindowHint(GLFW_样本,4个);
glfwWindowHint(GLFW_上下文_版本_专业,3);
glfwWindowHint(GLFW_上下文_版本_小调,3);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT,GL_TRUE);//使MacOS高兴;不需要
glfwWindowHint(GLFW_OPENGL_配置文件、GLFW_OPENGL_核心配置文件);
//打开窗口并创建其OpenGL上下文
window=glfwCreateWindow(1024768,“教程04-彩色立方体”,NULL,NULL);
如果(窗口==NULL){
fprintf(stderr,“无法打开GLFW窗口。如果您有英特尔GPU,则它们与3.3不兼容。请尝试教程的2.1版本。\n”);
getchar();
glfwTerminate();
返回-1;
}
glfwMakeContextCurrent(窗口);
//初始化GLEW
glewExperimental=true;//核心配置文件需要
如果(glewInit()!=GLEW\u确定){
fprintf(stderr,“未能初始化GLEW\n”);
getchar();
glfwTerminate();
返回-1;
}
//确保我们可以捕获下面按下的退出键
glfwSetInputMode(窗口,GLFW_粘滞键,GL_真);
//深蓝色背景
glClearColor(0.0f、0.0f、0.4f、0.0f);
//启用深度测试
glEnable(GLU深度试验);
//如果片段比前一个片段更靠近摄影机,则接受该片段
glDepthFunc(GL_LESS);
胶合垂直排列;
glgenvertexarray(1和VertexArrayID);
glBindVertexArray(VertexArrayID);
//从着色器创建并编译我们的GLSL程序
GLuint programID=加载着色器(“TransformVertexShader.vertexshader”、“ColorFragmentShader.fragmentshader”);
//为我们的“MVP”制服找个把手
GLuint MatrixID=glGetUniformLocation(programID,“MVP”);
垂直计数=3;
静态常量GLfloat g_顶点_缓冲区_数据[]={
-0.5f,0.5f,0.0f,
0.5f,0.5f,0.0f,
0.5f,-0.5f,0.0f,
};
静态常量GLfloat g_颜色_缓冲区_数据[]={
1.0f,0.0f,0.0f,
1.0f,0.0f,0.0f,
1.0f,0.0f,0.0f,
};
GLuint顶点缓冲区;
glGenBuffers(1和vertexbuffer);
glBindBuffer(GL_数组_BUFFER,vertexbuffer);
glBufferData(GLU数组缓冲区、sizeof(g顶点缓冲区数据)、g顶点缓冲区数据、GLU静态绘图);
胶合色缓冲液;
glGenBuffers(1和colorbuffer);
glBindBuffer(GL_数组_BUFFER,colorbuffer);
glBufferData(GLU数组缓冲区、sizeof(g颜色缓冲区数据)、g颜色缓冲区数据、GLU静态绘图);
做{
//清除屏幕
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
//使用我们的着色器
glUseProgram(programmaid);
glm::mat4 MVP=glm::mat4(1.0);
//将转换发送到当前绑定的着色器,
//穿着“MVP”制服
glUniformMatrix4fv(MatrixID,1,GL_FALSE,&MVP[0][0]);
//1rst属性缓冲区:顶点
GlenableVertexAttributeArray(0);
glBindBuffer(GL_数组_BUFFER,vertexbuffer);
glvertexattributepointer(
0,//属性。0没有特定原因,但必须与着色器中的布局匹配。
3,//大小
GL\u FLOAT,//类型
GL_FALSE,//标准化?
0,//步幅
(void*)0//数组缓冲区偏移量
);
//第二属性缓冲区:颜色
GlenableVertexAttributeArray(1);
glBindBuffer(GL_数组_BUFFER,colorbuffer);
glvertexattributepointer(
1,//属性。1没有特殊原因,但必须与着色器中的布局匹配。
3,//大小
GL\u FLOAT,//类型
GL_FALSE,//标准化?
0,//步幅
(void*)0//数组缓冲区偏移量
);
//画三角形!
GLDrawArray(GLU三角形,0,垂直计数*3);
glDisableVertexAttributeArray(0);
glDisableVertexAttributeArray(1);
//交换缓冲区
glfwSwapBuffers(窗口);
glfwPollEvents();
}//检查是否按下ESC键或窗口是否关闭
while(glfwGetKey(窗口,GLFW_键_退出)!=GLFW_按&&
glfwWindowShouldClose(窗口)==0);
//清除VBO和着色器
glDeleteBuffers(1和vertexbuffer);
glDeleteBuffers(1和colorbuffer);
glDeleteProgram(programID);
glDeleteVertexArrays(1和VertexArrayID);
//关闭OpenGL窗口并终止GLFW
glfwTerminate();
返回0;
}

始终可以创建新的顶点缓冲区,但通常最好实现顶点和片段着色器。如果选择使用着色器,则可以绘制缓冲区、变换顶点着色器,然后再次绘制缓冲区。片段着色器还提供了一种更好的动态指定颜色的方法。你可以在

上阅读更多内容并看到一些例子,它实际上就在你的鼻子前面

三角形由3个顶点定义

static const GLfloat g_vertex_buffer_data[] = {
    -0.5f, 0.5f, 0.0f,
    0.5f, 0.5f, 0.0f,
    0.5f, -0.5f, 0.0f,
};
这里,您使用3个三维顶点初始化了顶点数据数组。那是一个三角形

除了扩展
g\u color\u buffer\u data
数组和相应地更改
verticeCount
之外,您只需向该数组添加更多三角形,即3组3个顶点

因此:

static const GLfloat g_vertex_buffer_data[] = {
    -0.50f, +0.50f, +0.00f,
    +0.50f, +0.50f, +0.00f,
    +0.50f, -0.50f, +0.00f,
     
    -0.50f, -0.25f, +0.00f,
    -0.50f, -0.50f, +0.00f,
    -0.25f, -0.50f, +0.00f,
};

static const GLfloat g_color_buffer_data[] = {
    1.0f, 0.0f, 0.0f,
    1.0f, 0.0f, 0.0f,
    1.0f, 0.0f, 0.0f,
    
    0.0f, 0.0f, 1.0f,
    0.0f, 0.0f, 1.0f,
    0.0f, 0.0f, 1.0f,
};
会给你两个三角形:一个红色,一个蓝色

Y
static const GLfloat g_vertex_buffer_data[] = {
    -0.50f, +0.50f, +0.00f,
    +0.50f, +0.50f, +0.00f,
    +0.50f, -0.50f, +0.00f,
     
    -0.50f, -0.25f, +0.00f,
    -0.50f, -0.50f, +0.00f,
    -0.25f, -0.50f, +0.00f,
};

static const GLfloat g_color_buffer_data[] = {
    1.0f, 0.0f, 0.0f,
    1.0f, 0.0f, 0.0f,
    1.0f, 0.0f, 0.0f,
    
    0.0f, 0.0f, 1.0f,
    0.0f, 0.0f, 1.0f,
    0.0f, 0.0f, 1.0f,
};
int verticeCount = sizeof(g_vertex_buffer_data) / (sizeof(g_vertex_buffer_data[0]) * 3);