コード例 #1
0
ファイル: GammaRamp.cpp プロジェクト: BruteSolutions/gltut
//Called to update the display.
//You should call glutSwapBuffers after all of your rendering to display what you rendered.
//If you need continuous updates of the screen, call glutPostRedisplay() at the end of the function.
void display()
{
	glClearColor(0.0f, 0.5f, 0.3f, 0.0f);
	glClear(GL_COLOR_BUFFER_BIT);

	glActiveTexture(GL_TEXTURE0 + g_gammaRampTextureUnit);
	glBindTexture(GL_TEXTURE_2D, g_textures[g_useGammaCorrect[0] ? 1 : 0]);
	glBindSampler(g_gammaRampTextureUnit, g_samplerObj);

	glBindVertexArray(g_vao);

	glUseProgram(g_noGammaProgram);
	glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

	glBindTexture(GL_TEXTURE_2D, g_textures[g_useGammaCorrect[1] ? 1 : 0]);

	glUseProgram(g_gammaProgram);
	glDrawArrays(GL_TRIANGLE_STRIP, 4, 4);

	glBindVertexArray(0);
	glUseProgram(0);

	glActiveTexture(GL_TEXTURE0 + g_gammaRampTextureUnit);
	glBindTexture(GL_TEXTURE_2D, 0);
	glBindSampler(g_gammaRampTextureUnit, 0);

	glutSwapBuffers();
}
void GraphicsSubsystem::drawPlane(const Plane &plane, const std::string &textureName)
{
	int planepr = shaders["plane"];
	glUseProgram(shaders["plane"]);

	glm::mat4 modelToWorld = plane.getModelToWorldMat();
	glm::mat3 normMatrix = glm::mat3(glm::transpose(glm::inverse(worldToCam * modelToWorld)));
	glUniformMatrix3fv(programUniforms[planepr]["normalModelToCameraMatrix"], 1, GL_FALSE, glm::value_ptr(normMatrix));

	glUniformMatrix4fv(programUniforms[planepr]["modelToWorldMatrix"], 1, GL_FALSE, glm::value_ptr(modelToWorld));
	glUniformMatrix4fv(programUniforms[planepr]["modelToLightToClipMatrix"], NUMBER_OF_LIGHTS, GL_FALSE, glm::value_ptr(modelLightWorldClip[0]));
	
	glm::vec2 textureScale = plane.getTextureScale();
	glUniform2f(programUniforms[planepr]["textureScale"], textureScale.x, textureScale.y);
	glUniform2f(programUniforms[planepr]["shadowTexSize"], windowSize.x, windowSize.y);

	glUniform1i(programUniforms[planepr]["colorTexture"], texUnits[textureName]);
	for (int i = 0; i < NUMBER_OF_LIGHTS; i++)
	{
		glActiveTexture(GL_TEXTURE0 + shadowTexUnit[i]);  
		glBindTexture(GL_TEXTURE_2D, shadowMapTextures[i]);
	}

	glActiveTexture(GL_TEXTURE0 + texUnits[textureName]);
	glBindTexture(GL_TEXTURE_2D, textures[textureName]);
	glBindSampler(texUnits[textureName], sampler);
	
	plane.draw();

	glBindSampler(texUnits[textureName], 0);
	glBindTexture(GL_TEXTURE_2D, 0);
	
	glUseProgram(0);
}
コード例 #3
0
GLUSboolean display(GLUSfloat time)
{
    glClearColor(0.75f, 0.75f, 1.0f, 1.0f);
    glClearDepth(1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    g_camTimer.Update(time);

    float cyclicAngle = g_camTimer.GetAlpha() * 6.28f;
    float hOffset = cosf(cyclicAngle) * 0.25f;
    float vOffset = sinf(cyclicAngle) * 0.25f;

    GLfloat modelViewMatrix[16];
    glusMatrix4x4LookAtf(modelViewMatrix ,
            hOffset, 1.0f, -64.0f,
            hOffset, -5.0f + vOffset, -44.0f,
            0.0f, 1.0f, 0.0f);

    glUseProgram(g_program.program);
    glUniformMatrix4fv(g_program.modelViewUnif, 1, GL_FALSE, modelViewMatrix);

    glActiveTexture(GL_TEXTURE0 + g_colorTexUnit);
    glBindTexture(GL_TEXTURE_2D, g_useMipmapTexture ? g_mipmapTestTexture : g_checkerTexture);
    glBindSampler(g_colorTexUnit, g_samplers[g_currSampler]);

    Mesh *mesh = g_drawCorridor ? g_pCorridor : g_pPlane;
    mesh->render("tex");

    glBindSampler(g_colorTexUnit, 0);
    glBindTexture(GL_TEXTURE_2D, 0);

    glUseProgram(0);

    return GLUS_TRUE;
}
void GraphicsSubsystem::drawBall(const Sphere &ball)
{
	GLuint ballpr = shaders["ball"];
	glUseProgram(ballpr);

	glm::mat4 modelToWorld = ball.getModelToWorldMat();
	glm::mat3 normWorldMatrix = glm::mat3(glm::transpose(glm::inverse(modelToWorld)));
	glm::mat3 normCamMatrix = glm::mat3(glm::transpose(glm::inverse(worldToCam * modelToWorld)));

	glUniformMatrix4fv(programUniforms[ballpr]["modelToWorldMatrix"], 1, GL_FALSE, glm::value_ptr(modelToWorld));
	glUniformMatrix3fv(programUniforms[ballpr]["normalModelToWorldMatrix"], 1, GL_FALSE, glm::value_ptr(normWorldMatrix));
	glUniformMatrix3fv(programUniforms[ballpr]["normalModelToCameraMatrix"], 1, GL_FALSE, glm::value_ptr(normCamMatrix));

	glm::mat4 worldToLightMatrix = glm::scale(glm::mat4(1.0), glm::vec3(IBLscale)); 
	glm::mat3 worldToLightITMatrix = glm::mat3(glm::transpose(glm::inverse(worldToLightMatrix)));
	glUniformMatrix4fv(programUniforms[ballpr]["worldToLightMatrix"], 1, GL_FALSE, glm::value_ptr(worldToLightMatrix));
	glUniformMatrix3fv(programUniforms[ballpr]["worldToLightITMatrix"], 1, GL_FALSE, glm::value_ptr(worldToLightITMatrix));

	glUniform3f(programUniforms[ballpr]["camPos"], camPos.x, camPos.y, camPos.z);

	glActiveTexture(GL_TEXTURE0 + texUnits["roomBall"]);  
	glBindTexture(GL_TEXTURE_CUBE_MAP, textures["roomBall"]);

	glActiveTexture(GL_TEXTURE0 + texUnits["ball"]);
	glBindTexture(GL_TEXTURE_2D, textures["ball"]);
	glBindSampler(texUnits["ball"], sampler);
	
	ball.draw();
	
	glBindSampler(texUnits["ball"], 0);
	glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
	glBindTexture(GL_TEXTURE_2D, 0);

	glUseProgram(0);
}
コード例 #5
0
	bool render()
	{
		glm::vec2 WindowSize(this->getWindowSize());

		glm::mat4 Projection = glm::perspective(glm::pi<float>() * 0.25f, WindowSize.x / WindowSize.y, 0.1f, 1000.0f);
		glm::mat4 Model = glm::mat4(1.0f);
		glm::mat4 MVP = Projection * this->view() * Model;

		glViewport(0, 0, static_cast<GLsizei>(WindowSize.x), static_cast<GLsizei>(WindowSize.y));
		glClearBufferfv(GL_COLOR, 0, &glm::vec4(1.0f, 0.5f, 0.0f, 1.0f)[0]);

		glUseProgram(ProgramName);
		glUniformMatrix4fv(UniformMVP, 1, GL_FALSE, &MVP[0][0]);
		glUniform1i(UniformDiffuseRGB, 0);
		glUniform1i(UniformDiffuseBGR, 1);

		glActiveTexture(GL_TEXTURE0);
		glBindTexture(GL_TEXTURE_2D, TextureName[texture::RGB]);
		glBindSampler(0, SamplerName);

		glActiveTexture(GL_TEXTURE1);
		glBindTexture(GL_TEXTURE_2D, TextureName[texture::BGR]);
		glBindSampler(1, SamplerName);

		glBindVertexArray(VertexArrayName);
		glDrawElementsInstancedBaseVertex(GL_TRIANGLES, ElementCount, GL_UNSIGNED_INT, nullptr, 1, 0);

		return true;
	}
コード例 #6
0
ファイル: Context.cpp プロジェクト: henry4k/sparkplug-gl
/// Sampler ///
void Context::bindSampler( int unit, const StrongRef<Sampler>& sampler )
{
	if(sampler)
		glBindSampler(unit, sampler->handle());
	else
		glBindSampler(unit, 0);
	m_Samplers[unit] = sampler;
}
コード例 #7
0
    virtual void bindMaterial(Material *m) override
    {
      material_ = m;
      glActiveTexture(GL_TEXTURE0+0);
      material_->bindTexture();
      glBindSampler(0, material_->textures_.front()->id_);

      glActiveTexture(GL_TEXTURE0+2);
      shadowTex_->bind();
      glBindSampler(2, shadowTex_->id_);

    }
コード例 #8
0
void init(void)
{
	glClearColor(0.3, 0.3, 0.3, 1);

	glGenVertexArrays(1, &vao_quad);
	glBindVertexArray(vao_quad);
#define	N	30
	GLfloat	vertices[4][4] = {
		{ -0.90, -0.90, 0, N }, 
		{ 0.90, -0.90, N, N },
		{ -0.90, 0.90, 0, 0 },
		{ 0.90, 0.90, N, 0 },
	};
	glGenBuffers(1, &buf_quad);
	glBindBuffer(GL_ARRAY_BUFFER, buf_quad);
	glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);


	GLuint h_prog = build_program_from_files("quad_tex_mipmap.vert", "quad_tex_mipmap.frag");

	glUseProgram(h_prog);
	glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*4, BUFFER_OFFSET(0));
	glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*4, BUFFER_OFFSET(sizeof(GLfloat)*2));
	glEnableVertexAttribArray(0);
	glEnableVertexAttribArray(1);

	glm::mat4	M = glm::rotate(glm::mat4(1.0f), -85.0f, glm::vec3(1.0f, 0.0f, 0.0f));
	glm::mat4	V = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -1.0f));
	glm::mat4	P = glm::perspective(45.0f, 1.0f, 0.1f, 5.0f);

	glUniformMatrix4fv(glGetUniformLocation(h_prog, "MVP"), 1, GL_FALSE, glm::value_ptr(P*V*M));
	glUniform4f(glGetUniformLocation(h_prog, "color"), 1, 1, .5, .5);
	glUniform1i(glGetUniformLocation(h_prog, "tex"), 4);

	glEnable(GL_CULL_FACE);

	load_textures();

	glGenSamplers(1, &sampler);
	glSamplerParameteri(sampler, GL_TEXTURE_WRAP_S, GL_REPEAT);
	glSamplerParameteri(sampler, GL_TEXTURE_WRAP_T, GL_REPEAT);
