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;
}
相关推荐
badhope3 小时前
Mobile-Skills:移动端技能可视化的创新实践
开发语言·人工智能·git·智能手机·github
码云数智-园园4 小时前
微服务架构下的分布式事务:在一致性与可用性之间寻找平衡
开发语言
C++ 老炮儿的技术栈4 小时前
volatile使用场景
linux·服务器·c语言·开发语言·c++
hz_zhangrl4 小时前
CCF-GESP 等级考试 2026年3月认证C++一级真题解析
开发语言·c++·gesp·gesp2026年3月·gespc++一级
Liu628885 小时前
C++中的工厂模式高级应用
开发语言·c++·算法
IT猿手5 小时前
基于控制障碍函数的多无人机编队动态避障控制方法研究,MATLAB代码
开发语言·matlab·无人机·openclaw·多无人机动态避障路径规划·无人机编队
AI科技星5 小时前
全尺度角速度统一:基于 v ≡ c 的纯推导与验证
c语言·开发语言·人工智能·opencv·算法·机器学习·数据挖掘
sunwenjian8865 小时前
Java进阶——IO 流
java·开发语言·python
波特率1152005 小时前
const关键字与函数的重载
开发语言·c++·函数重载
FL16238631295 小时前
[C#][winform]segment-anything分割万物部署onnx模型一键抠图演示
开发语言·c#