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

代码

#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;
}

运行截图:

OpenGL(二)、简单动画的创建_ios


运行后可发现三角形在左右移动。

俩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);
}