//	glSamplerParameteri(sampler, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
	glSamplerParameteri(sampler, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
//	glSamplerParameteri(sampler, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
//	glSamplerParameteri(sampler, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
//	glSamplerParameteri(sampler, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
//	glSamplerParameteri(sampler, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR);
	glSamplerParameteri(sampler, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);

	glBindSampler(3, sampler);
	glBindSampler(4, sampler);

}
コード例 #9
0
ファイル: Clouds.cpp プロジェクト: Wumpf/cloudyclouds
void Clouds::renderClouds(const Vector3& lightDir, const Matrix4& viewMatrix)
{
// render clouds
	//renderClouds(lightDir, view);
	renderingShader->useProgram();

	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo_cloudParticleRendering);
	glBindVertexArray(vao_cloudParticleBuffer_Read);

	// light settings
	glUniformMatrix4fv(renderingShaderUniformIndex_lightViewProjection, 1, false, lightViewProjection);
	glUniform4fv(renderingShaderUniformIndex_LightDistancePlane_norm, 1, lightDistancePlane_Norm);
	glUniform3fv(renderingShaderUniformIndex_LightDirection, 1, (-lightDir).transformNormal(viewMatrix));	// need direction TO light

	glBindSampler(1, linearSampler_noMipMaps);
	glBindSampler(2, linearSampler_noMipMaps);


	// textures
	glActiveTexture(GL_TEXTURE0);
	glBindTexture(GL_TEXTURE_2D, noiseTexture);	// noise is always on 0; the FOM textures are on 1 and 2
	glBindSampler(0, linearSampler_MipMaps);
	glActiveTexture(GL_TEXTURE1);
	glBindTexture(GL_TEXTURE_2D, fourierOpacityMap_Textures[0][0]);
	glActiveTexture(GL_TEXTURE2);
	glBindTexture(GL_TEXTURE_2D, fourierOpacityMap_Textures[0][1]);

	// blending
	glEnable(GL_BLEND);
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

		// buffers
	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo_cloudParticleRendering);
	glBindVertexArray(vao_cloudParticleBuffer_Read);

	glDrawElements(GL_POINTS, numParticlesRender, GL_UNSIGNED_SHORT, 0);

	// reset stuff
	glBindVertexArray(0);
	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
	glDisable(GL_BLEND);

	// reset textures
	glActiveTexture(GL_TEXTURE0);
	glBindTexture(GL_TEXTURE_2D, 0);
	glActiveTexture(GL_TEXTURE1);
	glBindTexture(GL_TEXTURE_2D, 0);
	glActiveTexture(GL_TEXTURE2);
	glBindTexture(GL_TEXTURE_2D, 0);
	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}
