Ability to load texture into fbo
This commit is contained in:
parent
06c1ef467e
commit
e4d1d9e8e3
6 changed files with 160 additions and 4 deletions
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
build
|
||||||
|
.DS_Store
|
||||||
|
xcuserdata
|
|
@ -16,6 +16,7 @@
|
||||||
4268136F140A321800CBF943 /* J.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4268136E140A321800CBF943 /* J.mm */; };
|
4268136F140A321800CBF943 /* J.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4268136E140A321800CBF943 /* J.mm */; };
|
||||||
4283A45F14115AC400036A5D /* interpolator.h in Headers */ = {isa = PBXBuildFile; fileRef = 4283A45E14115AC300036A5D /* interpolator.h */; };
|
4283A45F14115AC400036A5D /* interpolator.h in Headers */ = {isa = PBXBuildFile; fileRef = 4283A45E14115AC300036A5D /* interpolator.h */; };
|
||||||
4283A4641411707700036A5D /* array.h in Headers */ = {isa = PBXBuildFile; fileRef = 4283A4631411707700036A5D /* array.h */; };
|
4283A4641411707700036A5D /* array.h in Headers */ = {isa = PBXBuildFile; fileRef = 4283A4631411707700036A5D /* array.h */; };
|
||||||
|
429E3BAB159616FD0044306C /* texture_objc.mm in Sources */ = {isa = PBXBuildFile; fileRef = 429E3BAA159616FD0044306C /* texture_objc.mm */; };
|
||||||
42ED6A6B140A380000402F76 /* fbo.h in Headers */ = {isa = PBXBuildFile; fileRef = 42ED6A68140A380000402F76 /* fbo.h */; };
|
42ED6A6B140A380000402F76 /* fbo.h in Headers */ = {isa = PBXBuildFile; fileRef = 42ED6A68140A380000402F76 /* fbo.h */; };
|
||||||
42ED6A6C140A380000402F76 /* shader.h in Headers */ = {isa = PBXBuildFile; fileRef = 42ED6A69140A380000402F76 /* shader.h */; };
|
42ED6A6C140A380000402F76 /* shader.h in Headers */ = {isa = PBXBuildFile; fileRef = 42ED6A69140A380000402F76 /* shader.h */; };
|
||||||
42ED6A6D140A380000402F76 /* to_string.h in Headers */ = {isa = PBXBuildFile; fileRef = 42ED6A6A140A380000402F76 /* to_string.h */; };
|
42ED6A6D140A380000402F76 /* to_string.h in Headers */ = {isa = PBXBuildFile; fileRef = 42ED6A6A140A380000402F76 /* to_string.h */; };
|
||||||
|
@ -33,6 +34,9 @@
|
||||||
4268136E140A321800CBF943 /* J.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = J.mm; sourceTree = "<group>"; };
|
4268136E140A321800CBF943 /* J.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = J.mm; sourceTree = "<group>"; };
|
||||||
4283A45E14115AC300036A5D /* interpolator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = interpolator.h; sourceTree = "<group>"; };
|
4283A45E14115AC300036A5D /* interpolator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = interpolator.h; sourceTree = "<group>"; };
|
||||||
4283A4631411707700036A5D /* array.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = array.h; sourceTree = "<group>"; };
|
4283A4631411707700036A5D /* array.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = array.h; sourceTree = "<group>"; };
|
||||||
|
429E3BA715960FCA0044306C /* texture.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = texture.h; sourceTree = "<group>"; };
|
||||||
|
429E3BA9159616C00044306C /* texture_objc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = texture_objc.h; sourceTree = "<group>"; };
|
||||||
|
429E3BAA159616FD0044306C /* texture_objc.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = texture_objc.mm; sourceTree = "<group>"; };
|
||||||
42ED6A68140A380000402F76 /* fbo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fbo.h; sourceTree = "<group>"; };
|
42ED6A68140A380000402F76 /* fbo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fbo.h; sourceTree = "<group>"; };
|
||||||
42ED6A69140A380000402F76 /* shader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = shader.h; sourceTree = "<group>"; };
|
42ED6A69140A380000402F76 /* shader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = shader.h; sourceTree = "<group>"; };
|
||||||
42ED6A6A140A380000402F76 /* to_string.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = to_string.h; sourceTree = "<group>"; };
|
42ED6A6A140A380000402F76 /* to_string.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = to_string.h; sourceTree = "<group>"; };
|
||||||
|
@ -115,6 +119,9 @@
|
||||||
425E9DF1140A74DA00A81A65 /* basic.h */,
|
425E9DF1140A74DA00A81A65 /* basic.h */,
|
||||||
425E9DF5140A774D00A81A65 /* basic.cpp */,
|
425E9DF5140A774D00A81A65 /* basic.cpp */,
|
||||||
42ED6A68140A380000402F76 /* fbo.h */,
|
42ED6A68140A380000402F76 /* fbo.h */,
|
||||||
|
429E3BA715960FCA0044306C /* texture.h */,
|
||||||
|
429E3BA9159616C00044306C /* texture_objc.h */,
|
||||||
|
429E3BAA159616FD0044306C /* texture_objc.mm */,
|
||||||
425E9DF8140A7EB400A81A65 /* fbo.mm */,
|
425E9DF8140A7EB400A81A65 /* fbo.mm */,
|
||||||
42ED6A69140A380000402F76 /* shader.h */,
|
42ED6A69140A380000402F76 /* shader.h */,
|
||||||
);
|
);
|
||||||
|
|
23
J/fbo.h
23
J/fbo.h
|
@ -23,6 +23,7 @@
|
||||||
#include "to_string.h"
|
#include "to_string.h"
|
||||||
|
|
||||||
#include "basic.h"
|
#include "basic.h"
|
||||||
|
#include "texture.h"
|
||||||
|
|
||||||
@class EAGLContext;
|
@class EAGLContext;
|
||||||
@class CAEAGLLayer;
|
@class CAEAGLLayer;
|
||||||
|
@ -45,14 +46,15 @@ public:
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// standard ctor, makes use of textures
|
// standard ctor, makes use of textures
|
||||||
fbo(int width, int height) : width(width), height(height), fbo_number(0), renderbuffers(), texture_id(0) {
|
template <typename Texture = no_texture>
|
||||||
|
fbo(int width, int height, Texture const & texture = no_texture()) : width(width), height(height), fbo_number(0), renderbuffers(), texture_id(0) {
|
||||||
glGenFramebuffers(1, &fbo_number);
|
glGenFramebuffers(1, &fbo_number);
|
||||||
bind();
|
bind();
|
||||||
|
|
||||||
// generate texture
|
// generate texture
|
||||||
glGenTextures(1, &texture_id);
|
glGenTextures(1, &texture_id);
|
||||||
glBindTexture(GL_TEXTURE_2D, texture_id);
|
glBindTexture(GL_TEXTURE_2D, texture_id);
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
|
bool should_clear = !make_tex(texture);
|
||||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture_id, 0);
|
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture_id, 0);
|
||||||
|
|
||||||
// attach depth
|
// attach depth
|
||||||
|
@ -61,8 +63,10 @@ public:
|
||||||
check_error();
|
check_error();
|
||||||
check_status();
|
check_status();
|
||||||
|
|
||||||
glClearColor(0.0, 0.0, 0.0, 0.0);
|
if(should_clear){
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClearColor(0.0, 0.0, 0.0, 0.0);
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
}
|
||||||
|
|
||||||
unbind();
|
unbind();
|
||||||
}
|
}
|
||||||
|
@ -96,6 +100,17 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
template <typename Texture>
|
||||||
|
bool make_tex(Texture const & texture){
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, Texture::gl_format, Texture::gl_type, texture.data());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool make_tex(no_texture const &){
|
||||||
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void bind(){
|
void bind(){
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, fbo_number);
|
glBindFramebuffer(GL_FRAMEBUFFER, fbo_number);
|
||||||
check_error();
|
check_error();
|
||||||
|
|
86
J/texture.h
Normal file
86
J/texture.h
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
//
|
||||||
|
// texture.h
|
||||||
|
// J
|
||||||
|
//
|
||||||
|
// Created by Joshua Moerman on 6/23/12.
|
||||||
|
// Copyright (c) 2012 Vadovas. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef J_texture_h
|
||||||
|
#define J_texture_h
|
||||||
|
|
||||||
|
#include "basic.h"
|
||||||
|
#include <vector>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
namespace J {
|
||||||
|
|
||||||
|
struct no_texture {};
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
struct gl_type {};
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct gl_type<uint8_t> {
|
||||||
|
static constexpr GLenum value = GL_UNSIGNED_BYTE;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename T = uint8_t>
|
||||||
|
struct rgba {
|
||||||
|
typedef typename std::vector<T>::iterator iterator;
|
||||||
|
typedef typename std::vector<T>::iterator const_iterator;
|
||||||
|
typedef typename std::vector<T>::size_type size_type;
|
||||||
|
static constexpr GLenum gl_type = J::gl_type<T>::value;
|
||||||
|
static constexpr GLenum gl_format = GL_RGBA;
|
||||||
|
|
||||||
|
rgba(size_type w, size_type h, T const * data = nullptr)
|
||||||
|
: width_(w)
|
||||||
|
, height_(h)
|
||||||
|
, pixels(w*h*4){
|
||||||
|
if(data)
|
||||||
|
std::copy_n(data, w*h*4, pixels.begin());
|
||||||
|
}
|
||||||
|
|
||||||
|
size_type size() const { return pixels.size(); }
|
||||||
|
size_type width() const { return width; }
|
||||||
|
size_type height() const { return height; }
|
||||||
|
|
||||||
|
struct row_proxy {
|
||||||
|
row_proxy(T* data) : data(data) {}
|
||||||
|
T& operator[](size_type x){ return data[x]; }
|
||||||
|
T operator[](size_type x) const { return data[x]; }
|
||||||
|
T* data;
|
||||||
|
};
|
||||||
|
|
||||||
|
row_proxy operator[](size_type y){
|
||||||
|
return &pixels[y*width()];
|
||||||
|
}
|
||||||
|
|
||||||
|
struct const_row_proxy {
|
||||||
|
const_row_proxy(T const * data) : data(data) {}
|
||||||
|
T operator[](size_type x) const { return data[x]; }
|
||||||
|
T const * data;
|
||||||
|
};
|
||||||
|
|
||||||
|
const_row_proxy operator[](size_type y) const {
|
||||||
|
return &pixels[y*width()];
|
||||||
|
}
|
||||||
|
|
||||||
|
T * data() { return pixels.data(); }
|
||||||
|
T const * data() const { return pixels.data(); }
|
||||||
|
|
||||||
|
iterator begin() { return pixels.begin(); }
|
||||||
|
iterator end() { return pixels.begin(); }
|
||||||
|
|
||||||
|
const_iterator begin() const { return pixels.begin(); }
|
||||||
|
const_iterator end() const { return pixels.begin(); }
|
||||||
|
|
||||||
|
private:
|
||||||
|
size_type width_;
|
||||||
|
size_type height_;
|
||||||
|
std::vector<T> pixels;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
22
J/texture_objc.h
Normal file
22
J/texture_objc.h
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
//
|
||||||
|
// texture_objc.h
|
||||||
|
// J
|
||||||
|
//
|
||||||
|
// Created by Joshua Moerman on 6/23/12.
|
||||||
|
// Copyright (c) 2012 Vadovas. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef J_texture_objc_h
|
||||||
|
#define J_texture_objc_h
|
||||||
|
|
||||||
|
#include "texture.h"
|
||||||
|
|
||||||
|
@class UIImage;
|
||||||
|
|
||||||
|
namespace J {
|
||||||
|
|
||||||
|
rgba<> texture_from_UIImage(UIImage * image);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
23
J/texture_objc.mm
Normal file
23
J/texture_objc.mm
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
//
|
||||||
|
// texture_objc.mm
|
||||||
|
// J
|
||||||
|
//
|
||||||
|
// Created by Joshua Moerman on 6/23/12.
|
||||||
|
// Copyright (c) 2012 Vadovas. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "texture_objc.h"
|
||||||
|
|
||||||
|
#import <UIKit/UIKit.h>
|
||||||
|
//#import <Quartz/Quartz.h>
|
||||||
|
|
||||||
|
namespace J {
|
||||||
|
rgba<> texture_from_UIImage(UIImage * image){
|
||||||
|
CGImageRef cgImage = image.CGImage;
|
||||||
|
CGDataProviderRef provider = CGImageGetDataProvider(cgImage);
|
||||||
|
CFDataRef bitmapData = CGDataProviderCopyData(provider);
|
||||||
|
CFDataGetBytePtr(bitmapData);
|
||||||
|
|
||||||
|
return rgba<>(image.size.width, image.size.height, CFDataGetBytePtr(bitmapData));
|
||||||
|
}
|
||||||
|
}
|
Reference in a new issue