OpenGL 简单动画的创建

绘制一个左右移动的三角形

代码

#include <iostream>
#include <fstream>
#include <sstream>  

#include "glew.h"
#include "glfw3.h"

GLuint num[1] = {0};
GLint offsetLoc;
char info_log[512] = {0};
std::string readFile(const std::string & filename)
{
    std::ifstream ifs(filename);
    if(!ifs.is_open())
    {
        std::cout<<"open file false"<<std::endl;
    }

    std::ostringstream tmp;
    tmp << ifs.rdbuf();
    return tmp.str();
}

int main(void)
{
    float x = 0.0f;
    float inc = 0.01f;
    int major, minor, rev;
    glfwGetVersion(&major, &minor, &rev);
    std::cout << "glfw version " << major << minor << rev << std::endl;
    if (glfwInit() == GLFW_FALSE)
    {
        std::cout << "GLFW initialization failed" << std::endl;
        return 0;
    }

    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 5);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    GLFWwindow *windows = glfwCreateWindow(800, 800, "hihi", NULL, NULL);
    if (windows == NULL)
    {
        std::cout << "create window false" << std::endl;
        return 0;
    }

    glfwMakeContextCurrent(windows);
    if (glewInit() != GLEW_OK)
    {
        std::cout << "glew init false" << std::endl;
    }

    GLint v_shader = glCreateShader(GL_VERTEX_SHADER);
    GLint f_shader = glCreateShader(GL_FRAGMENT_SHADER);

    std::string v_date = readFile("../resource/vertShader.glsl");
    std::string f_date = readFile("../resource/fragShader.glsl");
    const char * vshader = v_date.c_str();
    const char * fshader = f_date.c_str();

    
    glShaderSource(v_shader,1,&vshader,NULL);
    glShaderSource(f_shader,1,&fshader,NULL);

    glCompileShader(v_shader);
    glCompileShader(f_shader);

    GLint program = glCreateProgram();

    glAttachShader(program, v_shader);
    glAttachShader(program, f_shader);

    glLinkProgram(program);

    glGenVertexArrays(1, num); 

    glBindVertexArray(num[0]);

    while (!glfwWindowShouldClose(windows))
    {

        if (glfwGetKey(windows, GLFW_KEY_Z) == GLFW_PRESS)
        {
            std::cout << "request to close" << std::endl;
            glfwSetWindowShouldClose(windows, true);
        }
        glClear(GL_DEPTH_BUFFER_BIT);
        glClearColor(0.0,1.0,0.0,0.5);
        glClear(GL_COLOR_BUFFER_BIT);
        glUseProgram(program);
        x += inc;
        if (x > 1.0f) inc =-0.01f;
        if (x < -1.0f) inc =0.01f;
        offsetLoc = glGetUniformLocation(program,"offset");
        glProgramUniform1f(program,offsetLoc,x);
        glDrawArrays(GL_TRIANGLES, 0, 3);

        glfwSwapBuffers(windows);
        glfwPollEvents();
    }

    // 销毁窗体
    glfwTerminate();

    return 0;
}

运行截图:

在这里插入图片描述
运行后可发现三角形在左右移动。
俩glsl文件分别为

片段着色器

#version 450
out vec4 color;
void main(void)
{
	color = vec4(1.0, 0.0, 1.0, 1.0);
}

顶点着色器

#version 450

uniform float offset;

void main(void)
{ if (gl_VertexID == 0) gl_Position = vec4( 0.25+offset,-0.25, 0.0, 1.0);
  else if (gl_VertexID == 1) gl_Position = vec4(-0.25+offset,-0.25, 0.0, 1.0);
  else gl_Position = vec4( 0.25+offset, 0.25, 0.0, 1.0);
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值