示例#1
0
bool RenderManager::DrawMesh(int meshID)
{
	Mesh* m = Mesh::GetMeshPointer(meshID);

	if (m != NULL) {
		Material mat = m->GetMaterial();
		UniformLocations uniforms = mat.GetUniforms();
		mat.Apply();

		//  Build the modelview matrix for the mesh
		GameObject* g = m->GetParentPointer();

		BuildModelViewMatrix(*g);
		
		//  Find the uniform locations for this program and put relevant data into said locations
		SetUniforms(uniforms);

		//  Bind the VAO and draw the array
		glBindVertexArray(VAOMap[meshID]);

		glDrawElements(GL_TRIANGLES, m->GetNumberOfVerts(), GL_UNSIGNED_INT, (void*)0);

		//  unbind our shaders and arrays
		glBindVertexArray(0);
		glUseProgram(0);
		return true;
	} else {
		//  If the mesh pointer is NULL then retrun false so we know to remove it from the renderlist
		return false;
	}
}
示例#2
0
//.......................................................................................
void Object::RenderVertices()
{
	if (m_bInitializedGPU)
	{
		static GLuint aPos = (m_vertexFlags & VERTEX_POSITION ? m_pShaderProgram->GetAttribute("attributePosition") : -1);
		static GLuint aNorm = (m_vertexFlags & VERTEX_NORMAL ? m_pShaderProgram->GetAttribute("attributeNormal") : -1);
		static GLuint aTexCoord = (m_vertexFlags & VERTEX_TEXCOORD ? m_pShaderProgram->GetAttribute("attributeTexCoord") : -1);

		glUseProgram(m_pShaderProgram->ProgramID());

		SetUniforms();

		glBindVertexArray(m_vaoObject);

		// bind vertex attributes
		if (m_vertexFlags & VERTEX_POSITION)	glEnableVertexAttribArray(aPos);
		if (m_vertexFlags & VERTEX_NORMAL)		glEnableVertexAttribArray(aNorm);
		if (m_vertexFlags & VERTEX_TEXCOORD)	glEnableVertexAttribArray(aTexCoord);

		glPointSize(1.0f);
		glDrawArrays(GL_POINTS, 0, m_nVertices);

	}


} // end Object::RenderVertices()
示例#3
0
void MeshActor::Render()
{
	glUseProgram(shaderProgram);
	FreeBuffers();
	SetUniforms();
	SetBufferData();
	DrawBuffers();
	CleanUp();
	FreeBuffers();
}
示例#4
0
bool Shader::Compile()
{
	compiled = false;
	char buf[256];
	int flag = 0;

	fragmentID = glCreateShader(GL_FRAGMENT_SHADER);
	vertexID = glCreateShader(GL_VERTEX_SHADER);

	const GLchar* vertexPtr = this->vertexSource.c_str();
	const GLchar* fragPtr = this->fragmentSource.c_str();

	glShaderSource(vertexID, 1, &vertexPtr, 0);
	glShaderSource(fragmentID, 1, &fragPtr, 0);

	memset((void*)errorLog, 0, sizeof(char) * 1024);

	glID = glCreateProgram();

	sprintf(buf, "VertexShader:\n");
	strncat(errorLog, buf, strlen(buf));

	glCompileShader(vertexID);
	glGetShaderInfoLog(vertexID, 256, NULL, buf);
	strncat(errorLog, buf, 256);
	glGetShaderiv(vertexID, GL_COMPILE_STATUS, &flag);
	if (!flag)
		return false;

	sprintf(buf, "FragmentShader:\n");
	strncat(errorLog, buf, strlen(buf));
	
	glCompileShader(fragmentID);
	glGetShaderInfoLog(fragmentID, 256, NULL, buf);
	strncat(errorLog, buf, 256);
	glGetShaderiv(fragmentID, GL_COMPILE_STATUS, &flag);
	if (!flag)
		return false;

	sprintf(buf, "Link:\n");
	strncat(errorLog, buf, strlen(buf));

	glAttachShader(glID, vertexID);
	glAttachShader(glID, fragmentID);
	glLinkProgram(glID);
	glGetProgramInfoLog(glID, 256, NULL, buf);	
	strncat(errorLog, buf, 256);
	glGetProgramiv(glID, GL_LINK_STATUS, &flag);
	if (!flag)
		return false;
	SetUniforms();
	compiled = true;
	return true;
}
示例#5
0
void RenderManager::DrawTerrain()
{
	float xmul = 0;
	float ymul = 0;

	Vector2 b = terrainManager->GetBase(0, 0);
	Vector2 b2 = terrainManager->GetBase(1, 1);
	float dif = b.u - b2.u;


	for (int i = 0; i < terrainManager->GetSize(); i++) {

		for (int j = 0; j < terrainManager->GetSize(); j++) {
			Material mat = terrainManager->GetMaterial(i, j);
			UniformLocations uniforms = mat.GetUniforms();
			mat.Apply();

			xmul = terrainManager->GetBase(i, j).u;
			ymul = terrainManager->GetBase(i, j).v;

			GameObject base;
			base.SetLocation(xmul, 0.0f, ymul);

			//  Build the modelview matrix for the mesh
			BuildModelViewMatrix(base);

			//  Find the uniform locations for this program and put relevant data into said locations
			SetUniforms(uniforms);	
			glUniform1f(uniforms.XMulFactor, xmul);
			glUniform1f(uniforms.YMulFactor, ymul);


			//  Bind the VAO and draw the array
			glBindVertexArray(terrain);

			glPatchParameteri(GL_PATCH_VERTICES, 3);
			glDrawElements(GL_PATCHES, terrainManager->GetTerrainMesh().GetIndexLength(), GL_UNSIGNED_INT, (void*)0);

			//  unbind our shaders and arrays
			glBindVertexArray(0);
			glUseProgram(0);

		}

	}
}
示例#6
0
void DrawScene()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPatchParameteri(GL_PATCH_VERTICES, 4);

    glUniform4f(u("Color"), 1.3f, 1.3f, 1.3f, 1.0f);
    glBindVertexArray(Scene.StatueVao);
    glDrawArrays(GL_PATCHES, 0, Scene.StatueVertexCount);

    if (CurrentProgram() == Scene.OffscreenProgram) {
        glUseProgram(Scene.FloorProgram);
        SetUniforms();
    }

    glUniform4f(u("Color"), 0.0f/255.0f,165.0f/255.0f,211.0f/255.0f, 1.0f);
    glBindVertexArray(Scene.FloorVao);
    glVertexAttrib3f(NormalSlot, 0, -1, 0);
    glDrawElements(GL_PATCHES, Scene.FloorIndexCount, GL_UNSIGNED_INT, 0);
}
示例#7
0
//.......................................................................................
void Object::RenderIndices()
{
	static GLuint aPos = (m_vertexFlags & VERTEX_POSITION ? m_pShaderProgram->GetAttribute("attributePosition") : -1);
	static GLuint aNorm = (m_vertexFlags & VERTEX_NORMAL ? m_pShaderProgram->GetAttribute("attributeNormal") : -1);
	static GLuint aTexCoord = (m_vertexFlags & VERTEX_TEXCOORD ? m_pShaderProgram->GetAttribute("attributeTexCoord") : -1);

	glUseProgram(m_pShaderProgram->ProgramID());

	SetUniforms();

	glBindVertexArray(m_vaoObject);

	// bind vertex attributes
	if (m_vertexFlags & VERTEX_POSITION)	glEnableVertexAttribArray(aPos);
	if (m_vertexFlags & VERTEX_NORMAL)		glEnableVertexAttribArray(aNorm);
	if (m_vertexFlags & VERTEX_TEXCOORD)	glEnableVertexAttribArray(aTexCoord);

	glDrawElements(GL_TRIANGLES, m_nIndices, GL_UNSIGNED_INT, (GLvoid *)0);


} // end Object::Render()
示例#8
0
	static void Render(const Model& a_model)
	{
		// Set uniform values
		SetUniforms();
		glUniformMatrix4fv(sg_modelLocation, 1, false, glm::value_ptr(a_model.modelMatrix));
		glUniform4fv(sg_diffuseColorLocation, 1, &(a_model.texture.diffuseColor[0]));
		glUniform4fv(sg_specularColorLocation, 1, &(a_model.texture.specularColor[0]));
		if (GL_TRUE == glIsTexture(a_model.texture.imageID))
		{
			glUniform1ui(sg_hasTextureLocation, GL_TRUE);
			glActiveTexture(GL_TEXTURE0);
			glBindTexture(GL_TEXTURE_2D, a_model.texture.imageID);
		}
		else
		{
			glUniform1ui(sg_hasTextureLocation, GL_FALSE);
		}

		// draw triangles
		glBindVertexArray(a_model.mesh.vertexArrayID);
		glDrawElements(GL_TRIANGLES, a_model.mesh.indexCount, GL_UNSIGNED_INT, 0);
		glBindVertexArray(0);
	}
