pretty-automata/src/shader-helper.cpp

51 lines
1.7 KiB
C++

#include "shader-helper.h"
#include <cstdlib>
#include <iostream>
#include <span>
GLuint loadShader(std::string_view name, std::span<const std::byte> source, GLenum shader_type) {
GLuint shaderId = glCreateShader(shader_type);
GLint result = GL_FALSE;
int infoLogLength;
auto data = reinterpret_cast<const char*>(source.data());
auto size = static_cast<GLint>(source.size());
glShaderSource(shaderId, 1, &data, &size);
glCompileShader(shaderId);
glGetShaderiv(shaderId, GL_COMPILE_STATUS, &result);
glGetShaderiv(shaderId, GL_INFO_LOG_LENGTH, &infoLogLength);
if (infoLogLength > 0) {
std::cout << "errors in shader " << name << std::endl;
std::vector<char> VertexShaderErrorMessage(infoLogLength + 1);
glGetShaderInfoLog(shaderId, infoLogLength, nullptr,
&VertexShaderErrorMessage[0]);
std::cout << &VertexShaderErrorMessage[0] << std::endl;
std::cout << "=====" << std::endl;
std::cout << std::string_view(data, size) << std::endl;
exit(-1);
}
return shaderId;
}
GLuint loadProgram(std::string_view name, const std::vector<GLuint> &shaders) {
GLuint programId = glCreateProgram();
for (const auto &item : shaders) {
glAttachShader(programId, item);
}
glLinkProgram(programId);
GLint result = GL_FALSE;
int infoLogLength;
glGetProgramiv(programId, GL_LINK_STATUS, &result);
glGetProgramiv(programId, GL_INFO_LOG_LENGTH, &infoLogLength);
if (infoLogLength > 0) {
std::cout << "errors in program " << name << std::endl;
std::vector<char> ProgramErrorMessage(infoLogLength + 1);
glGetProgramInfoLog(programId, infoLogLength, nullptr,
&ProgramErrorMessage[0]);
std::cout << &ProgramErrorMessage[0] << std::endl;
}
return programId;
}