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;
}
相关推荐
草莓熊Lotso1 小时前
Linux 基础 IO 初步解析:从 C 库函数到系统调用,理解文件操作本质
linux·运维·服务器·c语言·数据库·c++·人工智能
梵刹古音1 小时前
【C语言】 字符数组相关库函数
c语言·开发语言·算法
闻缺陷则喜何志丹1 小时前
P8699 [蓝桥杯 2019 国 B] 排列数|普及+
c++·数学·蓝桥杯·数论·洛谷·数列
D_evil__7 小时前
【Effective Modern C++】第三章 转向现代C++:16. 让const成员函数线程安全
c++
微风中的麦穗7 小时前
【MATLAB】MATLAB R2025a 详细下载安装图文指南:下一代科学计算与工程仿真平台
开发语言·matlab·开发工具·工程仿真·matlab r2025a·matlab r2025·科学计算与工程仿真
2601_949146537 小时前
C语言语音通知API示例代码:基于标准C的语音接口开发与底层调用实践
c语言·开发语言
开源技术8 小时前
Python Pillow 优化,打开和保存速度最快提高14倍
开发语言·python·pillow
学嵌入式的小杨同学8 小时前
从零打造 Linux 终端 MP3 播放器!用 C 语言实现音乐自由
linux·c语言·开发语言·前端·vscode·ci/cd·vim
wfeqhfxz25887828 小时前
YOLO13-C3k2-GhostDynamicConv烟雾检测算法实现与优化
人工智能·算法·计算机视觉
Aaron15888 小时前
基于RFSOC的数字射频存储技术应用分析
c语言·人工智能·驱动开发·算法·fpga开发·硬件工程·信号处理