Beispiel #1
0
void ShaderImpl::initialize(CL_GraphicContext &p_gc)
{
	G_ASSERT(!m_initialized);

	CL_ResourceManager *resMgr = Gfx::Stage::getResourceManager();

	m_program = CL_ProgramObject(p_gc);

	// load vertex shader
	const CL_String &vertShaderName = m_parent->getVertexShaderResourceName();
	m_vertShader = CL_ShaderObject::load(p_gc, vertShaderName, resMgr);
	m_program.attach(m_vertShader);

	// load fragment shader
	const CL_String &fragShaderName = m_parent->getFragmentShaderResourceName();
	m_fragShader = CL_ShaderObject::load(p_gc, fragShaderName, resMgr);
	m_program.attach(m_fragShader);

	// bind common attributes
	m_program.bind_attribute_location(CL_PRIARR_VERTS, "Position");
	m_program.bind_attribute_location(CL_PRIARR_COLORS, "Color0");
	m_program.bind_attribute_location(CL_PRIARR_TEXCOORDS, "TexCoord0");

	// link the program
	if (!m_program.link()) {
		m_program.detach(m_vertShader);
		m_program.detach(m_fragShader);

		throw CL_Exception(
				cl_format(
						"error linking shader %1, %2: %3",
						vertShaderName, fragShaderName,
						m_program.get_info_log()
				)
		);
	}

	// build frame buffer
	m_frameBuffer = CL_FrameBuffer(p_gc);

	// build quad
	m_quad = CL_PrimitivesArray(p_gc);
	m_quad.set_attributes(CL_PRIARR_VERTS, m_quadVerts);
	m_quad.set_attributes(CL_PRIARR_COLORS, QUAD_COLORS);
	m_quad.set_attributes(CL_PRIARR_TEXCOORDS, QUAD_TEX_COORDS);

	m_initialized = true;
}
Beispiel #2
0
void ShaderImpl::destroy()
{
	G_ASSERT(m_initialized);

	m_quad = CL_PrimitivesArray();
	m_frameBuffer = CL_FrameBuffer();

	m_program.detach(m_vertShader);
	m_program.detach(m_fragShader);

	m_vertShader = CL_ShaderObject();
	m_fragShader = CL_ShaderObject();

	m_program = CL_ProgramObject();

	m_initialized = false;
}