Kod ze slajdów

Zajęcia 1 z OpenGL
  • Konfiguracja potoku przetwarzania wierzchołków
    • Podstawienie macierzy jednostkowej do macierzy modelu
               glm::mat4 M=glm::mat4(1.0f);
              
    • Wyliczenie macierzy widoku
               glm::mat4 V=glm::lookAt(
                glm::vec3(0.0f,0.0f,-5.0f),
                glm::vec3(0.0f,0.0f,0.0f),
                glm::vec3(0.0f,1.0f,0.0f));
              
    • Wyliczenie macierzy rzutowania perspektywicznego
               glm::mat4 P=glm::perspective(50.0f*PI/180.0f, 1.0f, 1.0f, 50.0f);
              
    • Załadowanie macierzy rzutowania, widoku i modelu i aktywacja programu cieniującego
               spConstant->use();//Aktywacja programu cieniującego
               glUniformMatrix4fv(spConstant->u("P"),1,false,glm::value_ptr(P));
               glUniformMatrix4fv(spConstant->u("V"),1,false,glm::value_ptr(V));
               glUniformMatrix4fv(spConstant->u("M"),1,false,glm::value_ptr(M));
              
  • Animacja
    • Deklaracje
               //Deklaracje globalne
               float speed=PI; //[radiany/s]
              
    • Procedura drawScene (wybierz tylko odpowiednie fragmenty)
               void drawScene(GLFWwindow* window,float angle) {
                //……
                mat4 M=mat4(1.0f);
                M=rotate(M,angle,vec3(0.0f,1.0f,0.0f));
                //……
                Models::torus.drawWire();
               }
              
    • Modyfikacja głównej pętli w funkcji main
               float angle=0;
               glfwSetTime(0);
               while (!glfwWindowShouldClose(window)) {
                angle+=speed*glfwGetTime();
                glfwSetTime(0);
                drawScene(window,angle);
                glfwPollEvents();
               }
              
  • Uruchomienie innego programu cieniującego i przypisanie macierzy oraz koloru
            spLambert->use();//Aktywacja programu cieniującego
            glUniform4f(spLambert->u("color"),0,1,0,1);
            glUniformMatrix4fv(spLambert->u("P"),1,false,glm::value_ptr(P));
            glUniformMatrix4fv(spLambert->u("V"),1,false,glm::value_ptr(V));
            glUniformMatrix4fv(spLambert->u("M"),1,false,glm::value_ptr(M));
           
Zajęcia 2 z OpenGL
  • Obsługa klawiszy
       void key_callback(GLFWwindow* window, int key, 
        int scancode, int action, int mods){	
        if (action == GLFW_PRESS) {
         if (key == GLFW_KEY_A) printf("A \n");	
         if (key == GLFW_KEY_D) printf("D \n");	
         if (key == GLFW_KEY_W && (mods & GLFW_MOD_ALT)!=0) printf("ALT+W\n");
        }
    
        if (action == GLFW_RELEASE) {
         if (key == GLFW_KEY_W) printf("puszczone W\n");
        }
       }
      
  • Rejestracja procedury key_callback
    glfwSetKeyCallback(window, key_callback);
    
