zoukankan      html  css  js  c++  java
  • "https://open.gl/"教程之Transforms源码(freeglut版)

    以上一节Textures代码为基础,没变的部分用灰色表示。

    VERTEX_SHADER:

    #version 150 core
    
    in vec2 position;
    in vec3 color;
    in vec2 texcoord;
    
    out vec3 Color;
    out vec2 TexCoord;
    
    uniform mat4 trans;
    uniform mat4 view;
    uniform mat4 project;
    void main(){
        Color=color;
        TexCoord=texcoord;
        //gl_Position=trans*vec4(position,0,1);
        //只设置view,没设置project什么都看不大
        //gl_Position=view*trans*vec4(position,0,1);
        gl_Position=project*view*trans*vec4(position,0,1);
    }

    FRAGEMENT_SHADER:

    #version 150 core
    
    in vec3 Color;
    in vec2 TexCoord;
    
    out vec4 outColor;
    
    uniform sampler2D texKit;
    uniform sampler2D texPupy;
    
    uniform vec3 triangleColor;
    void main(){
        //outColor=texture(texKit,TexCoord)*vec4(Color,1.0);
        vec4 colKit=texture(texKit,TexCoord);
        vec4 colPupy=texture(texPupy,TexCoord);
        outColor=mix(colKit,colPupy,0.2);
    }

    源码:

    #include"glew.h"
    #include<Windows.h>
    #include"freeglut.h"
    #include<glGL.h>
    #include<random>
    #include"LoadShaders.h"
    #include"SOIL.h"
    
    #include"glmglm.hpp"
    #include"glmgtcmatrix_transform.hpp"
    #include"glmgtc	ype_ptr.hpp"
    GLuint vao;
    GLuint vbo;
    GLuint ebo;
    GLuint tbo[2];
    //translate
    GLuint uniTransLoc;
    glm::mat4 trans;        //初始化一个单位矩阵
    
    void Init(){
        GLfloat vertices[] = {
            -0.5, 0.5, 1.0, 0.0, 0.0, 0.0, 0.0,
            0.5, 0.5, 0.0, 1.0, 0.0, 1.0, 0.0,
            0.5, -0.5, 0.0, 0.0, 1.0, 1.0, 1.0,
            -0.5, -0.5, 1.0, 1.0, 1.0, 0.0, 1.0
    
        };
    
        GLuint elements[] = { 0, 1, 2, 2, 3, 0 };
        ShaderInfo shaders[] = {
            { GL_VERTEX_SHADER, "vertexShader.txt" },
            { GL_FRAGMENT_SHADER, "fragementShader.txt" },
            { GL_NONE, NULL }
        };
        GLuint shaderProgram = LoadShaders(shaders);
        //**VAO开始记录
        glGenVertexArrays(1, &vao);
        glBindVertexArray(vao);
        //*VBO,需要数据配接
        glGenBuffers(1, &vbo);
        glBindBuffer(GL_ARRAY_BUFFER, vbo);
        glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
    
        //*数据配接
        glUseProgram(shaderProgram);
    
        GLuint posAttri = glGetAttribLocation(shaderProgram, "position");
        glVertexAttribPointer(posAttri, 2, GL_FLOAT, GL_FALSE, 7 * sizeof(GL_FLOAT), 0);
        glEnableVertexAttribArray(posAttri);
    
        GLuint colorAttri = glGetAttribLocation(shaderProgram, "color");
        glVertexAttribPointer(colorAttri, 3, GL_FLOAT, GL_FALSE, 7 * sizeof(GL_FLOAT), (void*)(2 * sizeof(GL_FLOAT)));
        glEnableVertexAttribArray(colorAttri);
    
        GLuint texAttri = glGetAttribLocation(shaderProgram, "texcoord");
        glVertexAttribPointer(texAttri, 2, GL_FLOAT, GL_FALSE, 7 * sizeof(GL_FLOAT), (void*)(5 * sizeof(GL_FLOAT)));
        glEnableVertexAttribArray(texAttri);
    
        //*EBO
        glGenBuffers(1, &ebo);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
        glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(elements), elements, GL_STATIC_DRAW);
        //*TBO
        glGenTextures(2, tbo);
        int width = 0, height = 0;
        unsigned char* image;
    
        glActiveTexture(GL_TEXTURE0);        //对应samplerD texKit
        glBindTexture(GL_TEXTURE_2D, tbo[0]);
        image = SOIL_load_image("sample.png", &width, &height, 0, SOIL_LOAD_RGB);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
        SOIL_free_image_data(image);
        glUniform1i(glGetUniformLocation(shaderProgram, "texKit"), 0);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    
    
        glActiveTexture(GL_TEXTURE1);        //对应samplerD texPupy
        glBindTexture(GL_TEXTURE_2D, tbo[1]);
        image = SOIL_load_image("sample2.png", &width, &height, 0, SOIL_LOAD_RGB);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
        SOIL_free_image_data(image);
        glUniform1i(glGetUniformLocation(shaderProgram, "texPupy"), 1);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        //**translation
        //trans = glm::rotate(trans, glm::radians(5.f), glm::vec3(0.0f, 0.f, 1.f));
        uniTransLoc = glGetUniformLocation(shaderProgram, "trans");
        glUniformMatrix4fv(uniTransLoc, 1, GL_FALSE, glm::value_ptr(trans));
        //*view 默认eye(0.f,0.f,0.f),center(0.f,0.f,-1.f),up(0.f,1.f,0.f)
        glm::mat4 view=glm::lookAt(glm::vec3(1.2f, 1.2f, 1.2f), glm::vec3(0.f, 0.f, 0.f), glm::vec3(0.f, 0.f, 1.f));
        GLuint uniViewLoc = glGetUniformLocation(shaderProgram, "view");
        glUniformMatrix4fv(uniViewLoc, 1, GL_FALSE, glm::value_ptr(view));
        //*project 3D中一定要设置投影,否则看不到
        glm::mat4 project = glm::perspective(glm::radians(45.f), 1.f, 1.f, 100.f);
        GLuint uniProjectLoc = glGetUniformLocation(shaderProgram, "project");
        glUniformMatrix4fv(uniProjectLoc, 1, GL_FALSE, glm::value_ptr(project));
    
        glClearColor(0, 0, 0, 1);
    }
    void Display(){
        glClear(GL_COLOR_BUFFER_BIT);
        glBindVertexArray(vao);
        //glDrawArrays(GL_TRIANGLES, 0, 3);
        glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
        //glDrawElementsBaseVertex(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0, 1);
        glFlush();
    }
    void KeyboardFunc(unsigned char c, int x, int){
        switch (c)
        {
        case 'x':
        case 'X':
            trans = glm::rotate(trans, glm::radians(5.f), glm::vec3(1.f, 0.f, 0.f));
        case 'y':
        case 'Y':
            trans = glm::rotate(trans, glm::radians(5.f), glm::vec3(0.f, 1.f, 0.f));
        case 'z':
        case 'Z':
            trans = glm::rotate(trans, glm::radians(5.f), glm::vec3(0.f, 0.f, 1.f));
        default:
            break;
        }
        glUniformMatrix4fv(uniTransLoc, 1, GL_FALSE, glm::value_ptr(trans));
        glutPostRedisplay();
    }
    int main(int argc, char** argv){
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_RGBA);
        glutInitWindowSize(512, 512);
        glutInitWindowPosition(100, 200);
        glutInitContextVersion(3, 2);
        glutInitContextProfile(GLUT_CORE_PROFILE);
        glutCreateWindow(argv[0]);
        glewExperimental = true;
        glewInit();
        Init();
        glutDisplayFunc(Display);
        glutKeyboardFunc(KeyboardFunc);
        glutMainLoop();
        return 0;
    }
  • 相关阅读:
    Nginx配置文件详解
    JVM调优—性能分析神器-JProfiler详解
    Navicat Premium 15破解
    Nginx配置反向代理,负载均衡,动静分离,高可用
    Nginx安装和常用命令
    Spring中ApplicationContextAware的作用
    java中发起http和https请求
    MySql高可用架构
    matlab画3维meshgrid/plot3/mesh/surf的用法
    如何规范地编写一个MATLAB函数文件
  • 原文地址:https://www.cnblogs.com/jiafenggang/p/5464911.html
Copyright © 2011-2022 走看看