コード例 #10
0
////////////////////////////////////////////////////////////////////////////////
// SoftShadowsRenderer::initRendering()
////////////////////////////////////////////////////////////////////////////////
void SoftShadowsRenderer::initRendering()
{
    GLint depthBits;
    glGetIntegerv(GL_DEPTH_BITS, &depthBits);
    LOGI("depth bits = %d\n", depthBits);

    // Setup the eye's view parameters
    initCamera(
        NvCameraXformType::MAIN,
        nv::vec3f(-0.644995f, 0.614183f, 0.660632f) * 1.5f, // position
        nv::vec3f(0.0f, 0.0f, 0.0f));                       // look at point

    // Setup the light's view parameters
    initCamera(
        NvCameraXformType::SECONDARY,
        nv::vec3f(3.57088f, 6.989f, 5.19698f) * 1.5f, // position
        nv::vec3f(0.0f, 0.0f, 0.0f));                 // look at point

    // Generate the samplers
    glGenSamplers(5, m_samplers);
    CHECK_GL_ERROR();
    for (GLuint unit = 0; unit < NumTextureUnits; ++unit)
    {
        glBindSampler(unit, m_samplers[unit]);
    }

    // Create resources
    createShadowMap();
    createGeometry();
    createTextures();
    createShaders();

    // Set states that don't change
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);
    glDepthFunc(GL_LESS);
    glCullFace(GL_BACK);
    glDisable(GL_BLEND);

    glClearColor(
        m_backgroundColor.x,
        m_backgroundColor.y,
        m_backgroundColor.z,
        m_backgroundColor.w);
    glClearDepthf(1.0f);

    for (GLuint unit = 0; unit < NumTextureUnits; ++unit)
    {
        glBindSampler(unit, 0);
    }
}
コード例 #11
0
void display()
{
	// Compute the MVP (Model View Projection matrix)
	glm::mat4 Projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 1000.0f);
	glm::mat4 ViewTranslate = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -Window.TranlationCurrent.y));
	glm::mat4 ViewRotateX = glm::rotate(ViewTranslate, Window.RotationCurrent.y, glm::vec3(1.f, 0.f, 0.f));
	glm::mat4 View = glm::rotate(ViewRotateX, Window.RotationCurrent.x, glm::vec3(0.f, 1.f, 0.f));
	glm::mat4 Model = glm::mat4(1.0f);
	glm::mat4 MVP = Projection * View * Model;

	glViewport(0, 0, Window.Size.x, Window.Size.y);
	glClearBufferfv(GL_COLOR, 0, &glm::vec4(1.0f, 0.5f, 0.0f, 1.0f)[0]);

	// Bind the program for use
	glUseProgram(ProgramName);
	glUniformMatrix4fv(UniformMVP, 1, GL_FALSE, &MVP[0][0]);
	glUniform1i(UniformDiffuseA, 0);
	glUniform1i(UniformDiffuseB, 1);
	glUniform4f(UniformColor, 1.0f, 0.5f, 0.0f, 1.0f);

	glActiveTexture(GL_TEXTURE0);
	glBindTexture(GL_TEXTURE_2D, TextureName);
	glBindSampler(0, SamplerBName);

	glActiveTexture(GL_TEXTURE1);
	glBindTexture(GL_TEXTURE_2D, TextureName);
	glBindSampler(1, SamplerAName);

	glBindVertexArray(VertexArrayName);

	{
		fprintf(stdout, "Validate\n");

		glValidateProgram(ProgramName);

		GLint Result = GL_FALSE;
		glGetProgramiv(ProgramName, GL_VALIDATE_STATUS, &Result);

		int InfoLogLength;
		glGetProgramiv(ProgramName, GL_INFO_LOG_LENGTH, &InfoLogLength);
		std::vector<char> Buffer(std::max(InfoLogLength, int(1)));
		glGetProgramInfoLog(ProgramName, InfoLogLength, NULL, &Buffer[0]);
		fprintf(stdout, "%s\n", &Buffer[0]);
	}

	glDrawArraysInstanced(GL_TRIANGLES, 0, VertexCount, 1);

	glf::checkError("display");
	glf::swapBuffers();
}
コード例 #12
0
void display()
{
	glm::mat4 Projection = glm::ortho(-1.0f, 1.0f, 1.0f,-1.0f, 1.0f, -1.0f);
	glm::mat4 View = glm::mat4(1.0f);
	glm::mat4 Model = glm::mat4(1.0f);
	glm::mat4 MVP = Projection * View * Model;

	glProgramUniformMatrix4fv(ProgramName[LAYERING], UniformMVP[LAYERING], 1, GL_FALSE, &MVP[0][0]);
	glProgramUniformMatrix4fv(ProgramName[IMAGE_2D], UniformMVP[IMAGE_2D], 1, GL_FALSE, &MVP[0][0]);
	glProgramUniform1i(ProgramName[IMAGE_2D], UniformDiffuse, 0);

	// Pass 1
	{
		glBindSampler(0, 0);
		glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);
		glViewportIndexedf(0, 0, 0, float(FRAMEBUFFER_SIZE.x), float(FRAMEBUFFER_SIZE.y));

		glUseProgram(ProgramName[LAYERING]);

		glBindVertexArray(VertexArrayName[LAYERING]);
		glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, BufferName[BUFFER_ELEMENT]);
		glDrawElementsInstancedBaseVertex(GL_TRIANGLES, ElementCount, GL_UNSIGNED_SHORT, NULL, 1, 0);
	}

	// Pass 2
	{
		glBindFramebuffer(GL_FRAMEBUFFER, 0);

		glUseProgram(ProgramName[IMAGE_2D]);

		glActiveTexture(GL_TEXTURE0);
		glBindTexture(GL_TEXTURE_2D_ARRAY, TextureColorbufferName);
		glBindSampler(0, SamplerName);

		glBindVertexArray(VertexArrayName[IMAGE_2D]);
		glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, BufferName[BUFFER_ELEMENT]);

		for(int i = 0; i < 4; ++i)
		{
			glProgramUniform1i(ProgramName[IMAGE_2D], UniformLayer, i);
			glViewportIndexedfv(0, &glm::vec4(Viewport[i])[0]);
			glDrawElementsInstancedBaseVertex(GL_TRIANGLES, ElementCount, GL_UNSIGNED_SHORT, NULL, 1, 0);
		}
	}

	glf::checkError("display");
	glf::swapBuffers();
}
コード例 #13
0
	bool render()
	{
		glm::vec2 WindowSize(this->getWindowSize());

		{
			glBindBuffer(GL_UNIFORM_BUFFER, BufferName[buffer::TRANSFORM]);
			glm::mat4* Pointer = (glm::mat4*)glMapBufferRange(
				GL_UNIFORM_BUFFER, 0,	sizeof(glm::mat4),
				GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT);

			glm::mat4 Projection = glm::perspectiveFov(glm::pi<float>() * 0.25f, WindowSize.x, WindowSize.y, 0.1f, 100.0f);
			glm::mat4 Model = glm::mat4(1.0f);
			*Pointer = Projection * this->view() * Model;

			glUnmapBuffer(GL_UNIFORM_BUFFER);
		}

		// Render
		glClearTexImage(TextureName[texture::COLORBUFFER], 0, GL_RGBA, GL_FLOAT, &glm::vec4(1.0f, 0.5f, 0.0f, 1.0f)[0]);

		glViewportIndexedf(0, 0, 0, WindowSize.x * this->Supersampling, WindowSize.y * this->Supersampling);
		glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);
		glBindSampler(0, this->SamplerName[pipeline::RENDER]);
		glBindVertexArray(this->VertexArrayName[pipeline::RENDER]);

		glBindProgramPipeline(PipelineName[pipeline::RENDER]);
		glActiveTexture(GL_TEXTURE0);
		glBindTexture(GL_TEXTURE_2D, TextureName[texture::DIFFUSE]);
		glBindImageTexture(semantic::image::DIFFUSE, TextureName[texture::COLORBUFFER], 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA8);
		glBindBufferBase(GL_UNIFORM_BUFFER, semantic::uniform::TRANSFORM0, BufferName[buffer::TRANSFORM]);
		glBindBufferBase(GL_SHADER_STORAGE_BUFFER, semantic::storage::VERTEX, BufferName[buffer::VERTEX]);

		glDrawElementsInstancedBaseVertexBaseInstance(GL_TRIANGLES, ElementCount, GL_UNSIGNED_SHORT, 0, 1, 0, 0);

		// Splash
		glViewportIndexedf(0, 0, 0, WindowSize.x, WindowSize.y);
		glBindFramebuffer(GL_FRAMEBUFFER, 0);
		glBindSampler(0, this->SamplerName[pipeline::SPLASH]);
		glBindVertexArray(this->VertexArrayName[pipeline::SPLASH]);

		glBindProgramPipeline(PipelineName[pipeline::SPLASH]);
		glActiveTexture(GL_TEXTURE0);
		glBindTexture(GL_TEXTURE_2D, TextureName[texture::COLORBUFFER]);

		glDrawArraysInstancedBaseInstance(GL_TRIANGLES, 0, 3, 1, 0);

		return true;
	}