示例#9
0
void RenderManager::DrawSkyBox()
{
	Mesh* m = Mesh::GetMeshPointer(sky);

	Material mat = m->GetMaterial();
	UniformLocations uniforms = mat.GetUniforms();
	mat.Apply();

	//  Build the modelview matrix for the mesh
	BuildSkyBoxViewMatrix(*activeCamera->GetParent());

	//  Find the uniform locations for this program and put relevant data into said locations
	SetUniforms(uniforms);

	//  Bind the VAO and draw the array
	glBindVertexArray(skyBox);
	glDisable(GL_DEPTH_TEST);
	glDrawElements(GL_TRIANGLES,  m->GetNumberOfVerts(), GL_UNSIGNED_INT, (void*)0);
	glEnable(GL_DEPTH_TEST);

	//  unbind our shaders and arrays
	glBindVertexArray(0);
	glUseProgram(0);
}
示例#10
0
void PezRender()
{
    glGetError();

    // Pass 1: draw into offscreen FBO
    if (ShowAO || ComputeAO)
    {
        glUseProgram(Scene.OffscreenProgram);
        SetUniforms();
        glBindFramebuffer(GL_FRAMEBUFFER, Scene.Surfaces.FboHandle);
        GLenum renderTargets[3] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2};
        glDrawBuffers(3, &renderTargets[0]);
        DrawScene();
    }

    pezCheck(glGetError() == GL_NO_ERROR, "OpenGL error.\n");

    // Read the offscreen buffers into CPU memory
    if (ComputeAO) 
    {
        ComputeAO = 0;
        PezConfig cfg = PezGetConfig();

        static float* PositionData = (float*) malloc(sizeof(float) * 3 * cfg.Width * cfg.Height);
        glReadBuffer(GL_COLOR_ATTACHMENT0 + FboDesc::Positions);
        glReadPixels(0, 0, cfg.Width, cfg.Height, GL_RGB, GL_FLOAT, PositionData);

        static float* NormalData = (float*) malloc(sizeof(float) * 3 * cfg.Width * cfg.Height);
        glReadBuffer(GL_COLOR_ATTACHMENT0 + FboDesc::Normals);
        glReadPixels(0, 0, cfg.Width, cfg.Height, GL_RGB, GL_FLOAT, NormalData);

        static float* ColorData = (float*) malloc(sizeof(float) * 3 * cfg.Width * cfg.Height);
        glReadBuffer(GL_COLOR_ATTACHMENT0 + FboDesc::Colors);
        glReadPixels(0, 0, cfg.Width, cfg.Height, GL_RGB, GL_FLOAT, ColorData);

        static float* CompositeData = (float*) malloc(sizeof(float) * 4 * cfg.Width * cfg.Height);

        float* pPosition = PositionData;
        float* pNormal = NormalData;
        float* pColor = ColorData;
        float* pComposite = CompositeData;
        for (int x = 0; x < cfg.Width; ++x) {
            for (int y = 0; y < cfg.Height; ++y) {
                
                AO_MaxDist = 0.025f;
                AO_NumPoints = 16;

                if (pColor[0] > 0.0f || pColor[1] > 0.0f || pColor[2] > 0.0f) {
                    float occlusion = 0.5f;
                    PtcGetNearestPointsData(Scene.PointCloud, pPosition, pNormal, AO_MaxDist, AO_NumPoints, &occlusion);
                    occlusion = 1.0f - occlusion;
                    pComposite[0] = pColor[0] * occlusion;
                    pComposite[1] = pColor[1] * occlusion;
                    pComposite[2] = pColor[2] * occlusion;
                    pComposite[3] = 1.0f;
                } else {
                    pComposite[0] = 0;
                    pComposite[1] = 0;
                    pComposite[2] = 0;
                    pComposite[3] = 0;
                }

                pPosition += 3;
                pNormal += 3;
                pColor += 3;
                pComposite += 4;
            }
        }

        pezCheck(glGetError() == GL_NO_ERROR, "OpenGL error.\n");
 
        glBindTexture(GL_TEXTURE_2D, Scene.CompositeTexture);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, cfg.Width, cfg.Height, GL_FALSE, GL_RGBA, GL_FLOAT, CompositeData);

        pezCheck(glGetError() == GL_NO_ERROR, "OpenGL error.\n");
        glBindFramebuffer(GL_FRAMEBUFFER, 0);
    }

    glBindFramebuffer(GL_FRAMEBUFFER, 0);
    GLenum renderTargets[3] = {GL_BACK_LEFT, GL_NONE, GL_NONE};
    glDrawBuffers(3, &renderTargets[0]);

    pezCheck(glGetError() == GL_NO_ERROR, "OpenGL error.\n");

    // Draw into backbuffer
    if (ShowAO) {
        glBindTexture(GL_TEXTURE_2D, Scene.CompositeTexture);
        glUseProgram(Scene.QuadProgram);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glBindVertexArray(Scene.QuadVao);
        glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
    } else {
        glUseProgram(Scene.DisplayProgram);
        SetUniforms();
        DrawScene();
    }

    pezCheck(glGetError() == GL_NO_ERROR, "OpenGL error.\n");
    glUseProgram(0);
    glBindVertexArray(0);
    TwDraw();
    glGetError();
}
示例#11
0
//---------------------------------------------------------------------------
void Material::ActivateMaterial()
{
	BindTextures();
	UseProgram();
	SetUniforms();
}