zoukankan      html  css  js  c++  java
  • -OPENGL-

    PACKAGES MAY BE USED

     DENOISE:

    https://github.com/OpenImageDenoise/oidn

    LINUX PLATFORM

    cmake_minimum_required(VERSION 2.8)
    project(CP_01)
    
    
    set(GLFW_HOME /home/gearslogy/Plugin_dev/opengl/GLEXT)
    include_directories(${GLFW_HOME}/include/)
    link_directories(${GLFW_HOME}/lib/)
    
    
    find_package(OpenGL REQUIRED)
    include_directories(${OpenGL_INCLUDE_DIRS})
    link_directories(${OpenGL_LIBRARY_DIRS})
    add_definitions(${OpenGL_DEFINITIONS})
    if(NOT OPENGL_FOUND)
        message(ERROR " OPENGL not found!")
    endif(NOT OPENGL_FOUND)
    
    add_executable(CP_01 main.cpp)
    target_link_libraries(CP_01 glfw GLEW)
    View Code
    //
    // Created by gearslogy on 11/1/18.
    //
    
    #include <GL/glew.h>
    #include <GL/gl.h>
    #include <GLFW/glfw3.h>
    
    
    enum VAO_IDs {Triangles ,NumVAOs};
    enum Buffer_IDs{ArrayBuffer,NumBuffers};
    enum Attrib_IDS{vPosition=0};
    
    GLuint VAOs[NumVAOs];
    GLuint Buffers[NumBuffers];
    
    
    const GLuint NumVertices = 6;
    
    void init(void){
    
        static const GLfloat vertices[NumVertices][2] = {
                {-0.90f, -0.90f},
                {0.85f,  -0.90f},
                {-0.90f, 0.85f},
    
                {0.90f,  -0.85f},
                {0.90f,   0.90f},
                {-0.85f, 0.90f},
        };
    
        glCreateBuffers(NumBuffers,Buffers);
        glNamedBufferStorage(Buffers[ArrayBuffer],sizeof(vertices),vertices,0);
    
        glGenVertexArrays(NumVAOs,VAOs);
        glBindVertexArray(VAOs[Triangles]);
        glBindBuffer(GL_ARRAY_BUFFER,Buffers[ArrayBuffer]);
        glVertexAttribPointer(vPosition,2,GL_FLOAT,GL_FALSE,0,0);
        glEnableVertexAttribArray(vPosition);
    
    }
    
    void display(void){
        static const float black[] = {0.0f,0.0f,0.0f,0.0f};
        glClearBufferfv(GL_COLOR,0,black);
        glBindVertexArray(VAOs[Triangles]);
        glDrawArrays(GL_TRIANGLES,0 ,NumVertices);
    }
    
    
    
    int main(){
        glfwInit();
    
        GLFWwindow *window =glfwCreateWindow(1280,720,"Triangles",NULL,NULL);
        glfwMakeContextCurrent(window);
        glewInit();
        init();
    
    
        while(!glfwWindowShouldClose(window)){
            display();
            glfwSwapBuffers(window);
            glfwPollEvents();
        }
    
        glfwDestroyWindow(window);
        glfwTerminate();
    }
    View Code

    WINDOWS PLATFORM,VC2019, 全部静态链接

    Windows CMakelists:

    cmake_minimum_required(VERSION 3.5)
    
    project(Triangle)
    
    set(CMAKE_CXX_STANDARD 11)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    # OPENGL
    find_package(OpenGL REQUIRED)
    include_directories(${OpenGL_INCLUDE_DIRS})
    link_directories(${OpenGL_LIBRARY_DIRS})
    add_definitions(${OpenGL_DEFINITIONS})
    
    if(NOT OPENGL_FOUND)
        message(ERROR " OPENGL not found!")
    endif(NOT OPENGL_FOUND)
    
    # GLEW
    set(GLEW_HOME D:/plugin_dev/libs/glew-2.1.0)
    include_directories(${GLEW_HOME}/include)
    link_directories(${GLEW_HOME}/lib/Release/x64)
    
    # GLFW
    set(GLFW_HOME D:/plugin_dev/libs/glfw-3.3.1.bin.WIN64)
    include_directories(${GLFW_HOME}/include/)
    link_directories(${GLFW_HOME}/lib-vc2019)
    
    add_executable(Triangle main.cpp)
    target_link_libraries(Triangle glew32s glfw3 opengl32)

    在win32平台一定要显式的写出opengl32链接库。原因来自:这里

     统统设置STATIC

    #define GLEW_STATIC
    // GLEW
    
    #include <GL/glew.h>
    #include <cstdlib>
    #undef GLFW_DLL
    // GLFW
    #include <GLFW/glfw3.h>

    2,simple vertex shader & fragment shader

    trangles.vert:

    #version 450 core
    
    layout (location =0) in vec4 vPosition;
    void main()
    {
         gl_Position = vec4(vPosition.x, vPosition.y, vPosition.z, 1.0);
    }

    trangles.frag:

    #version 450 core
    layout (location =0) out vec4 FragColor;
    void main(){
    
        FragColor = vec4(1,0,0,1.0);
    }

    loadshader.h

    //
    // Created by gearslogy on 11/2/18.
    //
    
    #ifndef CP_01_LOADSHADER_H
    #define CP_01_LOADSHADER_H
    
    #include <string>
    #include <iostream>
    #include <fstream>
    #include <GL/glew.h>
    #include <GLFW/glfw3.h>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    class FileIO
    {
    public:
        static string load(const char *path){
            ifstream in;
            in.open(path,ios::in);
            if(!in.is_open())
                cout << "read " << path << " error
    ";
    
            string temp;
    
            string line;
            while(getline(in,line)){
                temp += line;
                temp += "
    ";
            }
    
            in.close();
            return temp;
        }
    };
    
    
    void ApplyShaders(GLuint &shaderProgram,
                        const vector<string> &codes,
                        const vector<GLenum> shaderTypes )
    {
        if(codes.size()!=shaderTypes.size())
        {
            cout << "shader src size not match type size
    ";
            return ;
        }
    
        // FOR LOG
        int success;
        char infoLog[512];
    
    
        vector <GLuint> shaders;
        for(int i=0;i<codes.size();i++){
            GLuint shader = glCreateShader(shaderTypes[i]);
            cout << "Shader ID :" << shader <<endl;
            const char *code = codes[i].c_str();
            glShaderSource(shader, 1, &code, NULL);
            glCompileShader(shader);
            // check compile error
            glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
            if (!success)
            {
                glGetShaderInfoLog(shader, 512, NULL, infoLog);
                std::cout << "ERROR::COMPILATION_FAILED
    " << infoLog << std::endl;
            }
            glAttachShader(shaderProgram, shader);
            // append shader to vector to delete later
        }
    
    
        glLinkProgram(shaderProgram);
        // check for linking errors
        glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
        if (!success) {
            glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
            std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED
    " << infoLog << std::endl;
        }
    
        //glDeleteShader(vertexShader);
        //glDeleteShader(fragmentShader);
    
        glUseProgram(shaderProgram);
        for(int i=0;i<shaders.size();i++)
            glDeleteShader(shaders[i]);
    
    }
    
    
    
    
    #endif //CP_01_LOADSHADER_H
    View Code

    main.cpp:

    #include <GL/glew.h>
    #include <GL/gl.h>
    
    #include <GLFW/glfw3.h>
    #include <iostream>
    #include "loadshader.h"
    #define  BUFFER_OFFSET(offset) ((void *)(offset))
    
    
    using namespace std;
    enum VAO_IDs {Triangles ,NumVAOs};         // NumVAOs 1
    enum Buffer_IDs{ArrayBuffer,NumBuffers};
    enum Attrib_IDS{vPosition=0};
    
    GLuint VAOs[NumVAOs];
    GLuint Buffers[NumBuffers];
    
    
    const GLuint NumVertices = 6;
    
    
    
    
    
    void init(void){
    
        static const GLfloat vertices[NumVertices][2] = {
                {-0.90f, -0.90f},
                {0.85f,  -0.90f},
                {-0.90f, 0.85f},
    
                {0.90f,  -0.85f},
                {0.90f,   0.90f},
                {-0.85f, 0.90f},
        };
        glCreateVertexArrays(NumVAOs,VAOs);//glGenVertexArrays(NumVAOs,VAOs);
        cout << "CreateVertexArrays VAOs[0]: "<<VAOs[0] << endl;
    
        glCreateBuffers(NumBuffers,Buffers);
        cout << "CreateVertexArrays Buffers[0]: "<<Buffers[0] << endl;
    
        glNamedBufferStorage(Buffers[ArrayBuffer],sizeof(vertices),vertices,0);
    
    
    
        
        const char *vertexShaderSource = FileIO::load("../triangles.vert").c_str();
        const char *fragmentShaderSource = FileIO::load("../triangles.frag").c_str();
    
    
        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
    " << infoLog << std::endl;
        }
    
    
        unsigned int fragmentShader;
        fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
        glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
        glCompileShader(fragmentShader);
        glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
        if (!success)
        {
            glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);
            std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED
    " << infoLog << std::endl;
        }
    
    
        unsigned int shaderProgram;
        shaderProgram = glCreateProgram();
        glAttachShader(shaderProgram, vertexShader);
        glAttachShader(shaderProgram, fragmentShader);
        glLinkProgram(shaderProgram);
    
        // check for linking errors
        glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
        if (!success) {
            glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
            std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED
    " << infoLog << std::endl;
        }
    
    
        glUseProgram(shaderProgram);
        glDeleteShader(vertexShader);
        glDeleteShader(fragmentShader);
    
    
    
    
        glBindVertexArray(VAOs[Triangles]);
        glBindBuffer(GL_ARRAY_BUFFER,Buffers[ArrayBuffer]);
        glVertexAttribPointer(0,2,GL_FLOAT,GL_FALSE,2 * sizeof(float),BUFFER_OFFSET(0));
        glEnableVertexAttribArray(0);
    
    
    
    }
    
    void display(void){
        static const float black[] = {0.0f,0.5f,0.0f,0.0f};
        glClearBufferfv(GL_COLOR,0,black);
        glBindVertexArray(VAOs[Triangles]);
        glDrawArrays(GL_TRIANGLES,0 ,NumVertices);
    
    }
    
    
    
    int main(){
        glfwInit();
    
        GLFWwindow *window =glfwCreateWindow(640,480,"Triangles",NULL,NULL);
        glfwMakeContextCurrent(window);
        glewInit();
        init();
    
    
        while(!glfwWindowShouldClose(window)){
            display();
            glfwSwapBuffers(window);
            glfwPollEvents();
        }
    
        glfwDestroyWindow(window);
        glfwTerminate();
    }
    View Code

    replace main.cpp shader's methods then use the loadshader.h ApplyShaders:

    main.cpp:

    //
    // Created by gearslogy on 11/1/18.
    //
    
    #include <GL/glew.h>
    #include <GL/gl.h>
    
    #include <GLFW/glfw3.h>
    #include <iostream>
    #include "loadshader.h"
    #define  BUFFER_OFFSET(offset) ((void *)(offset))
    
    
    using namespace std;
    enum VAO_IDs {Triangles ,NumVAOs};         // NumVAOs 1
    enum Buffer_IDs{ArrayBuffer,NumBuffers};
    enum Attrib_IDS{vPosition=0};
    
    GLuint VAOs[NumVAOs];
    GLuint Buffers[NumBuffers];
    
    
    const GLuint NumVertices = 6;
    
    
    
    
    
    void init(void){
    
        static const GLfloat vertices[NumVertices][2] = {
                {-0.90f, -0.90f},
                {0.85f,  -0.90f},
                {-0.90f, 0.85f},
    
                {0.90f,  -0.85f},
                {0.90f,   0.90f},
                {-0.85f, 0.90f},
        };
        glCreateVertexArrays(NumVAOs,VAOs);//glGenVertexArrays(NumVAOs,VAOs);
        cout << "CreateVertexArrays VAOs[0]: "<<VAOs[0] << endl;
    
        glCreateBuffers(NumBuffers,Buffers);
        cout << "CreateVertexArrays Buffers[0]: "<<Buffers[0] << endl;
    
        glNamedBufferStorage(Buffers[ArrayBuffer],sizeof(vertices),vertices,0);
    
    
    
    
        vector <string> codes;
        vector <GLenum> shaderTypes;
        codes.push_back(FileIO::load("../triangles.vert"));
        codes.push_back(FileIO::load("../triangles.frag"));
        shaderTypes.push_back(GL_VERTEX_SHADER);
        shaderTypes.push_back(GL_FRAGMENT_SHADER);
    
        GLuint shaderProgram = glCreateProgram();
        ApplyShaders(shaderProgram,codes,shaderTypes);
    
    
    
        
        glBindVertexArray(VAOs[Triangles]);
        glBindBuffer(GL_ARRAY_BUFFER,Buffers[ArrayBuffer]);
        glVertexAttribPointer(0,2,GL_FLOAT,GL_FALSE,2 * sizeof(float),BUFFER_OFFSET(0));
        glEnableVertexAttribArray(0);
    
    
    
    }
    
    void display(void){
        static const float black[] = {0.0f,0.5f,0.0f,0.0f};
        glClearBufferfv(GL_COLOR,0,black);
        glBindVertexArray(VAOs[Triangles]);
        glDrawArrays(GL_TRIANGLES,0 ,NumVertices);
    
    }
    
    
    
    int main(){
        glfwInit();
    
        GLFWwindow *window =glfwCreateWindow(640,480,"Triangles",NULL,NULL);
        glfwMakeContextCurrent(window);
        glewInit();
        init();
    
    
        while(!glfwWindowShouldClose(window)){
            display();
            glfwSwapBuffers(window);
            glfwPollEvents();
        }
    
        glfwDestroyWindow(window);
        glfwTerminate();
    }
    View Code
  • 相关阅读:
    【转】技术人员,你拿什么来拯救你的生活一个牛人的故事
    正则表达式匹配Html标签
    WebClient读取网络数据
    [转]浮点数的存储格式
    [转].NET.GC 浅谈.net托管程序中的资源释放问题
    [转]c#利用WebClient和WebRequest获取网页源代码的比较
    bzoj1934
    1036: [ZJOI2008]树的统计Count (树链剖分模板)
    1834: [ZJOI2010]network 网络扩容 (最小费用最大流模板)
    1602: [Usaco2008 Oct]牧场行走(倍增模板)
  • 原文地址:https://www.cnblogs.com/gearslogy/p/9889727.html
Copyright © 2011-2022 走看看