#include "Rectangles.h"Rectangles::Rectangles(){
}
Rectangles::~Rectangles(){
}voidRectangles::init(){//x,y,z opengl coordinates, the vertex data, three 3d point in normalized device coordinates
GLfloat vertexs[] ={0.5f, 0.5f, 0.0f, //0-right up
0.5f, -0.5f, 0.0f, //1-right down
-0.5f, 0.5f, 0.0f, //2-left up
-0.5f, -0.5f, 0.0f, //3-left down
};//vertex draw index array
GLuint indexs[] ={0, 1, 2,1, 2, 3,
};//define VAO, vertex array object//GLuint VAO;
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);//bind vertex array object//define VBO, vertex buffer object
GLuint VBO;
glGenBuffers(1, &VBO); //gen buffer object
glBindBuffer(GL_ARRAY_BUFFER, VBO); //bind buffer to the target
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexs), vertexs, GL_STATIC_DRAW); //copy vertex data to VBO//define EBO, element buffer object
GLuint EBO;
glGenBuffers(1, &EBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(indexs), indexs, GL_STATIC_DRAW);//set vertex attribute point
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);
glEnableVertexAttribArray(0);
glBindVertexArray(0);//unbind vertex array object//create shader program
this->createShaderProgram();
}voidRectangles::draw(){//use shader programs
glUseProgram(shaderProgram);//draw the Rectangles
glBindVertexArray(VAO);//glDrawArrays(GL_TRIANGLES, 0, 3);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); //GL_LINE set the wireframe mode
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
glBindVertexArray(0);
}voidRectangles::createVertexShader(){//compile vertex shader source
std::string vertexShaderStr = this->getVertexShaderSrc();const char *vertexShaderSrc =vertexShaderStr.c_str();
std::cout<< "vertexShaderSrc:\n" <
vertexShader = glCreateShader(GL_VERTEX_SHADER); //create vertex shader object
glShaderSource(vertexShader, 1, &vertexShaderSrc, NULL); //shader source attach to shader object
glCompileShader(vertexShader); //compile shader//compile result check
GLint success;
GLchar infoLog[512];
glGetShaderiv(vertexShader, GL_COMPILE_STATUS,&success);if (!success){
glGetShaderInfoLog(vertexShader,512, NULL, infoLog);
std::cout<< "vertex shader source compile failed...\n" << infoLog <<:endl>
std::cout<
}
}voidRectangles::createFragmentShader(){//compile fragment shader source
std::string fragmentShaderStr = this->getFragmentShaderSrc();const char *fragmentShaderSrc =fragmentShaderStr.c_str();
std::cout<< "\n\nfragmentShaderSrc:\n" <
fragmentShader =glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader,1, &fragmentShaderSrc, NULL);
glCompileShader(fragmentShader);
}voidRectangles::createShaderProgram(){this->createVertexShader();this->createFragmentShader();if (vertexShader == NULL || fragmentShader ==NULL){return;
}//shader program, link vertex shader object and fragment shader object//GLuint shaderProgram;
shaderProgram = glCreateProgram(); //create shader program
glAttachShader(shaderProgram, vertexShader); //attach vertex shader
glAttachShader(shaderProgram, fragmentShader); //attach fragment shader
glLinkProgram(shaderProgram); //linking//check link result
GLint success;
GLchar infoLog[512];
glGetProgramiv(shaderProgram, GL_LINK_STATUS,&success);if (!success){
glGetProgramInfoLog(shaderProgram,512, NULL, infoLog);
std::cout<< "shader program linking failed...\n" << infoLog <<:endl>
}//delete vertex shader object and fragment shader object
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
}
std::stringRectangles::getVertexShaderSrc(){
std::string vertexShaderStr =
"#version 330 core\n"
"layout (location = 0) in vec3 pos;"
"void main () {"
"gl_Position = vec4(pos, 1.0);"
"}";returnvertexShaderStr;
}
std::stringRectangles::getFragmentShaderSrc(){
std::string fragmentShaderStr =
"#version 330 core\n"
"out vec4 color;"
"void main () {"
"color = vec4(1.0f, 0.1f, 0.1f, 1.0f);"
"}";returnfragmentShaderStr;
}