Zajęcia 3 z OpenGL
  • glDrawArrays przykład 1
       //Opis modelu
       //Tablica współrzędnych wierzchołków
       float verts[]={ 
          0, 1,0,1,
         -1,-1,0,1,
          1,-1,0,1
       };
       int vertexCount=3; //Liczba wierzchołków w tablicy
    
       //Kod rysujący
       spConstant->use();
       glUniformMatrix4fv(spConstant->u("P"),1,false,glm::value_ptr(P));
       glUniformMatrix4fv(spConstant->u("V"),1,false,glm::value_ptr(V));
       glUniformMatrix4fv(spConstant->u("M"),1,false,glm::value_ptr(M));
       glUniform4f(spConstant->u("color"),1,0,0,1);
    
       glEnableVertexAttribArray(spConstant->a("vertex"));
       glVertexAttribPointer(spConstant->a("vertex"),4,GL_FLOAT,false,0,verts);
    
       glDrawArrays( GL_TRIANGLES, 0, vertexCount );
    
       glDisableVertexAttribArray(spConstant->a("vertex"));
      
  • glDrawArrays przykład 2
    //Opis modelu
    //Tablica współrzędnych wierzchołków
    float verts[]={
      0,4.08,0,1,     0,0,2.88,1,
      0,4.08,0,1,     2.5,0,-1.44,1,
      0,4.08,0,1,    -2.5,0,-1.44,1,
      0,0,2.88,1,    -2.5,0,-1.44,1,
      0,0,2.88,1,     2.5,0,-1.44,1,
      -2.5,0,-1.44,1, 2.5,0,-1.44,1
    };
    int vertexCount=12;
    
    ///Kod rysujący
    spConstant->use();
    glUniformMatrix4fv(spConstant->u("P"),1,false,glm::value_ptr(P));
    glUniformMatrix4fv(spConstant->u("V"),1,false,glm::value_ptr(V));
    glUniformMatrix4fv(spConstant->u("M"),1,false,glm::value_ptr(M));
    glUniform4f(spConstant->u("color"),0,1,0,1);
    
    glEnableVertexAttribArray(spConstant->a("vertex"));
    glVertexAttribPointer(spConstant->a("vertex"),4,GL_FLOAT,false,0,verts);
    
    glDrawArrays( GL_LINES, 0, vertexCount );
    
    glDisableVertexAttribArray(spConstant->a("vertex"));
    
      
  • glDrawArrays przykład 3
    //Opis modelu
    //Tablica współrzędnych wierzchołków
    float verts[]={
      0,4.08,0,1,     0,0,2.88,1,    -2.5,0,-1.44,1,
      0,4.08,0,1,     0,0,2.88,1,     2.5,0,-1.44,1,
      0,4.08,0,1,     2.5,0,-1.44,1, -2.5,0,-1.44,1,
      2.5,0,-1.44,1, -2.5,0,-1.44,1,  0,0,2.88,1};
    //Tablica kolorów wierzchołków
    float colors[]={
      1,0,0,1,  1,0,0,1,  1,0,0,1,
      0,1,0,1,  0,1,0,1,  0,1,0,1,
      0,0,1,1,  0,0,1,1,  0,0,1,1,
      1,1,0,1,  1,1,0,1,  1,1,0,1};
    int vertexCount=12;
    
    //Kod rysujący
    spColored->use();
    glUniformMatrix4fv(spColored->u("P"),1,false,glm::value_ptr(P));
    glUniformMatrix4fv(spColored->u("V"),1,false,glm::value_ptr(V));
    glUniformMatrix4fv(spColored->u("M"),1,false,glm::value_ptr(M));
    
    glEnableVertexAttribArray(spColored->a("vertex"));
    glVertexAttribPointer(spColored->a("vertex"),4,GL_FLOAT,false,0,verts);
    
    glEnableVertexAttribArray(spColored->a("color"));
    glVertexAttribPointer(spColored->a("color"),4,GL_FLOAT,false,0,colors);
    
    glDrawArrays( GL_TRIANGLES, 0, vertexCount );
    
    glDisableVertexAttribArray(spColored->a("vertex"));
    glDisableVertexAttribArray(spColored->a("color"));
      
  • glDrawElements przykład
    //Opis modelu
    //Tablica współrzędnych wierzchołków
    float verts[]={
      0,4.08,0,1,     0,0,2.88,1,   -2.5,0,-1.44,1,    2.5,0,-1.44,1};
    //Tablica kolorów wierzchołków
    float colors[]={
      1,0,0,1,  0,1,0,1,  0,0,1,1,  1,1,0,1};
    //Tablica indeksów
    unsigned int indexes[] ={
      0,1,2,  0,1,3,  0,2,3,  3,2,1};
    int indexCount=12;
    int vertexCount=4;
    
    
    //Kod rysujący
    spColored->use();
    glUniformMatrix4fv(spColored->u("P"),1,false,glm::value_ptr(P));
    glUniformMatrix4fv(spColored->u("V"),1,false,glm::value_ptr(V));
    glUniformMatrix4fv(spColored->u("M"),1,false,glm::value_ptr(M));
    
    glEnableVertexAttribArray(spColored->a("vertex"));
    glVertexAttribPointer(spColored->a("vertex"),4,GL_FLOAT,false,0,verts);
    
    glEnableVertexAttribArray(spColored->a("color"));
    glVertexAttribPointer(spColored->a("color"),4,GL_FLOAT,false,0,colors);
    
    glDrawElements(GL_TRIANGLES,indexCount, GL_UNSIGNED_INT,indexes);
    
    glDisableVertexAttribArray(spColored->a("vertex"));
    glDisableVertexAttribArray(spColored->a("color"));
      
  • Wczytywanie tekstury
    GLuint tex; //Uchwyt – deklaracja globalna
    
    //Funkcja wczytująca teksturę 
    GLuint readTexture(char* filename) {	
      GLuint tex;	
      glActiveTexture(GL_TEXTURE0); 	
    
      //Wczytanie do pamięci komputera
      std::vector<unsigned char> image;   //Alokuj wektor do wczytania obrazka
      unsigned width, height;   //Zmienne do których wczytamy wymiary obrazka
      //Wczytaj obrazek
      unsigned error = lodepng::decode(image, width, height, filename);
     
      //Import do pamięci karty graficznej
      glGenTextures(1,&tex); //Zainicjuj jeden uchwyt
      glBindTexture(GL_TEXTURE_2D, tex); //Uaktywnij uchwyt
      //Wczytaj obrazek do pamięci KG skojarzonej z uchwytem
      glTexImage2D(GL_TEXTURE_2D, 0, 4, width, height, 0,
        GL_RGBA, GL_UNSIGNED_BYTE, (unsigned char*) image.data());	
    
      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);	
    
      return tex;
    } 
    
    //Wczytanie i import obrazka – w initOpenGLProgram
    tex=readTexture("bricks.png");
    
    //Usunięcie tekstury z pamięci karty graficznej – w freeOpenGLProgram
    glDeleteTextures(1,&tex);
      
  • Rysowanie oteksturowanego modelu
    //Opis modelu
    //Tablica współrzędnych wierzchołków
    float verts[]={
      1.0f,-1.0f,0.0f,1.0f, //A
     -1.0f, 1.0f,0.0f,1.0f, //B
     -1.0f,-1.0f,0.0f,1.0f, //C
    
      1.0f,-1.0f,0.0f,1.0f, //A
      1.0f, 1.0f,0.0f,1.0f, //D
     -1.0f, 1.0f,0.0f,1.0f, //B
    };
    
    //Tablica współrzędnych teksturowania
    float texCoords[]={
      1.0f, 0.0f,	//A
      0.0f, 1.0f,    //B
      0.0f, 0.0f,    //C
    
      1.0f, 0.0f,    //A
      1.0f, 1.0f,    //D
      0.0f, 1.0f,    //B
    };
    
    //Liczba wierzchołków w tablicy
    int vertexCount=6;
    
    //Kod rysujący
    spTextured->use();
    glUniformMatrix4fv(spTextured->u("P"),1,false,glm::value_ptr(P));
    glUniformMatrix4fv(spTextured->u("V"),1,false,glm::value_ptr(V));
    glUniformMatrix4fv(spTextured->u("M"),1,false,glm::value_ptr(M));
    
    glEnableVertexAttribArray(spTextured->a("vertex"));
    glVertexAttribPointer(spTextured->a("vertex"),4,GL_FLOAT,false,0,verts);
    
    glEnableVertexAttribArray(spTextured->a("texCoord"));
    glVertexAttribPointer(spTextured->a("texCoord"),2,GL_FLOAT,false,0,texCoords);
    
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D,tex);
    glUniform1i(spLambertTextured->u("tex"),0);
    
    glDrawArrays( GL_TRIANGLES, 0, vertexCount );
    
    glDisableVertexAttribArray(spTextured->a("vertex"));
    glDisableVertexAttribArray(spTextured->a("texCoord"));
      
  • Rysowanie oteksturowanego i ocieniowanego modelu
    //Opis modelu
    //Tablica współrzędnych wierzchołków
    float verts[]={
      1.0f,-1.0f,0.0f,1.0f, //A
     -1.0f, 1.0f,0.0f,1.0f, //B
     -1.0f,-1.0f,0.0f,1.0f, //C
    
      1.0f,-1.0f,0.0f,1.0f, //A
      1.0f, 1.0f,0.0f,1.0f, //D
     -1.0f, 1.0f,0.0f,1.0f}; //B
    //Tablica współrzędnych teksturowania
    float texCoords[]={
      1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, //ABC
      1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, //ADB
    };
    //Tablica wektorów normalnych
    float normals[]={
      0.0f,0.0f,1.0f,0.0f, //A
      0.0f,0.0f,1.0f,0.0f, //B
      0.0f,0.0f,1.0f,0.0f, //C
    
      0.0f,0.0f,1.0f,0.0f, //A
      0.0f,0.0f,1.0f,0.0f, //D
      0.0f,0.0f,1.0f,0.0f, //B
    };
    
    //Liczba wierzchołków w tablicy
    int vertexCount=6;
    
    //Kod rysujący
    glEnableVertexAttribArray(spLambertTextured->a("vertex"));
    glVertexAttribPointer(spLambertTextured->a("vertex"),4,GL_FLOAT,false,0,verts);
    
    glEnableVertexAttribArray(spLambertTextured->a("normal"));
    glVertexAttribPointer(spLambertTextured->a("normal"),4,GL_FLOAT,false,0,normals);
    
    glEnableVertexAttribArray(spLambertTextured->a("texCoord"));
    glVertexAttribPointer(spLambertTextured->a("texCoord"),2,GL_FLOAT,false,0,texCoords);
    
    glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D,tex);
    glUniform1i(spLambertTextured->u("tex"),0);
    
    glDrawArrays( GL_TRIANGLES, 0, vertexCount );
    glDisableVertexAttribArray(spLambertTextured->a("vertex"));
    glDisableVertexAttribArray(spLambertTextured->a("normal"));
    glDisableVertexAttribArray(spLambertTextured->a("texCoord"));
    
      