コード例 #14
0
	bool render()
	{
		glm::vec2 WindowSize(this->getWindowSize());

		{
			glBindBuffer(GL_UNIFORM_BUFFER, BufferName[buffer::TRANSFORM]);
			glm::mat4* Pointer = (glm::mat4*)glMapBufferRange(
				GL_UNIFORM_BUFFER, 0,	sizeof(glm::mat4),
				GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT);

			glm::mat4 Projection = glm::perspective(glm::pi<float>() * 0.25f, WindowSize.x / WindowSize.y, 0.1f, 100.0f);
			glm::mat4 Model = glm::mat4(1.0f);
		
			*Pointer = Projection * this->view() * Model;

			// Make sure the uniform buffer is uploaded
			glUnmapBuffer(GL_UNIFORM_BUFFER);
		}

		glViewportIndexedf(0, 0, 0, WindowSize.x, WindowSize.y);
		glClearBufferfv(GL_COLOR, 0, &glm::vec4(1.0f)[0]);

		glUseProgram(ProgramName);

		glActiveTexture(GL_TEXTURE0);
		glBindTexture(GL_TEXTURE_2D_ARRAY, TextureName);
		glBindSampler(0, SamplerName);
		glBindBufferBase(GL_UNIFORM_BUFFER, semantic::uniform::TRANSFORM0, BufferName[buffer::TRANSFORM]);

		glBindVertexArray(VertexArrayName);
		glDrawArraysInstancedBaseInstance(GL_TRIANGLES, 0, VertexCount, 15, 0);

		return true;
	}
