LearnOpenGL筆記(2)三角形

這是學習LearnOpenGL CN教程的筆記,包括我遇到的問題和個人爛筆頭。文章名與網站小節對應。git

------------------------------------分割線--------------------------------------------------------------------------------------------github

擺張重要的圖先,藍色的是能夠編寫着色器控制的部分。數組

 

着色器在C++字符串中的形式學習

 

"#version 330 core\n"

"layout (location = 0) in vec3 aPos;\n"

"void main()\n"

"{\n"

"gl_Position=vec4(aPos.x,aPos.y,aPos.z,1.0);\n"

"}\n";

繪製流程網站

//初始化緩衝數組對象
unsigned int VAO;            //頂點數組對象VAO
unsigned int VBO;            //頂點緩衝對象VBO
    //建立VAO
    glGenVertexArrays(1, &VAO);
    //綁定VAO
    glBindVertexArray(VAO);

    //建立VBO
    glGenBuffers(1, &VBO);  //生成vbo和緩衝ID
    //緩衝綁定
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    //將數據傳輸到當前綁定緩衝
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
    //第四個參數:如何管理給定的數據
    //  GL_STATIC_DRAW :數據不會或幾乎不會改變。
    //    GL_DYNAMIC_DRAW:數據會被改變不少。
    //    GL_STREAM_DRAW :數據每次繪製時都會改變。

    //解析頂點數據,設置頂點屬性指針
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
    glEnableVertexAttribArray(0);
//建立着色器程序
//頂點着色器
    unsigned int vertexShader;
    vertexShader = glCreateShader(GL_VERTEX_SHADER);
    //附加
    glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
    //編譯
    glCompileShader(vertexShader);
    //檢測失敗
    int  success;
    char infoLog[512];
    glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
    if (!success)
    {
        glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
        std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
    }
    //片斷着色器
    unsigned int fragmentShader;
    fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
    glCompileShader(fragmentShader);

    //片斷着色器
    unsigned int fragmentShaderY;
    fragmentShaderY = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragmentShaderY, 1, &fragmentShaderYellowSource, NULL);
    glCompileShader(fragmentShaderY);

    shaderProgram = glCreateProgram();
    //附加
    glAttachShader(shaderProgram, vertexShader);
    glAttachShader(shaderProgram, fragmentShader);
    //連接
    glLinkProgram(shaderProgram);
    shaderYellowProram = glCreateProgram();
    //附加
    glAttachShader(shaderYellowProram, vertexShader);
    glAttachShader(shaderYellowProram, fragmentShaderY);
    //連接
    glLinkProgram(shaderYellowProram);
    //連接成功後,釋放着色器對象
    glDeleteShader(vertexShader);
    glDeleteShader(fragmentShader);
    glDeleteShader(fragmentShaderY);
//在循環渲染中繪製
    //渲染循環
    while (!glfwWindowShouldClose(window)) {
        //渲染指令
        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);

        glUseProgram(shaderProgram);
        glBindVertexArray(VAO);
        glDrawArrays(GL_TRIANGLES, 0, 3);



        //交換顏色緩衝,繪製顯示
        glfwSwapBuffers(window);    
    }
相關文章
相關標籤/搜索