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);
}
예제 #3
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);
}
예제 #5
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 );
}