绘制一个左右移动的三角形
代码
#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);
}