如何绘制多个形状

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何绘制多个形状相关的知识,希望对你有一定的参考价值。

我正在尝试使用OpenGL创建一个创建两个矩形的程序,但我的问题是,当我创建两个model_views时,第一个被第二个覆盖,因此只显示一个矩形,我不知道如何显示两者。我发布了整个代码。如何让两个三角形渲染?

using namespace std;

#include "vgl.h"
#include "LoadShaders.h"
#include "glm\glm.hpp"
#include "glm\gtc\matrix_transform.hpp"

enum VAO_IDs { Triangles, NumVAOs };
enum Buffer_IDs { ArrayBuffer, NumBuffers };
enum Attrib_IDs { vPosition = 0 };

GLuint VAOs[NumVAOs];
GLuint Buffers[NumBuffers];
GLuint location;

const GLuint NumVertices = 4;


//---------------------------------------------------------------------
// Setting up our pipeline and preparing to draw 
void init(void)
{
//Defining the name of our shader files
ShaderInfo shaders[] = {
    { GL_VERTEX_SHADER, "triangles.vert" },
    { GL_FRAGMENT_SHADER, "triangles.frag" },
    { GL_NONE, NULL }
};

//Loading and attaching shaders to our pipeline
GLuint program = LoadShaders(shaders);
glUseProgram(program);  //My Pipeline is set up

// Coordinates of vertices (Square)
GLfloat vertices[NumVertices][2] = {
    { -0.3, -0.45 }, 
    { 0.3, -0.45 },
    { 0.3, 0.45 },
    { -0.3, 0.45 }

};

// Colors for vertices in {R, G, B} mode
GLfloat colorData[NumVertices][3] = {
    { 1,0,0 }, //Red
    { 0,1,0 }, //Green
    { 0,0,1 }, //Blue
    { 1,1,1 }  //White
};

glGenBuffers(2, Buffers);
glBindBuffer(GL_ARRAY_BUFFER, Buffers[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glBindAttribLocation(program, 0, "vPosition");
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));
glEnableVertexAttribArray(0);

glBindBuffer(GL_ARRAY_BUFFER, Buffers[1]);
glBufferData(GL_ARRAY_BUFFER, sizeof(colorData), colorData, GL_STATIC_DRAW);
glBindAttribLocation(program, 1, "vertexColor");
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));
glEnableVertexAttribArray(1);
location = glGetUniformLocation(program, "model_matrix");

}


//---------------------------------------------------------------------
//This is done by using glutDisplayFunc function. Look at the main method
void drawScene(void)
{
//Clear the screen and preparing to draw
glClear(GL_COLOR_BUFFER_BIT);

/////////THIS IS WERE I CREATE RECTANGLES
//Sun
glm::mat4 model_view = glm::translate(glm::mat4(1.0), glm::vec3(0.0, 0.0, 0.0));

model_view = glm::scale(model_view, glm::vec3(0.5, 0.5, 0)); //shrink it 

glUniformMatrix4fv(location, 1, GL_FALSE, &model_view[0][0]);

glm::mat4 model_view2 = glm::translate(glm::mat4(1.0), glm::vec3(0.5, 0.0, 0.0));

model_view2 = glm::scale(model_view2, glm::vec3(0.5, 0.5, 0)); //shrink it

glUniformMatrix4fv(location, 1, GL_FALSE, &model_view2[0][0]);

//The following function passes the generated rotation function into the vertex-shader  

//Starting the pipeline
glDrawArrays(GL_QUADS, 0, NumVertices);
glDrawArrays(GL_QUADS, 0, NumVertices);

//Flush the image onto the window (screen)
glFlush();
}

//The registration happens in the main() function using 
glutIdleFunc(runEveryFrame) function.
void runEveryFrame()
{
//Increasing our rotation angle
rotate_value += 0.001;

glutPostRedisplay();
}

int main(int argc, char** argv)
{
//Initializing to draw
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA);
glutInitWindowSize(512, 512);
glutCreateWindow("Hello World");
glewInit(); 

//init function is defined above
init();

//Registering the display function
glutDisplayFunc(drawScene);

//Registering the idle function
glutIdleFunc(runEveryFrame);

//glutMainLoop enters the event processing loop
glutMainLoop();



}
答案

使用相同的参数调用glDrawArrays,而不更改两个调用之间的任何统一。我打赌这两种形状都是绘制的,一种是另一种形状。

如果统一数据(模型/视图矩阵)已更改,则必须在每个glUniformXXX调用之前调用glDrawArrays

void drawScene(void) {

    glClear(GL_COLOR_BUFFER_BIT);

    //first draw call with model/view transformation 1
    glm::mat4 model_view = glm::translate(glm::mat4(1.0), glm::vec3(0.0, 0.0, 0.0));
    model_view = glm::scale(model_view, glm::vec3(0.5, 0.5, 0)); //shrink it 
    glUniformMatrix4fv(location, 1, GL_FALSE, &model_view[0][0]);
    glDrawArrays(GL_QUADS, 0, NumVertices);

    //second draw call with model/view transformation 2
    glm::mat4 model_view2 = glm::translate(glm::mat4(1.0), glm::vec3(0.5, 0.0, 0.0));
    model_view2 = glm::scale(model_view2, glm::vec3(0.5, 0.5, 0));
    glUniformMatrix4fv(location, 1, GL_FALSE, &model_view2[0][0]);
    glDrawArrays(GL_QUADS, 0, NumVertices);


    //Flush the image onto the window (screen)
    glFlush();
}

以上是关于如何绘制多个形状的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL - 如何使用弹出菜单绘制多个不同的 2D 形状?

如何创建片段以重复变量编号中的代码行

无法在opengl中绘制多个对象

在 OpenGL 中绘制多个形状

Javascript画布 - 矩形中的相交圆孔或如何合并多个圆弧路径

如何在 UIScrollView 中绘制自定义形状