コード例 #15
0
ファイル: SamplerCache.cpp プロジェクト: badkarma12/dolphin
void SamplerCache::SetSamplerState(int stage, const TexMode0& tm0, const TexMode1& tm1, bool custom_tex)
{
	// TODO: can this go somewhere else?
	if (m_last_max_anisotropy != g_ActiveConfig.iMaxAnisotropy)
	{
		m_last_max_anisotropy = g_ActiveConfig.iMaxAnisotropy;
		Clear();
	}

	Params params(tm0, tm1);

	// take equivalent forced linear when bForceFiltering
	if (g_ActiveConfig.bForceFiltering)
	{
		params.tm0.min_filter |= 0x4;
		params.tm0.mag_filter |= 0x1;
	}

	// custom textures may have higher resolution, so disable the max_lod
	if (custom_tex)
	{
		params.tm1.max_lod = 255;
	}

	// TODO: Should keep a circular buffer for each stage of recently used samplers.

	auto& active_sampler = m_active_samplers[stage];
	if (active_sampler.first != params || !active_sampler.second.sampler_id)
	{
		// Active sampler does not match parameters (or is invalid), bind the proper one.
		active_sampler.first = params;
		active_sampler.second = GetEntry(params);
		glBindSampler(stage, active_sampler.second.sampler_id);
	}
}
コード例 #16
0
	bool render()
	{
		glm::vec2 WindowSize(this->getWindowSize());

		static int FrameIndex = 0;

		// Bind shared objects
		glViewportIndexedf(0, 0, 0, WindowSize.x, WindowSize.y);
		glBindSampler(0, SamplerName);
		glBindVertexArray(VertexArrayName);

		// Update a colorbuffer bound as a framebuffer attachement and as a texture
		glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);
		glBindProgramPipeline(PipelineName[pipeline::UPDATE]);

		glActiveTexture(GL_TEXTURE0);
		glBindTexture(GL_TEXTURE_2D, FrameIndex ? TextureName[texture::COLORBUFFER] : TextureName[texture::DIFFUSE]);

		glMemoryBarrier(GL_TEXTURE_UPDATE_BARRIER_BIT | GL_TEXTURE_FETCH_BARRIER_BIT);
		glDrawArraysInstancedBaseInstance(GL_TRIANGLES, 0, VertexCount, 1, 0);

		// Blit to framebuffer
		glBindFramebuffer(GL_FRAMEBUFFER, 0);
		glBindProgramPipeline(PipelineName[pipeline::BLIT]);
	
		glActiveTexture(GL_TEXTURE0);
		glBindTexture(GL_TEXTURE_2D, TextureName[texture::COLORBUFFER]);

		glMemoryBarrier(GL_TEXTURE_UPDATE_BARRIER_BIT);
		glDrawArraysInstancedBaseInstance(GL_TRIANGLES, 0, VertexCount, 1, 0);

		FrameIndex = (FrameIndex + 1) % 256;

		return true;
	}
