Как я могу нарисовать два квадрата в OpenGl - PullRequest
0 голосов
/ 08 октября 2019

Этот код предназначен для рисования двух треугольников в конце в виде квадрата.

Мне нужно нарисовать еще один квадрат рядом с ним.

Это вывод этого кода enter image description here

У меня проблема с этим, я не знаю, каксделай это? Я уже пытался создать другой массив, но он не работал, я думаю, что проблема в точке вершин.

//Shaders
const char *vertexShaderSource =
"#version 410   \n"
"layout (location=0) in vec3 position; \n"
"void main(void)\n"
"{ gl_Position = vec4(position.x , position.y , position.z ,1.0f);}";

//Frsgment Shaders
const char *fragmentShaderSource =
"#version 410   \n"
"out vec4 fragcolor;\n"
"uniform vec4 ourColor;\n"
"void main(void)\n"
"{ fragcolor = vec4(0.1,0.0,1.0,1.0) ;}";







//First sequare
GLfloat vertices1[]={

    0.5f,  0.5f, 0.0f,
    0.5f,  -0.5f, 0.0f,
    -0.5f,  -0.5f, 0.0f,
     -0.5f,  0.5f, 0.0f,
 };

GLfloat vertices2[]={

    -0.5f,  -0.5f, 0.0f,
    -0.5f,  0.5f, 0.0f,
    0.5f,  0.5f, 0.0f,
    0.5f,  -0.5f, 0.0f,
   };

GLuint VBOs[2] ,VAOs[2] ;
glGenVertexArrays(2,VAOs);
glGenBuffers(2,VBOs);

 // first sequare
glBindVertexArray(VAOs[0]);

glBindBuffer(GL_ARRAY_BUFFER,VBOs[0]);

glBufferData(GL_ARRAY_BUFFER , sizeof(vertices1),
             vertices1,GL_STATIC_DRAW);

glVertexAttribPointer(0,3,GL_FLOAT ,GL_FALSE,
                      3*sizeof(GL_FLOAT),(GLvoid*)0);

glEnableVertexAttribArray(0);

glBindVertexArray(VAOs[1]);

glBindBuffer(GL_ARRAY_BUFFER,VBOs[1]);

glBufferData(GL_ARRAY_BUFFER , sizeof(vertices2),
             vertices2,GL_STATIC_DRAW);

glVertexAttribPointer(0,3,GL_FLOAT ,GL_FALSE,
                      3*sizeof(GL_FLOAT),(GLvoid*)0);

glEnableVertexAttribArray(0);

glBindBuffer(GL_ARRAY_BUFFER,0);

glBindVertexArray(0);

glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

while (!glfwWindowShouldClose(mainWindow))
{
    glfwPollEvents();

    glClearColor(0.1f, 0.2f, 0.3f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    glUseProgram(renderingProgram);

    glBindVertexArray(VAOs[0]);
    glDrawArrays(GL_TRIANGLES, 0, 3);
    glBindVertexArray(0);

    glBindVertexArray(VAOs[1]);
    glDrawArrays(GL_TRIANGLES, 0, 3);
    glBindVertexArray(0);


    glfwSwapBuffers(mainWindow);
}

1 Ответ

0 голосов
/ 08 октября 2019

Измените ваш вершинный шейдер на следующее:

#version 410
layout (location=0) in vec3 position;
uniform vec3 displace; // new!
void main(void) {
    gl_Position = vec4(displace + position, 1.0f);
}

Это изменяет позиции вершин в соответствии со значением displace единой переменной .

InВаш цикл рендеринга:

GLint u_displace = glGetUniformLocation(renderingProgram, "displace");

glBindVertexArray(VAOs[0]);
glUniform3f(u_displace, 0, 0, 0); 
glDrawArrays(GL_TRIANGLES, 0, 3);

glBindVertexArray(VAOs[1]);
glUniform3f(u_displace, 0, 0.25, 0); 
glDrawArrays(GL_TRIANGLES, 0, 3);
glBindVertexArray(0);

Это установит значение униформы «смещение» равным (0,0,0) для первого квадрата и (0, 0,25, 0) для второго, эффективнорисование со смещением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...