Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Konovalov Anton BPI132
- USING FREEGLUT!
- There is no render scene
- */
- #include <cstdlib>
- #include <iostream>
- using namespace std;
- #include <GL/glew.h>
- #include "GL/freeglut.h"
- #include "shaders.h"
- float firBottom[9];
- float firUp[9];
- float firColor[9];
- float firTrunk[12];
- float firTrunkColor[12];
- float starA[9];
- float starB[9];
- float starColor[9];
- const int figures_count = 5;
- UINT uiVBO[figures_count * 2];
- UINT uiVAO[figures_count];
- CShader shVertex, shFragment;
- CShaderProgram spMain;
- int initCounter = 0;
- void initTriangle(float vertexAr[], float colorAr[]) {
- int index = initCounter++;
- glBindVertexArray(uiVAO[index]);
- glBindBuffer(GL_ARRAY_BUFFER, uiVBO[index * 2]);
- glBufferData(GL_ARRAY_BUFFER, 9 * sizeof(float), vertexAr, GL_STATIC_DRAW);
- glEnableVertexAttribArray(0);
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
- glBindBuffer(GL_ARRAY_BUFFER, uiVBO[index * 2 + 1]);
- glBufferData(GL_ARRAY_BUFFER, 9 * sizeof(float), colorAr, GL_STATIC_DRAW);
- glEnableVertexAttribArray(1);
- glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);
- }
- void initSquare(float vertexAr[], float colorAr[]) {
- int index = initCounter++;
- glBindVertexArray(uiVAO[index]);
- glBindBuffer(GL_ARRAY_BUFFER, uiVBO[index * 2]);
- glBufferData(GL_ARRAY_BUFFER, 12 * sizeof(float), vertexAr, GL_STATIC_DRAW);
- glEnableVertexAttribArray(0);
- glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
- glBindBuffer(GL_ARRAY_BUFFER, uiVBO[index * 2 + 1]);
- glBufferData(GL_ARRAY_BUFFER, 12 * sizeof(float), colorAr, GL_STATIC_DRAW);
- glEnableVertexAttribArray(1);
- glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);
- }
- bool init_resources(void) {
- glClearColor(0.1f, 0.0f, 0.2f, 1.0f);
- // Setup firbot vertices
- firBottom[0] = -0.4f; firBottom[1] = -0.5f; firBottom[2] = 0.0f;
- firBottom[3] = 0.4f; firBottom[4] = -0.5f; firBottom[5] = 0.0f;
- firBottom[6] = 0.0f; firBottom[7] = 0.0f; firBottom[8] = 0.0f;
- // Setup firup vertices
- firUp[0] = -0.4f; firUp[1] = -0.2f; firUp[2] = 0.0f;
- firUp[3] = 0.4f; firUp[4] = -0.2f; firUp[5] = 0.0f;
- firUp[6] = 0.0f; firUp[7] = 0.3f; firUp[8] = 0.0f;
- // Setup fir color
- firColor[0] = 0.0f; firColor[1] = 1.0f; firColor[2] = 0.2f;
- firColor[3] = 0.0f; firColor[4] = 1.0f; firColor[5] = 0.2f;
- firColor[6] = 0.0f; firColor[7] = 1.0f; firColor[8] = 0.2f;
- // Setup trunk vertices
- firTrunk[0] = -0.1f; firTrunk[1] = -0.5f; firTrunk[2] = 0.0f;
- firTrunk[3] = -0.1f; firTrunk[4] = -0.7f; firTrunk[5] = 0.0f;
- firTrunk[6] = 0.1f; firTrunk[7] = -0.5f; firTrunk[8] = 0.0f;
- firTrunk[9] = 0.1f; firTrunk[10] = -0.7f; firTrunk[11] = 0.0f;
- // Setup trunk color
- firTrunkColor[0] = 0.4f; firTrunkColor[1] = 0.2f; firTrunkColor[2] = 0.1f;
- firTrunkColor[3] = 0.4f; firTrunkColor[4] = 0.2f; firTrunkColor[8] = 0.1f;
- firTrunkColor[6] = 0.4f; firTrunkColor[7] = 0.2f; firTrunkColor[5] = 0.1f;
- firTrunkColor[9] = 0.4f; firTrunkColor[10] = 0.2f; firTrunkColor[11] = 0.1f;
- // Setup starA vertices
- starA[0] = -0.1f; starA[1] = 0.25f; starA[2] = 0.0f;
- starA[3] = 0.1f; starA[4] = 0.25f; starA[5] = 0.0f;
- starA[6] = 0.0f; starA[7] = 0.45f; starA[8] = 0.0f;
- // Setup starB vertices
- starB[0] = -0.1f; starB[1] = 0.4f; starB[2] = 0.0f;
- starB[3] = 0.1f; starB[4] = 0.4f; starB[5] = 0.0f;
- starB[6] = 0.0f; starB[7] = 0.2f; starB[8] = 0.0f;
- // Setup star color
- starColor[0] = 1.0f; starColor[1] = 1.0f; starColor[2] = 0.0f;
- starColor[3] = 1.0f; starColor[4] = 1.0f; starColor[5] = 0.0f;
- starColor[6] = 1.0f; starColor[7] = 1.0f; starColor[8] = 0.0f;
- glGenVertexArrays(figures_count, uiVAO); // Generate two VAOs, one for triangle and one for quad
- glGenBuffers(figures_count * 2, uiVBO); // And four VBOs
- // Setup fir trunk
- initSquare(firTrunk, firTrunkColor);
- // Setup fir bot
- initTriangle(firBottom, firColor);
- // Setup firUp
- initTriangle(firUp, firColor);
- // Setup starA
- initTriangle(starA, starColor);
- // Setup starB
- initTriangle(starB, starColor);
- // Load shaders and create shader program
- shVertex.LoadShader("data\\shaders\\shader.vert", GL_VERTEX_SHADER);
- shFragment.LoadShader("data\\shaders\\shader.frag", GL_FRAGMENT_SHADER);
- spMain.CreateProgram();
- spMain.AddShaderToProgram(&shVertex);
- spMain.AddShaderToProgram(&shFragment);
- spMain.LinkProgram();
- spMain.UseProgram();
- return true;
- }
- void free_resources() {
- spMain.DeleteProgram();
- shVertex.DeleteShader();
- shFragment.DeleteShader();
- }
- void draw()
- {
- glClear(GL_COLOR_BUFFER_BIT);
- //Rectangle
- glBindVertexArray(uiVAO[0]);
- glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
- //Triangles
- for (int i = 1; i < figures_count; i++)
- {
- glBindVertexArray(uiVAO[i]);
- glDrawArrays(GL_TRIANGLES, 0, 3);
- }
- glutSwapBuffers();
- }
- int main(int argc, char **argv)
- {
- glutInit(&argc, argv);
- glutInitDisplayMode(GLUT_SINGLE);
- glutInitWindowSize(500, 500);
- glutInitWindowPosition(100, 100);
- glutCreateWindow("OpenGL HW1 - Konovalov Anton");
- GLenum glew_status = glewInit();
- if (glew_status != GLEW_OK) {
- cerr << "Error: glewInit: " << glewGetErrorString(glew_status) << endl;
- return EXIT_FAILURE;
- }
- if (!init_resources())
- return EXIT_FAILURE;
- glutDisplayFunc(draw);
- glutMainLoop();
- free_resources();
- return EXIT_SUCCESS;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement