void gpuPSApp::setupTextures(){ // Position 2D texture array mInitPos = Surface32f( SIDE, SIDE, true); Surface32f::Iter pixelIter = mInitPos.getIter(); while( pixelIter.line() ) { while( pixelIter.pixel() ) { /* Initial particle positions are passed in as R,G,B float values. Alpha is used as particle mass. */ mInitPos.setPixel( pixelIter.getPos(), ColorAf( Rand::randFloat()-0.5f, Rand::randFloat()-0.5f, Rand::randFloat()-0.5f, Rand::randFloat(0.2f, 1.0f) ) ); } } gl::Texture::Format tFormat; tFormat.setInternalFormat(GL_RGBA32F_ARB); mPositions = gl::Texture( mInitPos, tFormat); mPositions.setWrap( GL_REPEAT, GL_REPEAT ); mPositions.setMinFilter( GL_NEAREST ); mPositions.setMagFilter( GL_NEAREST ); //Velocity 2D texture array mInitVel = Surface32f( SIDE, SIDE, true); pixelIter = mInitVel.getIter(); while( pixelIter.line() ) { while( pixelIter.pixel() ) { /* Initial particle velocities are passed in as R,G,B float values. */ mInitVel.setPixel( pixelIter.getPos(), ColorAf( 0.0f, 0.0f, 0.0f, 1.0f ) ); } } mVelocities = gl::Texture( mInitVel, tFormat); mVelocities.setWrap( GL_REPEAT, GL_REPEAT ); mVelocities.setMinFilter( GL_NEAREST ); mVelocities.setMagFilter( GL_NEAREST ); }
void EpicMonsterApp::setupPingPongFbo() { float scale = 8.0f; // TODO: Test with more than 2 texture attachments Surface32f surfaces[2]; // Position 2D texture array surfaces[0] = Surface32f( SIDE, SIDE, true); Surface32f::Iter pixelIter = surfaces[0].getIter(); while( pixelIter.line() ) { while( pixelIter.pixel() ) { /* Initial particle positions are passed in as R,G,B float values. Alpha is used as particle invMass. */ surfaces[0].setPixel(pixelIter.getPos(), ColorAf(scale*(Rand::randFloat()-0.5f), scale*(Rand::randFloat()-0.5f), scale*(Rand::randFloat()-0.5f), Rand::randFloat(0.2f, 1.0f) ) ); } } //Velocity 2D texture array surfaces[1] = Surface32f( SIDE, SIDE, true); pixelIter = surfaces[1].getIter(); while( pixelIter.line() ) { while( pixelIter.pixel() ) { /* Initial particle velocities are passed in as R,G,B float values. */ surfaces[1].setPixel( pixelIter.getPos(), ColorAf( 0.0f, 0.0f, 0.0f, 1.0f ) ); } } mPPFbo = PingPongFbo(surfaces); }
Surface32f mapDepthFrameToBody( const ci::Channel16u& depth, ICoordinateMapper* mapper ) { size_t numPoints = depth.getWidth() * depth.getHeight(); Surface32f surface( depth.getWidth(), depth.getHeight(), false /* no alpha */, SurfaceChannelOrder::RGB ); vector<CameraSpacePoint> cameraSpacePoints( numPoints ); long hr = mapper->MapDepthFrameToCameraSpace( (UINT)numPoints, depth.getData(), numPoints, &cameraSpacePoints[0] ); if ( SUCCEEDED( hr ) ) { Surface32f::Iter iter = surface.getIter(); while ( iter.line() ) { while ( iter.pixel() ) { size_t i = iter.getPos().y * iter.getWidth() + iter.getPos().x; CameraSpacePoint &p = cameraSpacePoints[i]; iter.r() = p.X; iter.g() = p.Y; iter.b() = p.Z; } } } return surface; }
void millionParticlesApp::setup() { gl::clear(); try { mPosShader = gl::GlslProg(ci::app::loadResource(POS_VS),ci::app::loadResource(POS_FS)); mVelShader = gl::GlslProg(ci::app::loadResource(VEL_VS),ci::app::loadResource(VEL_FS)); } catch( gl::GlslProgCompileExc &exc ) { std::cout << "Shader compile error: " << std::endl; std::cout << exc.what(); } catch( ... ) { std::cout << "Unable to load shader" << std::endl; } //controls mDrawTextures = false; mIsFullScreen = false; mFrameCounter = 0; mPerlin = Perlin(32,clock() * .1f); //initialize buffer Surface32f mPosSurface = Surface32f(PARTICLES,PARTICLES,true); Surface32f mVelSurface = Surface32f(PARTICLES,PARTICLES,true); Surface32f mInfoSurface = Surface32f(PARTICLES,PARTICLES,true); Surface32f mNoiseSurface = Surface32f(PARTICLES,PARTICLES,true); Surface32f::Iter iterator = mPosSurface.getIter(); while(iterator.line()) { while(iterator.pixel()) { mVertPos = Vec3f(Rand::randFloat(getWindowWidth()) / (float)getWindowWidth(), Rand::randFloat(getWindowHeight()) / (float)getWindowHeight(),0.0f); //velocity Vec2f vel = Vec2f(Rand::randFloat(-.005f,.005f),Rand::randFloat(-.005f,.005f)); float nX = iterator.x() * 0.005f; float nY = iterator.y() * 0.005f; float nZ = app::getElapsedSeconds() * 0.1f; Vec3f v( nX, nY, nZ ); float noise = mPerlin.fBm( v ); float angle = noise * 15.0f ; //vel = Vec3f( cos( angle ) * 6.28f, cos( angle ) * 6.28f, 0.0f ); //noise mNoiseSurface.setPixel(iterator.getPos(), Color( cos( angle ) * Rand::randFloat(.00005f,.0002f), sin( angle ) * Rand::randFloat(.00005f,.0002f), 0.0f )); //position + mass mPosSurface.setPixel(iterator.getPos(), ColorA(mVertPos.x,mVertPos.y,mVertPos.z, Rand::randFloat(.00005f,.0002f))); //forces + decay mVelSurface.setPixel(iterator.getPos(), Color(vel.x,vel.y, Rand::randFloat(.01f,1.00f))); //particle age mInfoSurface.setPixel(iterator.getPos(), ColorA(Rand::randFloat(.007f,1.0f), 1.0f,0.00f,1.00f)); } } //gl texture settings gl::Texture::Format tFormat; tFormat.setInternalFormat(GL_RGBA16F_ARB); gl::Texture::Format tFormatSmall; tFormat.setInternalFormat(GL_RGBA8); mSpriteTex = gl::Texture( loadImage( loadResource( "point.png" ) ), tFormatSmall); mNoiseTex = gl::Texture(mNoiseSurface, tFormatSmall); mNoiseTex.setWrap( GL_REPEAT, GL_REPEAT ); mNoiseTex.setMinFilter( GL_NEAREST ); mNoiseTex.setMagFilter( GL_NEAREST ); mPosTex = gl::Texture(mPosSurface, tFormat); mPosTex.setWrap( GL_REPEAT, GL_REPEAT ); mPosTex.setMinFilter( GL_NEAREST ); mPosTex.setMagFilter( GL_NEAREST ); mVelTex = gl::Texture(mVelSurface, tFormat); mVelTex.setWrap( GL_REPEAT, GL_REPEAT ); mVelTex.setMinFilter( GL_NEAREST ); mVelTex.setMagFilter( GL_NEAREST ); mInfoTex = gl::Texture(mInfoSurface, tFormatSmall); mInfoTex.setWrap( GL_REPEAT, GL_REPEAT ); mInfoTex.setMinFilter( GL_NEAREST ); mInfoTex.setMagFilter( GL_NEAREST ); //initialize fbo gl::Fbo::Format format; format.enableDepthBuffer(false); format.enableColorBuffer(true, 3); format.setMinFilter( GL_NEAREST ); format.setMagFilter( GL_NEAREST ); format.setWrap(GL_CLAMP,GL_CLAMP); format.setColorInternalFormat( GL_RGBA16F_ARB ); mFbo[0] = gl::Fbo(PARTICLES,PARTICLES, format); mFbo[1] = gl::Fbo(PARTICLES,PARTICLES, format); initFBO(); //fill dummy fbo vector<Vec2f> texCoords; vector<Vec3f> vertCoords, normCoords; vector<uint32_t> indices; gl::VboMesh::Layout layout; layout.setStaticIndices(); layout.setStaticPositions(); layout.setStaticTexCoords2d(); layout.setStaticNormals(); mVbo = gl::VboMesh(PARTICLES*PARTICLES,PARTICLES*PARTICLES,layout,GL_POINTS); for (int x = 0; x < PARTICLES; ++x) { for (int y = 0; y < PARTICLES; ++y) { indices.push_back( x * PARTICLES + y); texCoords.push_back( Vec2f( x/(float)PARTICLES, y/(float)PARTICLES)); } } mVbo.bufferIndices(indices); mVbo.bufferTexCoords2d(0, texCoords); }
void cApp::setup(){ setWindowPos( 0, 0 ); setWindowSize( 1080*3*0.5, 1920*0.5 ); mExp.setup( 1080*3, 1920, 3000, GL_RGB, mt::getRenderPath(), 0); CameraPersp cam(1080*3, 1920, 54.4f, 0.1, 10000 ); cam.lookAt( Vec3f(0,0, 1600), Vec3f(0,0,0) ); cam.setCenterOfInterestPoint( Vec3f(0,0,0) ); camUi.setCurrentCam( cam ); mPln.setSeed(123); mPln.setOctaves(4); fs::path assetPath = mt::getAssetPath(); { // make VectorMap Surface32f sAspect( loadImage(assetPath/("img/00/halpha3000_aspect_32bit.tif")) ); Surface32f sSlope( loadImage(assetPath/("img/00/halpha3000_slope1.tif")) ); int w = sAspect.getWidth(); int h = sAspect.getHeight(); mVecMap.assign(w, vector<Vec2f>(h) ); for( int i=0; i<sAspect.getWidth(); i++) { for( int j=0; j<sAspect.getHeight(); j++ ) { Vec2i pos(i, j); float aspect = *sAspect.getDataRed( pos ); float slope = *sSlope.getDataRed( pos ); if( slope!=0 && aspect!=-9999 ){ Vec2f vel( 0, slope*10.0 ); vel.rotate( toRadians(aspect) ); mVecMap[i][j] = vel; }else{ mVecMap[i][j] = Vec2f::zero(); } mVelocity.push_back( Vec3f(mVecMap[i][j].x, mVecMap[i][j].y, 0) ); } } } { // make point from intensity Surface32f sIntensity( loadImage(assetPath/("img/00/halpha3000-skv3264879915580.tiff")) ); intensityW = sIntensity.getWidth(); intensityH = sIntensity.getHeight(); Surface32f::Iter itr = sIntensity.getIter(); float threashold = 0.15; float extrusion = 300; while ( itr.line() ) { while( itr.pixel() ){ float gray = itr.r(); if( threashold < gray ){ Vec2i pos = itr.getPos(); Vec3f v(pos.x, pos.y, gray*extrusion ); Vec3f noise = mPln.dfBm( Vec3f(pos.x, pos.y, gray) ) * 2.0; ps.push_back( v + noise ); float c = gray + 0.2f; float a = lmap(c, 0.0f, 1.0f, 0.3f, 0.7f); cs.push_back( ColorAf(c, c, c, a) ); } } } mPoints = gl::VboMesh( ps.size(), 0, mt::getVboLayout(), GL_POINTS ); gl::VboMesh::VertexIter vitr( mPoints ); for(int i=0; i<ps.size(); i++ ){ vitr.setPosition( ps[i] ); vitr.setColorRGBA( cs[i] ); ++vitr; } } mExp.startRender(); bStart = true; }