원본은 https://www.shadertoy.com/view/4lXXWn 이다.
하지만 OF용으로 몇몇것들이 맞지 않아 수정을 해야 했다.
결과물 상세 이미지
쉐이더 1번에 최대한 효과적인 블러를 만들어야 겠다는 목표로..
#define STRINGIFY(A) #A
ofImage image1;
ofImage boy;
ofShader shader1;
//--------------------------------------------------------------
void ofApp::setup(){
//원본 : https://www.shadertoy.com/view/4lXXWn
string shaderProgram = STRINGIFY(
uniform sampler2DRect iChannel0;
uniform vec3 iResolution;
uniform float repeats;
uniform float amount; // 범위 0.0 ~ 0.1
vec4 texture(vec2 uv) {
return texture2DRect(iChannel0,vec2(uv.x * iResolution.x ,uv.y * iResolution.y));//.rgb;
}
//랜덤 이용
float rand(vec2 co){
return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);
}
void mainImage( out vec4 fragColor, vec2 fragCoord )
{
vec2 uv = (fragCoord.xy / iResolution.xy);
vec4 blurred_image = vec4(0.);
for (float i = 0.0; i < repeats; i++) {
vec2 q = vec2(cos(degrees((i/repeats)*360.)),sin(degrees((i/repeats)*360.))) * (rand(vec2(i*uv.x ,i*uv.y ))+amount);
vec2 uv2 = uv+(q*amount);
blurred_image += texture(uv2)/2.;
q = vec2(cos(degrees((i/repeats)*360.)),sin(degrees((i/repeats)*360.))) * (rand(vec2(i*uv.x ,i*uv.y ))+amount);
uv2 = uv+(q*amount);
blurred_image += texture(uv2)/2.;
}
blurred_image /= repeats;
fragColor = blurred_image;
}
void main(void)
{
vec2 pos = gl_TexCoord[0].st;
vec4 color = vec4(0.0 , 0.0 , 0.0 , 0.0);
mainImage(color , pos);
gl_FragColor = color;
}
);
shader1.setupShaderFromSource(GL_FRAGMENT_SHADER , shaderProgram);
shader1.linkProgram();
boy.load("images/boy.png");
image1.load("images/scenery.png");
}
//--------------------------------------------------------------
float elapsed_time = 0.0;
void ofApp::draw(){
elapsed_time += ofGetLastFrameTime();
int repeats = ofMap(ofGetMouseX() ,0 , ofGetWidth() , 1 , 240);
float amount = ofMap(ofGetMouseY() , 0 , ofGetHeight() , 0.0 , 0.1);
boy.draw(0 , 0 , ofGetWidth() , ofGetHeight());
shader1.begin();
shader1.setUniform3f("iResolution" , image1.getWidth() , image1.getHeight() , 0.0f);
shader1.setUniform1f("repeats" , repeats);
shader1.setUniform1f("amount" , ofMap(ofGetMouseY() , 0 , ofGetHeight() , 0.0 , 0.1));
image1.draw(0,0);
shader1.end();
ofDrawBitmapStringHighlight(ofToString(ofGetFrameRate()) , 30,30);
ofDrawBitmapStringHighlight("repeats : " + ofToString(repeats) , 30 , 60);
ofDrawBitmapStringHighlight("amount : " + ofToString(amount) , 30 , 75);
boy.draw(30 , 90 , 50 , 50);
}
//--------------------------------------------------------------
void ofApp::update(){
}
//--------------------------------------------------------------
void ofApp::keyPressed(int key){
if(key == '1')
{
image1 = ofImage("images/scenery.png");
}
else if(key == '2')
{
image1 = ofImage("images/CircleAndRect1.png");
}
}
'C++(oF)' 카테고리의 다른 글
Poco 를 이용한 날짜 계산 (0) | 2016.07.10 |
---|---|
[of] LIB VLC 사용하기 (0) | 2016.07.09 |
Blur쉐이더 , Desktop 용 (0) | 2016.06.18 |
Desktop 과 IOS(openGLES2.0) 의 쉐이더 텍스처 기본 시작 코드 (0) | 2016.06.18 |
[IOS] 아이폰의 카메라 기능을 모두 사용 하기 (0) | 2016.04.16 |
CLM Framework with (TBB) on openFrameworks (0) | 2016.04.14 |