C++ 使用着色器绘制多个对象(GLEW)

C++ 使用着色器绘制多个对象(GLEW),c++,opengl,glut,glew,vao,C++,Opengl,Glut,Glew,Vao,我想使用三角形扇子绘制不同的图形,但我不确定如何让程序绘制第二个图形。每次我想更改颜色或绘制新图形时,是否需要第二个vertexShaderSource和第二个fragmentShaderSource 代码如下: #include <GL/glew.h> #include <GL/glut.h> #include <stdio.h> const char* vertexShaderSource = "#version 330 core\n"

我想使用三角形扇子绘制不同的图形,但我不确定如何让程序绘制第二个图形。每次我想更改颜色或绘制新图形时,是否需要第二个vertexShaderSource和第二个fragmentShaderSource

代码如下:

#include <GL/glew.h>
#include <GL/glut.h>
#include <stdio.h>

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.0f, 0.0f, 0.0f);\n" // To set the color.
"}\n\0";

// Set of vertices for the different figures that make up the drawing.
float vertices[] = {
    -0.8f, 0.6f, 0.0f, // Center.
    -0.8f, 0.4f, 0.0f,
    -0.83f, 0.44f, 0.0f,
    -0.87f, 0.51f, 0.0f,
    -0.9f, 0.57f, 0.0f,
    -0.93f, 0.63f, 0.0f,
    -0.95f, 0.69f, 0.0f,
    -0.97f, 0.75f, 0.0f,
    -0.98f, 0.8f, 0.0f,
    -0.91f, 0.8f, 0.0f,
    -0.85f, 0.79f, 0.0f,
    -0.8f, 0.77f, 0.0f,
};

unsigned int VBO, VAO;
GLuint vertexShader;
GLuint fragmentShader;
GLuint shaderProgram;

void display(void){
    // Background color.
    glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT);
    glUseProgram(shaderProgram);
    glBindVertexArray(VAO);
    glDrawArrays(GL_TRIANGLE_FAN, 0, 12);
    glBindVertexArray(0);
    glFlush();
}

// Main.
int main(int argc, char** argv){
    glutInit(&argc, argv);
    // Color mode.
    glutInitDisplayMode(GLUT_RGBA);
    // Window size.
    glutInitWindowSize(500, 500);
    // Title.
    glutCreateWindow("Tarea 3: Figura con curvas");
    GLenum err = glewInit();
    if(err!=GLEW_OK) {
        printf("glewInit failed: %s",glewGetErrorString(err));   
    exit(1);  
    } 

    vertexShader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
    glCompileShader(vertexShader);
    
    fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
    glCompileShader(fragmentShader);
    
    shaderProgram = glCreateProgram();
    glAttachShader(shaderProgram, vertexShader);
    glAttachShader(shaderProgram, fragmentShader);
    glLinkProgram(shaderProgram);
    glDeleteShader(vertexShader);
    glDeleteShader(fragmentShader);
    
    glGenVertexArrays(1, &VAO);
    glGenBuffers(1, &VBO);
    glBindVertexArray(VAO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
    
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
    glEnableVertexAttribArray(0);
    
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindVertexArray(0);
    glutDisplayFunc(display);
    glutMainLoop();
}

#包括
#包括
#包括
const char*vertexShaderSource=“#版本330核心\n”
“vec3 aPos中的布局(位置=0);\n”
“void main()\n”
“{\n”
“gl_Position=vec4(aPos.x,aPos.y,aPos.z,1.0);\n”
"}\0";
常量字符*fragmentShaderSource=“#版本330核心\n”
out vec4 FragColor;\n“void main()\n”
“{\n”
“FragColor=vec4(1.0f,0.0f,0.0f,0.0f);\n”//设置颜色。
“}\n\0”;
//构成图形的不同地物的顶点集。
浮动顶点[]={
-0.8f,0.6f,0.0f,//中心。
-0.8f、0.4f、0.0f、,
-0.83f,0.44f,0.0f,
-0.87f,0.51f,0.0f,
-0.9f、0.57f、0.0f、,
-0.93f、0.63f、0.0f、,
-0.95f、0.69f、0.0f、,
-0.97f、0.75f、0.0f、,
-0.98f、0.8f、0.0f、,
-0.91f、0.8f、0.0f、,
-0.85f、0.79f、0.0f、,
-0.8f、0.77f、0.0f、,
};
无符号整数VBO,VAO;
GLuint顶点着色器;
胶合碎片;
GLuint着色器程序;
作废显示(作废){
//背景色。
glClearColor(1.0f、1.0f、1.0f、0.0f);
glClear(GLU颜色缓冲位);
glUseProgram(shaderProgram);
glBindVertexArray(VAO);
gldrawArray(GL_三角形_扇,0,12);
glBindVertexArray(0);
glFlush();
}
//梅因。
int main(int argc,字符**argv){
glutInit(&argc,argv);
//颜色模式。
glutInitDisplayMode(GLUT_RGBA);
//窗口大小。
glutInitWindowSize(500500);
//标题。
glutCreateWindow(“Tarea 3:Figura con curvas”);
GLenum err=glewInit();
如果(错误!=GLEW_OK){
printf(“glewInit失败:%s”,glewGetErrorString(err));
出口(1);
} 
vertexShader=glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader,1和vertexShaderSource,NULL);
glCompileShader(顶点着色器);
fragmentShader=glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader,1和fragmentShaderSource,NULL);
glCompileShader(fragmentShader);
shaderProgram=glCreateProgram();
glAttachShader(着色器程序、顶点着色器);
glAttachShader(着色器程序、碎片着色器);
GLLINK程序(着色器程序);
glDeleteShader(顶点着色器);
glDeleteShader(fragmentShader);
glGenVertexArrays(1和VAO);
glGenBuffers(1,&VBO);
glBindVertexArray(VAO);
glBindBuffer(GL_数组_BUFFER,VBO);
glBufferData(GLU数组缓冲区、大小(顶点)、顶点、GLU静态图);
glvertexattributepointer(0,3,GL_FLOAT,GL_FALSE,3*sizeof(FLOAT),(void*)0);
GlenableVertexAttributeArray(0);
glBindBuffer(GL_数组_BUFFER,0);
glBindVertexArray(0);
glutDisplayFunc(显示器);
glutMainLoop();
}
无需(或建议)为网格使用不同的着色器。如果要绘制多个对象,则可以将网格的顶点属性放置到单独的网格:

