return GL_RGBA;
}
+inline bool Image::usesFloat() const { return info & kCGBitmapFloatComponents; }
+
GLint Image::internalFormat() const {
switch (format()) {
case GL_DEPTH_COMPONENT: return GL_DEPTH_COMPONENT;
- case GL_RGB: return GL_RGB;
+ case GL_RGB:
+ if (bitsPerComponent == 16)
+ return usesFloat() ? GL_RGB16F : GL_RGB16;
+ else if (bitsPerComponent == 8)
+ return GL_RGB;
+ else abort();
default: return GL_RGBA;
}
}
GLenum Image::type() const {
- bool isFloat = info & kCGBitmapFloatComponents;
- if (isFloat) return GL_FLOAT;
+ if (usesFloat()) {
+ if (bitsPerComponent == 16) return GL_HALF_FLOAT;
+ else if (bitsPerComponent == 32) return GL_FLOAT;
+ abort();
+ }
return GL_UNSIGNED_BYTE;
//TODO:
CGColorSpaceRef colorSpace;
GLfloat _width, _height;
size_t bitsPerComponent;
+ bool usesFloat() const;
#endif
};
glViewport(0, 0, windowWidth, windowHeight);
}
-bool* keyStates = new bool[256];
+bool keyStates[256] = {false};
void keyboard(unsigned char key, int x, int y) {
keyStates[key] = true;
glBindTexture(GL_TEXTURE_2D, hdrTexId);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, img.width(), img.height(), 0, GL_RGB, GL_HALF_FLOAT, (uint16_t*)img.data());
+ glTexImage2D(GL_TEXTURE_2D, 0, img.internalFormat(), img.width(), img.height(), 0, img.format(), img.type(), img.data());
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);