예제 #1
0
void ofxPBR::drawEnvironment(){

	glm::mat4 projectionMatrix = ofGetCurrentMatrix(OF_MATRIX_PROJECTION);
	float m22 = projectionMatrix[2][2];
	float m32 = projectionMatrix[3][2];
\
	float nearClip = (2.0f*m32) / (2.0f*m22 - 2.0f);
	float farClip = ((m22 - 1.0f) * nearClip) / (m22 + 1.0);

	if (enableCubemap && cubeMap != nullptr && cubeMap->isAllocated()) {
		float scale = (farClip - nearClip) / 2;
		glm::mat4 invCurrentViewMatrix = glm::inverse(ofGetCurrentViewMatrix());
		glm::vec3 translate = glm::vec3(invCurrentViewMatrix[3][0], invCurrentViewMatrix[3][1], invCurrentViewMatrix[3][2]);

		ofDisableDepthTest();
		ofPushMatrix();
		ofTranslate(translate);
		cubeMap->bind(1);
		envShader->begin();
		envShader->setUniform1f("envLevel", cubeMap->getEnvLevel());
		envShader->setUniform1i("envMap", 1);
		envShader->setUniform1i("numMips", cubeMap->getNumMips());
		envShader->setUniform1f("cubeMapExposure", cubeMap->getExposure());
		envShader->setUniform1f("cubeMapRotation", cubeMap->getRotation());
		ofPushMatrix();
		ofScale(scale, scale, scale);
		sphereMesh.draw();
		ofPopMatrix();
		envShader->end();
		cubeMap->unbind();
		ofPopMatrix();
		ofEnableDepthTest();
	}
}
예제 #2
0
ofVec3f ofxMapamok::worldToScreen(ofVec3f WorldXYZ, ofRectangle viewport) {
	if (!calibrationReady) {
		return WorldXYZ;
	}

	if (viewport.isZero()) {
		viewport = ofGetCurrentViewport();
	}

	begin();
	ofMatrix4x4 modelViewMatrix = ofGetCurrentMatrix(OF_MATRIX_MODELVIEW);
	ofMatrix4x4 projectionMatrix = ofGetCurrentMatrix(OF_MATRIX_PROJECTION);
	end();

	ofVec3f CameraXYZ = WorldXYZ * modelViewMatrix * projectionMatrix;
	ofVec3f ScreenXYZ;

	ScreenXYZ.x = (CameraXYZ.x + 1.0f) / 2.0f * viewport.width + viewport.x;
	ScreenXYZ.y = (1.0f - CameraXYZ.y) / 2.0f * viewport.height + viewport.y;

	ScreenXYZ.z = CameraXYZ.z;

	return ScreenXYZ;
}
예제 #3
0
//--------------------------------------------------------------
void ofApp::draw(){
    cam.begin();
    shader.begin();
    shader.setUniform1f("fraction", 1.0);

    ofMatrix4x4 mv = ofGetCurrentMatrix(OF_MATRIX_MODELVIEW);
    ofMatrix4x4 normMat = ofMatrix4x4::getTransposedOf(mv.getInverse());
    shader.setUniformMatrix4f("normalMatrix", normMat);
    
    float dirY = (mouseY / float(ofGetHeight()) - 0.5) * 2;
    float dirX = (mouseX / float(ofGetWidth()) - 0.5) * 2;
    lightDir.set(-dirX, -dirY, -1);
    
    ofVec3f lightNorm = ofMatrix4x4::transform3x3(normMat, lightDir);
    lightNorm.normalize();
    shader.setUniform3f("lightNormal", lightNorm.x, lightNorm.y, lightNorm.z);
    
    ofTranslate(ofGetWidth()/2, ofGetHeight()/2);
    ofDrawSphere(0, 0, 120);
    
    shader.end();
    cam.end();
}
예제 #4
0
// pbr
void ofxPBR::beginPBR(){

	glm::mat4 modelViewMatrix = ofGetCurrentMatrix(ofMatrixMode::OF_MATRIX_MODELVIEW);
	
	// pbr
    PBRShader->begin();

	// common uniforms
	PBRShader->setUniform1i("renderMode", renderMode);
	PBRShader->setUniformMatrix4f("viewTranspose", glm::transpose(modelViewMatrix));
	PBRShader->setUniformMatrix4f("viewMatrix", modelViewMatrix);

    // cubemap uniforms
    if (enableCubemap && cubeMap != nullptr && cubeMap->isAllocated()) {
        // enable cubemap
        cubeMap->bind(1);
        PBRShader->setUniform1i("enableEnv", true);
        PBRShader->setUniform1i("numMips", cubeMap->getNumMips());
        PBRShader->setUniform1f("cubeMapExposure", cubeMap->getExposure());
        PBRShader->setUniform1f("cubeMapRotation", cubeMap->getRotation());
        PBRShader->setUniform1i("isHDR", cubeMap->isHDR());
		PBRShader->setUniform1i("envMap", 1);
    }else{
        // disable cubemap
        PBRShader->setUniform1i("enableEnv", false);
        PBRShader->setUniform1i("isHDR", false);
    }
    
    // light uniforms
    PBRShader->setUniform1i("numLights", lights.size());
	for (int i = 0; i < lights.size(); i++) {
		string lightIndex = ofToString(i);

		// common
		PBRShader->setUniform1i("lights[" + lightIndex + "].isEnabled", lights[i]->getIsEnabled());
		PBRShader->setUniform1i("lights[" + lightIndex + "].type", lights[i]->getLightType());
		// color
		PBRShader->setUniform4f("lights[" + lightIndex + "].color", lights[i]->getColor());
		PBRShader->setUniform1f("lights[" + lightIndex + "].intensity", lights[i]->getIntensity());
		// transform
		PBRShader->setUniform3f("lights[" + lightIndex + "].position", lights[i]->getGlobalPosition());
		PBRShader->setUniform3f("lights[" + lightIndex + "].vPosition", lights[i]->getViewSpacePosition(modelViewMatrix));
		PBRShader->setUniform3f("lights[" + lightIndex + "].direction", lights[i]->getViewSpaceDirection(modelViewMatrix));
		// shadow
		PBRShader->setUniform1i("lights[" + lightIndex + "].shadowType", lights[i]->getShadowType());
		PBRShader->setUniform1i("lights[" + lightIndex + "].spotShadowIndex", lights[i]->getSpotShadowIndex());
		PBRShader->setUniform1i("lights[" + lightIndex + "].omniShadowIndex", lights[i]->getOmniShadowIndex());
		PBRShader->setUniform1i("lights[" + lightIndex + "].directionalShadowIndex", lights[i]->getDirectionalShadowIndex());
		PBRShader->setUniform1f("lights[" + lightIndex + "].shadowStrength", lights[i]->getShadowStrength());
		PBRShader->setUniform1f("lights[" + lightIndex + "].bias", lights[i]->getShadowBias());
		PBRShader->setUniform1f("lights[" + lightIndex + "].farClip", lights[i]->getFarClip());
		// point light
		PBRShader->setUniform1f("lights[" + lightIndex + "].pointLightRadius", lights[i]->getPointLightRadius());
		// spot light
		PBRShader->setUniform1f("lights[" + lightIndex + "].spotLightFactor", lights[i]->getSpotLightGradient());
		PBRShader->setUniform1f("lights[" + lightIndex + "].spotLightCutoff", lights[i]->getSpotLightCutoff());
		PBRShader->setUniform1f("lights[" + lightIndex + "].spotLightDistance", lights[i]->getSpotLightDistance());
	}
    
    // depth map uniforms
	directionalShadow.bind(10);
	PBRShader->setUniform1i("directionalShadowMap", 10);
	glUniformMatrix4fv(PBRShader->getUniformLocation("directionalShadowMatrix"), directionalShadow.getShadowMatrix().size(), false, &directionalShadow.getShadowMatrix()[0][0][0]);

	spotShadow.bind(11);
	PBRShader->setUniform1i("spotShadowMap", 11);
	glUniformMatrix4fv(PBRShader->getUniformLocation("spotShadowMatrix"), spotShadow.getShadowMatrix().size(), false, &spotShadow.getShadowMatrix()[0][0][0]);

	omniShadow.bind(12);
	PBRShader->setUniform1i("omniShadowMap", 12);
}
예제 #5
0
파일: ofApp.cpp 프로젝트: aferriss/mdAtl
void ofApp::updateNormalMatrix()
{
    normalMatrix = mat4ToMat3(ofGetCurrentMatrix(OF_MATRIX_MODELVIEW));
    normalMatrix.invert();
    normalMatrix.transpose();
}
void ofxSpriteRenderer::Render()
{
	//printf("--------------RENDER--------------\n");
	for(ofxBaseCommands::iterator it = m_Commands.begin();it != m_Commands.end();it++)
	{
		ofxBaseCommand* item = *it;
		delete item;
	}
	m_Commands.clear();
	
	//unsigned long long time_start_build = ofGetSystemTime();
	sort(m_Sprites.begin(), m_Sprites.end(), QuadCompare);
	for(int i=0;i<m_Sprites.size();i++)
	{
		m_Sprites[i]->SetID(i);
	}
	//unsigned long long time_finish_sort = ofGetSystemTime();
	//printf("sort time =  %llu\n", time_finish_sort - time_start_build);
	bool is_custom_command = false;
	for(ofxBaseSprites::iterator it = m_Sprites.begin();it != m_Sprites.end();it++)
	{
		ofxBaseSprite* sprite = *it;
		if(!(sprite->GetOcclusion() == SPRITE_OCCLUSION_IN_SCREEN || sprite->GetOcclusion() == SPRITE_OCCLUSION_UNKNOWN) ||
			!sprite->IsVisible())
		{
			continue;
		}
		if(sprite->IsCustomRendered())
		{
			ofxBaseCommand* command = (ofxBaseCommand*)sprite;
			m_Commands.push_back(command);
			is_custom_command = true;
			continue;
		}
		ofxSpriteCommand* command;
		if(m_Commands.size() == 0 || is_custom_command)
		{
			command = new ofxSpriteCommand();
			command->SetShader(sprite->GetShader());
			command->SetTexture(sprite->GetTexture());
			bool push_success = command->PushSprite(sprite);
			assert(push_success);
			m_Commands.push_back(command);
			is_custom_command = false;
		}
		else
		{
			command = (ofxSpriteCommand*)m_Commands.back();
			bool push_success = command->PushSprite(sprite);
			if(command->GetShader() != sprite->GetShader() 
				|| command->GetTexture() != sprite->GetTexture() 
				|| !push_success)
			{
				command = new ofxSpriteCommand();
				command->SetShader(sprite->GetShader());
				command->SetTexture(sprite->GetTexture());
				push_success = command->PushSprite(sprite);
				m_Commands.push_back(command);
				assert(push_success);
			}
		}
	}
	//unsigned long long time_finish_build = ofGetSystemTime();
	//printf("build time =  %llu\n", time_finish_build - time_start_build);
#ifdef _DEBUG
	m_DrawnBatches = 0;
	m_DrawnVertices = 0;
	unsigned long long time_start_render = ofGetSystemTime();
#endif
	m_TransformMatrix = ofGetCurrentMatrix(OF_MATRIX_MODELVIEW)*ofGetCurrentMatrix(OF_MATRIX_PROJECTION);
	//m_Camera->begin();
	{
		glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
		glEnable(GL_BLEND);
		//glDisable(GL_DEPTH_TEST);// transparent isn't work well with depth test
		glDepthMask(GL_FALSE);
		for(ofxBaseCommands::iterator it = m_Commands.begin();it != m_Commands.end();it++)
		{
			ofxBaseCommand* cmd = *it;
			cmd->Render();
#ifdef _DEBUG
			m_DrawnBatches++;
			m_DrawnVertices += cmd->GetRenderedVertices();
#endif
		}
		//glEnable(GL_DEPTH_TEST);
		glDepthMask(GL_TRUE);
		glDisable(GL_BLEND);
	}
	//m_Camera->end();
#ifdef _DEBUG
	unsigned long long time_finish_render = ofGetSystemTime();
	m_RenderTimeMilisecond = time_finish_render - time_start_render;
#endif
}