gluintvbos[2];
glGenBuffers(2个,VBOs);
glBindBuffer(GL_数组_BUFFER,VBOs[0]);
glBufferData(GL_数组_缓冲区、大小(顶点)、顶点_1、GL_静态_绘制);
glBindBuffer(GL_数组_BUFFER,VBOs[1]);
glBufferData(GL_数组_缓冲区、大小(顶点)、顶点_2、GL_静态_绘制);
为每个网格指定一个网格:

GLuint-VAOs[2];
Glgenvertexarray(2,VAOs);
glBindVertexArray(VAOs[0]);
glBindBuffer(GL_数组_BUFFER,VBOs[0]);
glvertexattributepointer(0,3,GL_FLOAT,GL_FALSE,3*sizeof(FLOAT),(void*)0);
GlenableVertexAttributeArray(0);
glBindVertexArray(VAOs[1]);
glBindBuffer(GL_数组_BUFFER,VBOs[1]);
glvertexattributepointer(0,3,GL_FLOAT,GL_FALSE,3*sizeof(FLOAT),(void*)0);
GlenableVertexAttributeArray(0);
在draw调用之前绑定VAO:

glBindVertexArray(VAOs[0]);
gldrawArray(GL_三角形_扇,0,12);
glBindVertexArray(VAOs[1]);
GLD阵列(…);

当然,也可以将不同网格的所有顶点属性连续放置在一个VBO的数据存储中。如果顶点规范相同,则可以使用单个VAO


不同网格的不同位置可以通过顶点着色器中的顶点变换来实现。使用类型为
mat4
,以变换网格的顶点:

#版本330核心
vec3 aPos中的布局(位置=0);
统一mat4-u_模型;
void main()
{
gl_位置=u_模型*vec4(aPos.xyz,1.0);
}
见下文


如果两个地物相同,但位置不同,则可以绘制两次相同的网格,但必须更改模型变换
u\u model

不需要(或建议)为网格使用不同的着色器。如果要绘制多个对象,则可以将网格的顶点属性放置到单独的网格:

gluintvbos[2];
glGenBuffers(2个,VBOs);
glBindBuffer(GL_数组_BUFFER,VBOs[0]);
glBufferData(GL_数组_缓冲区、大小(顶点)、顶点_1、GL_静态_绘制);
glBindBuffer(GL_数组_BUFFER,VBOs[1]);
glBufferData(GL_数组_缓冲区、大小(顶点)、顶点_2、GL_静态_绘制);
为每个网格指定一个网格:

GLuint-VAOs[2];
Glgenvertexarray(2,VAOs);
glBindVertexArray(VAOs[0]);
glBindBuffer(GL_数组_BUFFER,VBOs[0]);
glvertexattributepointer(0,3,GL_FLOAT,GL_FALSE,3*sizeof(FLOAT),(void*)0);
GlenableVertexAttributeArray(0);
glBindVertexArray(VAOs[1]);
glBindBuffer(GL_数组_BUFFER,VBOs[1]);
glvertexattributepointer(0,3,GL_FLOAT,GL_FALSE,3*sizeof(FLOAT),(void*)0);
GlenableVertexAttributeArray(0);
在draw调用之前绑定VAO:

glBindVertexArray(VAOs[0]);
gldrawArray(GL_三角形_扇,0,12);
glBindVertexArray(VAOs[1]);
GLD阵列(…);

当然,也可以将不同网格的所有顶点属性连续放置在一个V的数据存储中