コード例 #17
0
	void renderFBO()
	{
		glm::mat4 Perspective = glm::perspective(glm::pi<float>() * 0.25f, float(FRAMEBUFFER_SIZE.x) / FRAMEBUFFER_SIZE.y, 0.1f, 100.0f);
		glm::mat4 Model = glm::scale(glm::mat4(1.0f), glm::vec3(1, -1, 1));
		glm::mat4 MVP = Perspective * this->view() * Model;

		glEnable(GL_DEPTH_TEST);

		glUseProgram(ProgramName[program::THROUGH]);
		glUniform1i(UniformDiffuse[program::THROUGH], 0);
		glUniformMatrix4fv(UniformMVP[program::THROUGH], 1, GL_FALSE, &MVP[0][0]);

		glViewport(0, 0, FRAMEBUFFER_SIZE.x, FRAMEBUFFER_SIZE.y);

		glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);
		float Depth(1.0f);
		glClearBufferfv(GL_DEPTH, 0, &Depth);
		glClearBufferfv(GL_COLOR, 0, &glm::vec4(1.0f, 0.5f, 0.0f, 1.0f)[0]);

		glActiveTexture(GL_TEXTURE0);
		glBindTexture(GL_TEXTURE_2D, TextureName[texture::DIFFUSE]);
		glBindSampler(0, SamplerName);
		glBindVertexArray(VertexArrayName);

		glDrawArraysInstanced(GL_TRIANGLES, 0, VertexCount, 5);

		glDisable(GL_DEPTH_TEST);

		this->checkError("renderFBO");
	}
コード例 #18
0
void renderFB(GLuint Texture2DName)
{
	glm::mat4 Perspective = glm::perspective(45.0f, float(Window.Size.x) / Window.Size.y, 0.1f, 100.0f);
	glm::mat4 ViewTranslate = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -Window.TranlationCurrent.y * 2.0));
	glm::mat4 ViewRotateX = glm::rotate(ViewTranslate, Window.RotationCurrent.y, glm::vec3(1.f, 0.f, 0.f));
	glm::mat4 View = glm::rotate(ViewRotateX, Window.RotationCurrent.x, glm::vec3(0.f, 1.f, 0.f));
	glm::mat4 Model = glm::mat4(1.0f);
	glm::mat4 MVP = Perspective * View * Model;
	
	glProgramUniformMatrix4fv(ProgramName[program::VERTEX], UniformMVP, 1, GL_FALSE, &MVP[0][0]);

	glViewportIndexedfv(0, &glm::vec4(0, 0, Window.Size.x, Window.Size.y)[0]);

	glBindFramebuffer(GL_FRAMEBUFFER, 0);
	glClearBufferfv(GL_COLOR, 0, &glm::vec4(0.0f, 0.0f, 0.0f, 1.0f)[0]);

	glBindMultiTextureEXT(GL_TEXTURE0, GL_TEXTURE_2D, Texture2DName);
	glBindSampler(0, SamplerName);

	glBindVertexArray(VertexArrayName);
	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, BufferName[buffer::ELEMENT]);
	glDrawElementsInstancedBaseVertex(GL_TRIANGLES, ElementCount, GL_UNSIGNED_SHORT, NULL, 1, 0);

	glf::checkError("renderFB");
}
コード例 #19
0
ファイル: GL3d3d.cpp プロジェクト: enigma-dev/enigma-dev
void graphics_state_flush_samplers() {
  static bool samplers_generated = false;
  static GLuint sampler_ids[8];
  if (!samplers_generated) {
    glGenSamplers(8, sampler_ids);
    samplers_generated = true;
  }

  for (size_t i = 0; i < 8; i++) {
    const auto sampler = samplers[i];

    const GLuint gt = get_texture_peer(sampler.texture);
    glActiveTexture(GL_TEXTURE0 + i);
    glBindTexture(GL_TEXTURE_2D, gt);

    if (gt == 0) continue; // texture doesn't exist skip updating the sampler

    const GLuint sampler_id = sampler_ids[i];
    glBindSampler(i, sampler_id);

    glSamplerParameteri(sampler_id, GL_TEXTURE_WRAP_R, sampler.wrapu?GL_REPEAT:GL_CLAMP_TO_EDGE);
    glSamplerParameteri(sampler_id, GL_TEXTURE_WRAP_S, sampler.wrapv?GL_REPEAT:GL_CLAMP_TO_EDGE);
    glSamplerParameteri(sampler_id, GL_TEXTURE_WRAP_T, sampler.wrapw?GL_REPEAT:GL_CLAMP_TO_EDGE);
    // Default to interpolation disabled, for some reason textures do that by default but not samplers.
    glSamplerParameteri(sampler_id, GL_TEXTURE_MIN_FILTER, sampler.interpolate?GL_LINEAR:GL_NEAREST);
    glSamplerParameteri(sampler_id, GL_TEXTURE_MAG_FILTER, sampler.interpolate?GL_LINEAR:GL_NEAREST);
  }
}
コード例 #20
0
ファイル: Material.cpp プロジェクト: asocha/Engine
///=====================================================
/// 
///=====================================================
void EngineAndrew::Material::Render(int vaoID, int indexBufferID, int numIndeces, GLenum indecesDataType /*= GL_UNSIGNED_INT*/) const{
	assert(m_programID != 0);
	assert(m_samplerID != 0);
	assert(!m_vertexAttributes.empty());

	glUseProgram(m_programID);
	GLCheckError();

	glBindVertexArray(vaoID);

	for (std::vector<IndexedTexture>::const_iterator textureIter = m_textures.cbegin(); textureIter != m_textures.cend(); ++textureIter){
		const Texture* texture = textureIter->m_texture;
		glActiveTexture(GL_TEXTURE0 + textureIter->m_textureIndex);
		glBindTexture(GL_TEXTURE_2D, texture->GetPlatformHandle());
		glBindSampler(textureIter->m_textureIndex, m_samplerID);
		GLCheckError();
	}
	
	for (Uniforms::const_iterator uniformIter = m_uniforms.cbegin(); uniformIter != m_uniforms.cend(); ++uniformIter){
		const Uniform * const& uniform = *uniformIter;
		uniform->BindData();
	}
	
	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferID);
	
	glDrawElements(m_baseShape, numIndeces, indecesDataType, nullptr);
	
	GLCheckError();
}
コード例 #21
0
ファイル: GLObjects.hpp プロジェクト: brunodea/cgat2
 void bind(GLenum target)
 {
     m_Target = target;
     glBindSampler(m_iSamplerUnit,m_iSamplerID);
     glActiveTexture(m_CurrentTexture);
     glBindTexture(m_Target,id());
 }
