int setupVBOfromObj(char *objFileName){ int objError; if((objError = obj.readFromFile(objFileName))) return objError; obj.scale(); if(!obj.nNormals) obj.genFacesNormals(); else if(!obj.normIndGood) obj.rebuildAttribTable('n'); glGenVertexArrays(1, &handleOBJVAO); glBindVertexArray(handleOBJVAO); glGenBuffers(NUM_BUFFERS, OBJbuffers); glBindBuffer(GL_ARRAY_BUFFER, OBJbuffers[VERTICES]); glBufferData(GL_ARRAY_BUFFER, 3*obj.nAttribs*sizeof(GLfloat), obj.vertices, GL_STATIC_DRAW); glVertexPointer(3, GL_FLOAT, 0, BUFFER_OFFSET(0)); glEnableClientState(GL_VERTEX_ARRAY); glBindBuffer(GL_ARRAY_BUFFER, OBJbuffers[NORMALS]); glBufferData(GL_ARRAY_BUFFER, 3*obj.nAttribs*sizeof(GLfloat), obj.normals, GL_STATIC_DRAW); glNormalPointer(GL_FLOAT, 0, BUFFER_OFFSET(0)); glEnableClientState(GL_NORMAL_ARRAY); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, OBJbuffers[INDICES]); glBufferData(GL_ELEMENT_ARRAY_BUFFER, 3*obj.nFaces*sizeof(GLuint), obj.faces, GL_STATIC_DRAW); return 0; }
//============================================================================= // inicjalizacja stałych elementów maszyny stanu OpenGL //============================================================================= int init(char *objFileName) { // definicja sześchar *objFileNamecianu: // wierzchołki GLfloat cubeVertices[3*8] = { -0.1f, -0.1f, 0.1f, 0.1f, -0.1f, 0.1f, -0.1f, 0.1f, 0.1f, 0.1f, 0.1f, 0.1f, -0.1f, -0.1f, -0.1f, 0.1f, -0.1f, -0.1f, -0.1f, 0.1f, -0.1f, 0.1f, 0.1f, -0.1f }; // normalne GLfloat cubeNormals[3*8] = { -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f }; // indeksy GLuint cubeIndices[3*6*2] = { 0, 1, 2, 2, 1, 3, 1, 5, 3, 3, 5, 7, 5, 4, 7, 7, 4, 6, 4, 0, 6, 6, 0, 2, 1, 0, 5, 5, 0, 4, 3, 7, 2, 2, 7, 6 }; int objError; // wczytanie obiektu z pliku .obj i przygotowanie go if ( (objError = obj.readFromFile(objFileName)) ) return objError; obj.writeProps(); // przeskalowanie wczytanego obj, tak aby był wpisany w jednostkowy sześcian // o środku w początku układu współrzędnych obj.scale(); // sprawdzenie czy zostały poprawnie zdefiniowane normalne if (!obj.nNormals) // wygenerowanie uśrednionych normalnych obj.genSmoothNormals(); // wygenerowanie normalnych dla ścianek //obj.genFacesNormals(); else if (!obj.normIndGood) // gdy indeksy normalnych nie zgadzają się z indeksami wierzhołków obj.rebuildAttribTable('n'); cout << "===================================================" << endl; // wypisanie właściwości wczytanego obiektu obj.writeProps(); // obj.writeTables(); // pobranie danych ze sterownika cout << "===================================================" << endl; cout << "Producent: " << glGetString(GL_VENDOR) << endl; cout << "Karta graficzna: " << glGetString(GL_RENDERER) << endl; cout << "Wersja OpenGL: " << glGetString(GL_VERSION) << endl; cout << "Wersja GLSL: " << glGetString(GL_SHADING_LANGUAGE_VERSION) << endl; cout << "===================================================" << endl; // ustawienie koloru tłatranslation.cpp glClearColor(1.0f, 1.0f, 1.0f, 1.0f); // wczytanie shaderów i przygotowanie obsługi programu AttachVertexShader(simplyShader, "simply_light_vs.glsl"); AttachFragmentShader(simplyShader, "simply_light_fs.glsl"); // wykonanie powiązania pomiędzy zmienną a indeksem ogólnych atrybutów wierzchołka LinkProgram(simplyShader); // wczytanie shaderów i przygotowanie obsługi programu AttachVertexShader(ambientShader, "ambient_light_vs.glsl"); AttachFragmentShader(ambientShader, "ambient_light_fs.glsl"); // wykonanie powiązania pomiędzy zmienną a indeksem ogólnych atrybutów wierzchołka LinkProgram(ambientShader); // wygenerowanie i włączenie tablicy wierzchołków sześcianu glGenVertexArrays(1, &cubeVertexArray1); createVertexArray(cubeVertexArray1, cubeVertices, sizeof(cubeVertices), cubeNormals, sizeof(cubeNormals), cubeIndices, sizeof(cubeIndices)); glGenVertexArrays(1, &cubeVertexArray2); createVertexArray(cubeVertexArray2, cubeVertices, sizeof(cubeVertices), cubeNormals, sizeof(cubeNormals), cubeIndices, sizeof(cubeIndices)); glGenVertexArrays(1, &cubeVertexArray3); createVertexArray(cubeVertexArray3, cubeVertices, sizeof(cubeVertices), cubeNormals, sizeof(cubeNormals), cubeIndices, sizeof(cubeIndices)); glGenVertexArrays(1, &cubeVertexArray4); createVertexArray(cubeVertexArray4, cubeVertices, sizeof(cubeVertices), cubeNormals, sizeof(cubeNormals), cubeIndices, sizeof(cubeIndices)); // wygenerowanie i włączenie tablicy wierzchołków .obj glGenVertexArrays(1, &objVertexArray); createVertexArray(objVertexArray, (GLfloat*)obj.vertices, 3*obj.nAttribs*sizeof(GLfloat), (GLfloat*)obj.normals, 3*obj.nAttribs*sizeof(GLfloat), (GLuint*)obj.faces, 3*obj.nFaces*sizeof(GLuint)); // włączenie wykorzystania bufora głębokości glEnable(GL_DEPTH_TEST); // // ustawienie sposobu rysowania odpowiednich stron ścian glPolygonMode(GL_FRONT, GL_FILL); glPolygonMode(GL_BACK, GL_LINE); // // właczenie pominięcia renderowania niewidocznych ścian glEnable(GL_CULL_FACE); return 0; }