OpenGL——检测OpenGL和GLSL错误

ErrorUtil.h

cpp 复制代码
#pragma once

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>

struct ErrorUtil {

	static void printShaderLog (GLuint shader);

	static void printProgramLog (int prog);

	static bool checkOpenGLError ();
};

namespace UsageExample {

using namespace std;

constexpr int numVAOs = 1;

GLuint renderingProgram;
GLuint vao[numVAOs];


// 检测OpenGL错误的示例如下:
GLuint
createShaderProgram ()
{
	GLint vertCompiled;
	GLint fragCompiled;
	GLint linked;

	const char *vshaderSource = "#version 430    \n"
								"void main(void) \n"
								"{ gl_Position = vec4(0.0, 0.0, 0.0, 1.0); }";

	const char *fshaderSource = "#version 430    \n"
								"out vec4 color; \n"
								"void main(void) \n"
								"{ color = vec4(0.0, 0.0, 1.0, 1.0); }";

	GLuint vShader	 = glCreateShader (GL_VERTEX_SHADER);
	GLuint fShader	 = glCreateShader (GL_FRAGMENT_SHADER);
	GLuint vfprogram = glCreateProgram();

	glShaderSource (vShader, 1, &vshaderSource, NULL);
	glShaderSource (fShader, 1, &fshaderSource, NULL);

	//捕获编译着色器时的错误

	glCompileShader (vShader);
	ErrorUtil::checkOpenGLError();
	glGetShaderiv (vShader, GL_COMPILE_STATUS, &vertCompiled);
	if (vertCompiled == 1) {
		cout << "vertex compilation success" << endl;
	} else {
		cout << "vertex compilation failed" << endl;
		ErrorUtil::printShaderLog (vShader);
	}

	glCompileShader (fShader);
	ErrorUtil::checkOpenGLError();
	glGetShaderiv (fShader, GL_COMPILE_STATUS, &fragCompiled);
	if (fragCompiled == 1) {
		cout << "fragment compilation success" << endl;
	} else {
		cout << "fragment compilation failed" << endl;
		ErrorUtil::printShaderLog (fShader);
	}

	//捕获链接着色器时的错误

	glAttachShader (vfprogram, vShader);
	glAttachShader (vfprogram, fShader);
	glLinkProgram (vfprogram);

	glLinkProgram (vfprogram);
	ErrorUtil::checkOpenGLError();
	glGetProgramiv (vfprogram, GL_LINK_STATUS, &linked);
	if (linked == 1) {
		cout << "linking succeeded" << endl;
	} else {
		cout << "linking failed" << endl;
		ErrorUtil::printProgramLog (vfprogram);
	}

	return vfprogram;
}

void
init (GLFWwindow *window)
{
	renderingProgram = createShaderProgram();
	glGenVertexArrays (numVAOs, vao);
	glBindVertexArray (vao[0]);
}

void
display (GLFWwindow *window, double currentTime)
{
	glUseProgram (renderingProgram);
	glPointSize (30.0f);
	glDrawArrays (GL_POINTS, 0, 1);
}

int
main (void)
{
	if (!glfwInit()) {
		exit (EXIT_FAILURE);
	}
	glfwWindowHint (GLFW_CONTEXT_VERSION_MAJOR, 4);
	glfwWindowHint (GLFW_CONTEXT_VERSION_MINOR, 3);
	GLFWwindow *window = glfwCreateWindow (600, 600, "Chapter 2 - program 3", 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);
}
} // namespace UsageExample

ErrorUtil.cpp

cpp 复制代码
#include "ErrorUtil.h"

void
ErrorUtil::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);
		std::cout << "Shader Info Log: " << log << std::endl;
		free (log);
	}
}

void
ErrorUtil::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);
		std::cout << "Program Info Log: " << log << std::endl;
		free (log);
	}
}

bool
ErrorUtil::checkOpenGLError()
{
	bool foundError = false;
	int glErr		= glGetError();
	while (glErr != GL_NO_ERROR) {
		std::cout << "glError: " << glErr << std::endl;
		foundError = true;
		glErr	   = glGetError();
	}
	return foundError;
}
相关推荐
吃着火锅x唱着歌2 分钟前
深度探索C++对象模型 学习笔记 第六章 执行期语意学(1)
c++·笔记·学习
wjcroom5 分钟前
时空和电子7-泡力模型含罗量
人工智能·算法·机器学习
KaMeidebaby9 分钟前
卡梅德生物技术快报 | Fab 合成文库构建与抗体筛选实验流程及数据解析
人工智能·python·tcp/ip·算法·机器学习
AI科技星11 分钟前
氢原子基态能级跃迁紫外频段光子频率计算
开发语言·网络·量子计算·agi·拓扑学
金融小师妹12 分钟前
基于AI事件驱动模型与验证溢价框架的市场分析:从预期交易到事实验证,原油与黄金面临关键定价重构
大数据·人工智能·算法·均值算法·线性回归
devilnumber17 分钟前
Java Lambda 表达式 200 条常见问题、坑点、易错点、规范清单
java·开发语言
xxwl58518 分钟前
工作室小测的部分记录
c++·学习·算法
zzz_236821 分钟前
【Java基础】二叉树遍历与红黑树的完美平衡艺术——从递归崩溃到自平衡的硬核拆解
java·开发语言
程序员zgh21 分钟前
C++ 万能引用与完美转发
c语言·开发语言·c++·经验分享·学习
智者知已应修善业22 分钟前
【51单片机串口通信甲机四个按键模拟四位二进制值发送乙机以十进制显示2位数码管】2024-6-14
c++·经验分享·笔记·算法·51单片机