void Rasterizer::initLightPass() { this->shader_programs["LIGHTPASS"] = _initShader(shader_light_pass_vs, shader_light_pass_fs); glGenFramebuffers(1, &this->fbo_lpass); glBindFramebuffer(GL_FRAMEBUFFER, this->fbo_lpass); // Light Buffer glGenTextures(1, &this->lpass_color0_target); glBindTexture(GL_TEXTURE_2D, this->lpass_color0_target); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16, this->camera->getWidth(), this->camera->getHeight(), 0, GL_RGB, GL_UNSIGNED_SHORT, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, this->lpass_color0_target, 0); // Depth Buffer glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, this->prepass_depth_target, 0); // Make sure everything is fine GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); if (status != GL_FRAMEBUFFER_COMPLETE) fprintf(stderr, "Prepass FBO incomplete\n"); GLenum buffers[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1}; glDrawBuffers(1, buffers); // Clean up state glBindFramebuffer(GL_FRAMEBUFFER, 0); glBindTexture(GL_TEXTURE_2D, 0); }
void Rasterizer::initRayDataPass() { if (!this->shader_programs["MESH"]) this->shader_programs["MESH"] = _initShader(shader_mesh_vs, shader_mesh_fs); glGenVertexArrays(1, &this->vao_raydata); glBindVertexArray(this->vao_raydata); glGenBuffers(1, &this->vbo_raydata); glBindBuffer(GL_ARRAY_BUFFER, this->vbo_raydata); glEnableVertexAttribArray(0); glEnableVertexAttribArray(1); glEnableVertexAttribArray(2); glEnableVertexAttribArray(3); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Ray), (void*)offsetof(Ray, origin)); glVertexAttribPointer(1, 3, GL_FLOAT, GL_TRUE, sizeof(Ray), (void*)offsetof(Ray, normal)); glVertexAttribPointer(2, 2, GL_FLOAT, GL_TRUE, sizeof(Ray), (void*)offsetof(Ray, texcoord)); glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, sizeof(Ray), (void*)offsetof(Ray, position)); glBufferData(GL_ARRAY_BUFFER, this->prepass_height*this->prepass_width*sizeof(Ray), NULL, GL_STREAM_DRAW); glGenFramebuffers(1, &this->fbo_raypass); glBindFramebuffer(GL_FRAMEBUFFER, this->fbo_raypass); // Reflection Buffer glGenTextures(1, &this->raypass_target); glBindTexture(GL_TEXTURE_2D, this->raypass_target); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, this->prepass_width, this->prepass_height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, this->raypass_target, 0); // Make sure everything is fine GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); if (status != GL_FRAMEBUFFER_COMPLETE) fprintf(stderr, "RayPass FBO incomplete\n"); GLenum buffers[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1}; glDrawBuffers(1, buffers); // Clean up state glBindFramebuffer(GL_FRAMEBUFFER, 0); glBindTexture(GL_TEXTURE_2D, 0); glBindVertexArray(0); }
void Rasterizer::drawMeshes() { glClearColor(0.3f,0.3f,0.3f,1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glViewport(0, 0, this->frame_width, this->frame_height); if (!this->shader_programs["MESH"]) this->shader_programs["MESH"] = _initShader(shader_mesh_vs, shader_mesh_fs); glUseProgram(this->shader_programs["MESH"]); int loc = glGetUniformLocation(this->shader_programs["MESH"], "proj_mat"); glUniformMatrix4fv(loc, 1, GL_FALSE, &this->proj_mat[0][0]); loc = glGetUniformLocation(this->shader_programs["MESH"], "transform_draw"); glUniform1i(loc, 1); loc = glGetUniformLocation(this->shader_programs["MESH"], "frame_size"); glUniform2f(loc, this->frame_width, this->frame_height); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, this->lpass_color0_target); loc = glGetUniformLocation(this->shader_programs["MESH"], "lightBuffer"); glUniform1i(loc, 0); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, this->raypass_target); loc = glGetUniformLocation(this->shader_programs["MESH"], "raypassBuffer"); glUniform1i(loc, 1); this->bindLights(this->shader_programs["MESH"]); RasMesh *mesh; for (unsigned int i=0; i < this->meshes.size(); i++) { mesh = this->meshes[i]; loc = glGetUniformLocation(this->shader_programs["MESH"], "model_mat"); glUniformMatrix4fv(loc, 1, GL_FALSE, &mesh->getModelMat()(0, 0)); this->bindMaterial(mesh->getMaterial(), this->shader_programs["MESH"]); this->meshes[i]->draw(); } glActiveTexture(GL_TEXTURE0); }
void Rasterizer::initPrepass() { this->shader_programs["PREPASS"] = _initShader(shader_prepass_vs, shader_prepass_fs); glGenFramebuffers(1, &this->fbo_prepass); glBindFramebuffer(GL_FRAMEBUFFER, this->fbo_prepass); // Normals Buffer glGenTextures(1, &this->prepass_color0_target); glBindTexture(GL_TEXTURE_2D, this->prepass_color0_target); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB10_A2, this->prepass_width, this->prepass_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, this->prepass_color0_target, 0); // Position Buffer glGenTextures(1, &this->prepass_color1_target); glBindTexture(GL_TEXTURE_2D, this->prepass_color1_target); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, this->prepass_width, this->prepass_height, 0, GL_RGB, GL_HALF_FLOAT, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, this->prepass_color1_target, 0); // Depth Buffer glGenTextures(1, &this->prepass_depth_target); glBindTexture(GL_TEXTURE_2D, this->prepass_depth_target); glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32F, this->prepass_width, this->prepass_height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, this->prepass_depth_target, 0); // Make sure everything is fine GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); if (status != GL_FRAMEBUFFER_COMPLETE) fprintf(stderr, "Prepass FBO incomplete\n"); GLenum buffers[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1}; glDrawBuffers(2, buffers); // Clean up state glBindFramebuffer(GL_FRAMEBUFFER, 0); glBindTexture(GL_TEXTURE_2D, 0); }
void ScatterSky::_render( ObjectRenderInst *ri, SceneRenderState *state, BaseMatInstance *overrideMat ) { if ( overrideMat || (!mShader && !_initShader()) ) return; GFXTransformSaver saver; if ( mVB.isNull() || mPrimBuffer.isNull() ) _initVBIB(); GFX->setShader( mShader ); GFX->setShaderConstBuffer( mShaderConsts ); Point4F sphereRadii( mSphereOuterRadius, mSphereOuterRadius * mSphereOuterRadius, mSphereInnerRadius, mSphereInnerRadius * mSphereInnerRadius ); Point4F scatteringCoeffs( mRayleighScattering * mSkyBrightness, mRayleighScattering4PI, mMieScattering * mSkyBrightness, mMieScattering4PI ); Point4F invWavelength( 1.0f / mWavelength4[0], 1.0f / mWavelength4[1], 1.0f / mWavelength4[2], 1.0f ); Point3F camPos( 0, 0, smViewerHeight ); Point4F miscParams( camPos.z, camPos.z * camPos.z, mScale, mScale / mRayleighScaleDepth ); Frustum frust = state->getFrustum(); frust.setFarDist( smEarthRadius + smAtmosphereRadius ); MatrixF proj( true ); frust.getProjectionMatrix( &proj ); Point3F camPos2 = state->getCameraPosition(); MatrixF xfm(true); xfm.setPosition(camPos2);//-Point3F( 0, 0, 200000.0f)); GFX->multWorld(xfm); MatrixF xform(proj);//GFX->getProjectionMatrix()); xform *= GFX->getViewMatrix(); xform *= GFX->getWorldMatrix(); mShaderConsts->setSafe( mModelViewProjSC, xform ); mShaderConsts->setSafe( mMiscSC, miscParams ); mShaderConsts->setSafe( mSphereRadiiSC, sphereRadii ); mShaderConsts->setSafe( mScatteringCoefficientsSC, scatteringCoeffs ); mShaderConsts->setSafe( mCamPosSC, camPos ); mShaderConsts->setSafe( mLightDirSC, mLightDir ); mShaderConsts->setSafe( mSunDirSC, mSunDir ); mShaderConsts->setSafe( mNightColorSC, mNightColor ); mShaderConsts->setSafe( mInverseWavelengthSC, invWavelength ); mShaderConsts->setSafe( mNightInterpolantAndExposureSC, Point2F( mExposure, mNightInterpolant ) ); mShaderConsts->setSafe( mColorizeSC, mColorize*mColorizeAmt ); if ( GFXDevice::getWireframe() ) { GFXStateBlockDesc desc( mStateBlock->getDesc() ); desc.setFillModeWireframe(); GFX->setStateBlockByDesc( desc ); } else GFX->setStateBlock( mStateBlock ); if ( mUseNightCubemap && mNightCubemap ) { mShaderConsts->setSafe( mUseCubemapSC, 1.0f ); if ( !mNightCubemap->mCubemap ) mNightCubemap->createMap(); GFX->setCubeTexture( 0, mNightCubemap->mCubemap ); } else { GFX->setCubeTexture( 0, NULL ); mShaderConsts->setSafe( mUseCubemapSC, 0.0f ); } GFX->setPrimitiveBuffer( mPrimBuffer ); GFX->setVertexBuffer( mVB ); GFX->drawIndexedPrimitive( GFXTriangleList, 0, 0, mVertCount, 0, mPrimCount ); }