#include<iostream>
#include<cstdlib>
#include<ctime>
#include<string>
#include<GL/glew.h>
#include <GL/glut.h>
#include<GLFW/glfw3.h>
#include<vector>
#include<fstream>
#define MAX 1000
using namespace std;
#define numVAOs 1
GLuint renderingProgram;
GLuint vao[numVAOs];
float x = 0.0f;//三角形在x轴的位置
float inc = 0.01f;//移动三角形的偏移量
//1、检测OpenGL和GLSL错误
//GLSL编译失败时,显示OpenGL日志内容
void printShaderLog(GLuint shader)
{
int len = 0;
int chWrittn = 0;
char* log;
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &len);//检测着色器编译是否成功(指定查询的着色器对象,指定着色器对象的参数,返回的结果存在此参数中)
if (len > 0)
{
log = (char*)malloc(len);
glGetShaderInfoLog(shader, len, &chWrittn, log);
cout << "Shader Info Log: " << log << endl;
free(log);
}
}
//GLSL链接失败时,显示OpenGL日志内容
void printProgramLog(int prog)
{
int len = 0;
int chWrittn = 0;
char* log;
glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &len);
if (len > 0)
{
log = (char*)malloc(len);
glGetProgramInfoLog(prog, len, &chWrittn, log);
cout << "Program Info Log: " << log << endl;
free(log);
}
}
//检查OpenGL错误
bool checkOpenGLError()
{
bool foundError = false;
int glErr = glGetError();
while (glErr != GL_NO_ERROR)
{
cout << "glError: " << glErr << endl;
foundError = true;
glErr = glGetError();
}
return foundError;
}
//读文件
string readShaderSource(const char* filePath)
{
string content;
ifstream filestream(filePath, ios::in);
string line = "";
while (!filestream.eof())
{
getline(filestream, line);
content.append(line + "\n");
}
filestream.close();
return content;
}
GLuint createShaderProgram()
{
GLint vertCompiled;
GLint fragCompiled;
GLint linked;
string vertShaderStr = readShaderSource("verShader.glsl");
string fragShaderStr = readShaderSource("fragShader.glsl");
const char* vertShaderSrc = vertShaderStr.c_str();
const char* fragShaderSrc = fragShaderStr.c_str();
GLint vShader = glCreateShader(GL_VERTEX_SHADER);
GLint fShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(vShader, 1, &vertShaderSrc, NULL);
glShaderSource(fShader, 1, &fragShaderSrc, NULL);
//捕获编译着色器时的错误
glCompileShader(vShader);
checkOpenGLError();
glGetShaderiv(vShader, GL_COMPILE_STATUS, &vertCompiled);
if (vertCompiled != 1)
{
cout << "vertex compilation failed" << endl;
printShaderLog(vShader);
}
glCompileShader(fShader);
checkOpenGLError();
glGetShaderiv(fShader, GL_COMPILE_STATUS, &fragCompiled);
if (fragCompiled != 1)
{
cout << "fragment compilation failed" << endl;
printShaderLog(fShader);
}
GLuint vfProgram = glCreateProgram();
glAttachShader(vfProgram, vShader);
glAttachShader(vfProgram, fShader);
glLinkProgram(vfProgram);
checkOpenGLError();
glGetProgramiv(vfProgram, GL_LINK_STATUS, &linked);
if (linked != 1)
{
cout << "linking failed!" << endl;
printProgramLog(vfProgram);
}
return vfProgram;
}
void init(GLFWwindow* window)
{
renderingProgram = createShaderProgram();
glGenVertexArrays(numVAOs, vao);
glBindVertexArray(vao[0]);
}
void display(GLFWwindow* window, double currenttime)
{
glClear(GL_DEPTH_BUFFER_BIT);
glClearColor(0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(renderingProgram);
x += inc;
if (x > 1.0f) inc = -0.01f;
if (x < -1.0f) inc = 0.01f;
GLuint offsetLoc = glGetUniformLocation(renderingProgram, "offset");//获取offset指针
glProgramUniform1f(renderingProgram, offsetLoc, x);//x的值传给“offset”
glDrawArrays(GL_TRIANGLES, 0, 3);
}
int main(void)
{
if (!glfwInit())
{
exit(EXIT_FAILURE);
}
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
GLFWwindow* window = glfwCreateWindow(1000, 400, "my work", NULL, NULL);
glfwMakeContextCurrent(window);
if (glewInit() != GLEW_OK) { exit(EXIT_FAILURE); }
glfwSwapInterval(1);
init(window);
while (!glfwWindowShouldClose(window))
{
display(window, glfwGetTime());
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwDestroyWindow(window);
glfwTerminate();
exit(EXIT_SUCCESS);
}
【OpenGL】三角形动画(有错误 glerror:1280)
最新推荐文章于 2024-03-29 21:19:07 发布