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;
}
相关推荐
大模型铲屎官7 分钟前
【Python-Day 14】玩转Python字典(上篇):从零开始学习创建、访问与操作
开发语言·人工智能·pytorch·python·深度学习·大模型·字典
yunvwugua__9 分钟前
Python训练营打卡 Day27
开发语言·python
Java致死1 小时前
设计模式Java
java·开发语言·设计模式
zh_xuan1 小时前
c++ 类的语法3
开发语言·c++
一律清风2 小时前
【Opencv】canny边缘检测提取中心坐标
c++·opencv
金融小师妹3 小时前
应用BERT-GCN跨模态情绪分析:贸易缓和与金价波动的AI归因
大数据·人工智能·算法
广州智造3 小时前
OptiStruct实例:3D实体转子分析
数据库·人工智能·算法·机器学习·数学建模·3d·性能优化
belldeep5 小时前
如何阅读、学习 Tcc (Tiny C Compiler) 源代码?如何解析 Tcc 源代码?
c语言·开发语言
LuckyTHP5 小时前
java 使用zxing生成条形码(可自定义文字位置、边框样式)
java·开发语言·python
Trent19855 小时前
影楼精修-肤色统一算法解析
图像处理·人工智能·算法·计算机视觉