Zajęcia 6 z OpenGL
  • Wczytywanie tekstury
    GLuint tex0; //Uchwyt – deklaracja globalna
    
    //Funkcja wczytująca teksturę 
    GLuint readTexture(const char* filename) {	
      GLuint tex;	
      glActiveTexture(GL_TEXTURE0); 	
    
      //Wczytanie do pamięci komputera
      std::vector<unsigned char> image;   //Alokuj wektor do wczytania obrazka
      unsigned width, height;   //Zmienne do których wczytamy wymiary obrazka
      //Wczytaj obrazek
      unsigned error = lodepng::decode(image, width, height, filename);
     
      //Import do pamięci karty graficznej
      glGenTextures(1,&tex); //Zainicjuj jeden uchwyt
      glBindTexture(GL_TEXTURE_2D, tex); //Uaktywnij uchwyt
      //Wczytaj obrazek do pamięci KG skojarzonej z uchwytem
      glTexImage2D(GL_TEXTURE_2D, 0, 4, width, height, 0,
        GL_RGBA, GL_UNSIGNED_BYTE, (unsigned char*) image.data());	
    
      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);	
    
      return tex;
    } 
    
    //Wczytanie i import obrazka – w initOpenGLProgram
    tex0=readTexture("bricks.png");
    
    //Usunięcie tekstury z pamięci karty graficznej – w freeOpenGLProgram
    glDeleteTextures(1,&tex0);
      
  • Przekazanie danych do atrybutu texCoord0
    
    //In drawScene
    glEnableVertexAttribArray(sp->a("texCoord0"));
    …
    glVertexAttribPointer(sp->a("texCoord0"),
    	2,GL_FLOAT,false,0,texCoords);//an appropriate array
    …
    glDisableVertexAttribArray(sp->a("texCoord0"));
    
  • Konfigurowanie zmiennej reprezentującej jednostkę teksturującą
    glUniform1i(sp->u("textureMap0"),0); //drawScene
    
  • Konfigurowanie jednostki teksturującej
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D,tex0);