17 GLenum error = glGetError();
18 if (error != GL_NO_ERROR) {
21 std::cerr <<
"GL error: " << prefix <<
": " << int(error) <<
'\n';
61 int mode = interpolation ? GL_LINEAR : GL_NEAREST;
62 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, mode);
63 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mode);
69 int mode = wrap ? GL_REPEAT : GL_CLAMP_TO_EDGE;
70 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, mode);
71 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, mode);
104 glGenFramebuffers(1, &bufferId);
106 glFramebufferTexture2D(GL_FRAMEBUFFER,
107 GL_COLOR_ATTACHMENT0,
109 bool success = glCheckFramebufferStatus(GL_FRAMEBUFFER) ==
110 GL_FRAMEBUFFER_COMPLETE;
114 "Your OpenGL implementation support for "
115 "framebuffer objects is too limited.");
122 glDeleteFramebuffers(1, &bufferId);
127 glGetIntegerv(GL_FRAMEBUFFER_BINDING, &previousId);
128 glBindFramebuffer(GL_FRAMEBUFFER, bufferId);
133 glBindFramebuffer(GL_FRAMEBUFFER, GLuint(previousId));
139void Shader::init(GLenum type, std::string_view header, std::string_view filename)
144 source +=
"#version 100\n";
145 if (type == GL_FRAGMENT_SHADER) {
146 source +=
"#ifdef GL_FRAGMENT_PRECISION_HIGH\n"
147 " precision highp float;\n"
149 " precision mediump float;\n"
153 source +=
"#version 110\n";
158 auto mmap = file.mmap();
159 source.append(
reinterpret_cast<const char*
>(mmap.data()),
162 std::cerr <<
"Cannot find shader: " <<
e.getMessage() <<
'\n';
168 handle = glCreateShader(type);
170 std::cerr <<
"Failed to allocate shader\n";
175 const char* sourcePtr = source.c_str();
176 glShaderSource(handle, 1, &sourcePtr,
nullptr);
179 glCompileShader(handle);
180 const bool ok =
isOK();
181 GLint infoLogLength = 0;
182 glGetShaderiv(handle, GL_INFO_LOG_LENGTH, &infoLogLength);
185 VLA(GLchar, infoLog, infoLogLength);
186 glGetShaderInfoLog(handle, infoLogLength,
nullptr, infoLog.data());
187 std::cerr << (ok ?
"Warning" :
"Error") <<
"(s) compiling shader \""
188 << filename <<
"\":\n"
189 << (infoLogLength > 1 ? infoLog.data() :
"(no details available)\n");
195 glDeleteShader(handle);
200 if (handle == 0)
return false;
201 GLint compileStatus = GL_FALSE;
202 glGetShaderiv(handle, GL_COMPILE_STATUS, &compileStatus);
203 return compileStatus == GL_TRUE;
211 handle = glCreateProgram();
213 std::cerr <<
"Failed to allocate program\n";
221 glDeleteProgram(handle);
228 if (handle == 0)
return false;
229 GLint linkStatus = GL_FALSE;
230 glGetProgramiv(handle, GL_LINK_STATUS, &linkStatus);
231 return linkStatus == GL_TRUE;
237 if (handle == 0)
return;
240 if (!shader.
isOK())
return;
243 glAttachShader(handle, shader.handle);
249 if (handle == 0)
return;
252 glLinkProgram(handle);
253 const bool ok =
isOK();
254 GLint infoLogLength = 0;
255 glGetProgramiv(handle, GL_INFO_LOG_LENGTH, &infoLogLength);
258 VLA(GLchar, infoLog, infoLogLength);
259 glGetProgramInfoLog(handle, infoLogLength,
nullptr, infoLog.data());
260 fprintf(stderr,
"%s(s) linking shader program:\n%s\n",
261 ok ?
"Warning" :
"Error",
262 infoLogLength > 1 ? infoLog.data() :
"(no details available)\n");
268 glBindAttribLocation(handle, index, name);
274 if (!
isOK())
return -1;
276 return glGetUniformLocation(handle, name);
281 glUseProgram(handle);
287 glValidateProgram(handle);
288 GLint validateStatus = GL_FALSE;
289 glGetProgramiv(handle, GL_VALIDATE_STATUS, &validateStatus);
290 GLint infoLogLength = 0;
291 glGetProgramiv(handle, GL_INFO_LOG_LENGTH, &infoLogLength);
293 VLA(GLchar, infoLog, infoLogLength);
294 glGetProgramInfoLog(handle, infoLogLength,
nullptr, infoLog.data());
295 std::cout <<
"Validate "
296 << ((validateStatus == GL_TRUE) ?
"OK" :
"FAIL")
297 <<
": " << infoLog.data() <<
'\n';
305 glGenBuffers(1, &bufferId);
310 glDeleteBuffers(1, &bufferId);
void resize(GLsizei width, GLsizei height)
ColorTexture()=default
Default constructor, zero-sized texture.
FrameBufferObject()=default
void activate() const
Makes this program the active shader program.
bool isOK() const
Returns true iff this program was linked without errors.
void attach(const Shader &shader)
Adds a given shader to this program.
void allocate()
Allocate a shader program handle.
void reset()
Release the shader program handle.
void link()
Links all attached shaders together into one program.
void bindAttribLocation(unsigned index, const char *name)
Bind the given name for a vertex shader attribute to the given location.
GLint getUniformLocation(const char *name) const
Gets a reference to a uniform variable declared in the shader source.
Wrapper around an OpenGL shader: a program executed on the GPU.
bool isOK() const
Returns true iff this shader is loaded and compiled without errors.
Most basic/generic texture: only contains a texture ID.
void reset()
Release openGL texture name.
Texture(const Texture &)=delete
void setWrapMode(bool wrap)
void setInterpolation(bool interpolation)
Enable/disable bilinear interpolation for this texture.
void bind()
Makes this texture the active GL texture.
void allocate()
Allocate an openGL texture name.
Thrown when a subsystem initialisation fails.
void checkGLError(std::string_view prefix)
This file implemented 3 utility functions:
const FileContext & systemFileContext()
TemporaryString tmpStrCat(Ts &&... ts)
#define VLA(TYPE, NAME, LENGTH)