コード例 #22
0
ファイル: GLMeshRenderer.cpp プロジェクト: YoungBot/Engine
bool GLMeshRenderer::ProgramBindTexture(GLint textureID, unsigned int textureHandle)
{
	glActiveTexture(GL_TEXTURE0 + textureID);
	glBindTexture(GL_TEXTURE_2D, textureHandle);
	glBindSampler(textureID, m_material.m_sampler.m_samplerID);
	return true;
}
コード例 #23
0
void CTexture::SetFiltering(int a_tfMagnification, int a_tfMinification)
{
	glBindSampler(0, uiSampler);

	// Set magnification filter
	if(a_tfMagnification == TEXTURE_FILTER_MAG_NEAREST)
		glSamplerParameteri(uiSampler, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
	else if(a_tfMagnification == TEXTURE_FILTER_MAG_BILINEAR)
		glSamplerParameteri(uiSampler, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

	// Set minification filter
	if(a_tfMinification == TEXTURE_FILTER_MIN_NEAREST)
		glSamplerParameteri(uiSampler, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
	else if(a_tfMinification == TEXTURE_FILTER_MIN_BILINEAR)
		glSamplerParameteri(uiSampler, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
	else if(a_tfMinification == TEXTURE_FILTER_MIN_NEAREST_MIPMAP)
		glSamplerParameteri(uiSampler, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
	else if(a_tfMinification == TEXTURE_FILTER_MIN_BILINEAR_MIPMAP)
		glSamplerParameteri(uiSampler, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
	else if(a_tfMinification == TEXTURE_FILTER_MIN_TRILINEAR)
		glSamplerParameteri(uiSampler, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);

	tfMinification = a_tfMinification;
	tfMagnification = a_tfMagnification;
}
コード例 #24
0
ファイル: Node.cpp プロジェクト: lubosz/GL3EngineEZR
void Node::Render(GLint texLoc, GLint matLoc)
{
	transform_global = transform_local;

	if (m_Mesh != 0 && m_Texture != 0)
	{
		//m_Shader->BindShader();
		glUniformMatrix4fv(matLoc, 1, GL_FALSE, glm::gtc::type_ptr::value_ptr(transform_global));

		glUniform1i(texLoc, m_Texture->getUnit());
		CheckOpenGLError("passing uniform in node");

		glActiveTexture(GL_TEXTURE0 + m_Texture->getUnit());
		glBindTexture(GL_TEXTURE_2D, m_Texture->getID());
		glBindSampler(m_Texture->getUnit(), m_Texture->getSampler());
		CheckOpenGLError("binding texture in node");

		m_Mesh->draw();

		glBindTexture(GL_TEXTURE_2D, 0);

		//m_Shader->UnBindShader();
	}
	for (GLuint i = 0; i < m_children.size(); i++)
	{
		m_children[i]->Render(texLoc, matLoc, transform_global);
		CheckOpenGLError("render children in node");
	}

}
コード例 #25
0
	bool render()
	{
		glm::vec2 WindowSize(this->getWindowSize());
		glViewportIndexedf(0, 0, 0, WindowSize.x, WindowSize.y);

		glBindVertexArray(this->VertexArrayName);
		glBindSampler(0, this->SamplerName);

		// Render
		glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);
		glClearBufferfv(GL_COLOR, 0, &glm::vec4(1.0f, 0.5f, 0.0f, 1.0f)[0]);

		glBindProgramPipeline(PipelineName[pipeline::RENDER]);
		glActiveTexture(GL_TEXTURE0);
		glBindTexture(GL_TEXTURE_2D, TextureName[texture::DIFFUSE]);
		glBindImageTexture(semantic::image::DIFFUSE, TextureName[texture::COLORBUFFER], 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA8);

		glDrawArraysInstancedBaseInstance(GL_TRIANGLES, 0, 3, 1, 0);

		// Splash
		glBindFramebuffer(GL_FRAMEBUFFER, 0);

		glBindProgramPipeline(PipelineName[pipeline::SPLASH]);
		glActiveTexture(GL_TEXTURE0);
		glBindTexture(GL_TEXTURE_2D, TextureName[texture::COLORBUFFER]);

		glDrawArraysInstancedBaseInstance(GL_TRIANGLES, 0, 3, 1, 0);

		return true;
	}
コード例 #26
0
	bool render()
	{
		glm::vec2 WindowSize(this->getWindowSize());

		{
			glBindBuffer(GL_UNIFORM_BUFFER, BufferName[buffer::TRANSFORM]);
			glm::mat4* Pointer = (glm::mat4*)glMapBufferRange(
				GL_UNIFORM_BUFFER, 0, sizeof(glm::mat4),
				GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT);

			//glm::mat4 Projection = glm::perspectiveFov(glm::pi<float>() * 0.25f, 640.f, 480.f, 0.1f, 100.0f);
			glm::mat4 Projection = glm::perspective(glm::pi<float>() * 0.25f, WindowSize.x / WindowSize.y, 0.1f, 100.0f);
			glm::mat4 Model = glm::mat4(1.0f);
		
			*Pointer = Projection * this->view() * Model;

			// Make sure the uniform buffer is uploaded
			glUnmapBuffer(GL_UNIFORM_BUFFER);
		}

		glBindFramebuffer(GL_FRAMEBUFFER, 0);
		glBindProgramPipeline(PipelineName[pipeline::SPLASH]);
		glActiveTexture(GL_TEXTURE0);
		glBindVertexArray(VertexArrayName);
		glBindTexture(GL_TEXTURE_2D, TextureName[texture::DIFFUSE]);
		glBindSampler(0, SamplerName);

		glDrawArraysInstancedBaseInstance(GL_TRIANGLES, 0, 3, 1, 0);

		return true;
	}
コード例 #27
0
void display()
{
	// Compute the MVP (Model View Projection matrix)
	glm::mat4 Projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.0f);
	glm::mat4 ViewTranslate = glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -Window.TranlationCurrent.y));
	glm::mat4 ViewRotateX = glm::rotate(ViewTranslate, Window.RotationCurrent.y, glm::vec3(1.f, 0.f, 0.f));
	glm::mat4 View = glm::rotate(ViewRotateX, Window.RotationCurrent.x, glm::vec3(0.f, 1.f, 0.f));
	glm::mat4 Model = glm::mat4(1.0f);
	glm::mat4 MVP = Projection * View * Model;

	glViewport(0, 0, Window.Size.x, Window.Size.y);
	glClearBufferfv(GL_COLOR, 0, &glm::vec4(1.0f, 0.5f, 0.0f, 1.0f)[0]);

	// Bind the program for use
	glUseProgram(ProgramName);
	glUniformMatrix4fv(UniformMVP, 1, GL_FALSE, &MVP[0][0]);
	glUniform1i(UniformDiffuse, 0);

	glActiveTexture(GL_TEXTURE0);
	glBindTexture(GL_TEXTURE_2D_ARRAY, Texture2DArrayName);
	glBindSampler(0, SamplerName);

	glBindVertexArray(VertexArrayName);
	glDrawArraysInstanced(GL_TRIANGLES, 0, VertexCount, 2);

	glf::checkError("display");
	glf::swapBuffers();
}
コード例 #28
0
void OpenGLEngine::EnableSamplers (Shader const* shader, GLuint program)
{
	auto const samplers = shader->GetData (SamplerState::shaderLookUp);
	for (auto sampler = samplers.begin (); sampler != samplers.end (); sampler ++)
	{
		if (sampler->object)
		{
			std::shared_ptr<OGLSamplerState> oglSampler = std::static_pointer_cast<OGLSamplerState> (Bind (sampler->object));

			if (oglSampler)
			{
				auto location = sampler->bindPoint;
				int unit = m_TextureUnitMap.AskConnectionUnit (program, location);
				glBindSampler (unit, oglSampler->GetOGLDrawObject());
			}
			else
			{
				fprintf (stderr, "The enable samplers method in OpenGLEngine failed, because the binding of the object failed.\n");
			}
		}
		else
		{
			fprintf (stderr, "The enable samplers method in OpenGLEngine failed, because the object in the buffer is null.\n");
		}
	}
}
コード例 #29
0
void ReplayRenderWidget::paintGL()
{
   // Set up some needed GL state
   glColorMaski(0, GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
   glDisablei(GL_BLEND, 0);
   glDisable(GL_DEPTH_TEST);
   glDisable(GL_STENCIL_TEST);
   glDisable(GL_SCISSOR_TEST);
   glDisable(GL_CULL_FACE);

   // Clear screen
   glClearColor(0.6f, 0.2f, 0.2f, 1.0f);
   glClear(GL_COLOR_BUFFER_BIT);

   // Draw displays

   // Setup screen draw shader
   glBindVertexArray(mVertArray);
   glBindVertexBuffer(0, mVertBuffer, 0, 4 * sizeof(GLfloat));
   glBindProgramPipeline(mPipeline);

   // Draw screen quad
   glBindSampler(0, mSampler);
   glBindTextureUnit(0, mTvBuffer);

   glDrawArrays(GL_TRIANGLES, 0, 6);
}
コード例 #30
0
ファイル: Node.cpp プロジェクト: bagobor/GL3EngineEZR
void Node::Render(GLint texLoc, GLint matLoc, GLint normalMatLoc, glm::mat4 viewMat)
{
	transform_global = transform_local;

	if (m_Mesh != 0 && m_Texture != 0)
	{
		glm::mat3 normalMatrix(viewMat * transform_global);
		glm::inverseTranspose(normalMatrix);
		glUniformMatrix3fv(normalMatLoc, 1, GL_FALSE, glm::gtc::type_ptr::value_ptr(normalMatrix));
		CheckOpenGLError("passing normalMat in root node");

		glUniformMatrix4fv(matLoc, 1, GL_FALSE, glm::gtc::type_ptr::value_ptr(transform_global));

		glUniform1i(texLoc, m_Texture->getUnit());
		CheckOpenGLError("passing uniforms in root node");

		glActiveTexture(GL_TEXTURE0 + m_Texture->getUnit());
		glBindTexture(GL_TEXTURE_2D, m_Texture->getID());
		glBindSampler(m_Texture->getUnit(), m_Texture->getSampler());
		CheckOpenGLError("binding texture in root node");

		m_Mesh->draw();

		glBindTexture(GL_TEXTURE_2D, 0);
	}
	for (GLuint i = 0; i < m_children.size(); i++)
	{
		m_children[i]->Render(texLoc, matLoc, transform_global, normalMatLoc, viewMat);
		CheckOpenGLError("render children in node");
	}

}