OpenGL2.0着色器的封装

http://www.360doc.com/content/13/1231/14/110467_341496251.shtml

// 加载着色器角本代码
// Shader的类型:GL_VERTEX_SHADER,GL_FRAGMENT_SHADER
unsigned int LoadShader(unsigned int shaderType, const char* pSource)
{
	// 创建shader
	GLuint shader = glCreateShader(shaderType);
	if (shader) 
	{
		glShaderSource(shader, 1, &pSource, NULL);
		// 编译shader
		glCompileShader(shader);
		GLint compiled = 0;
		glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
		if (!compiled) 
		{
			// 如果编译失败,就打印编译日志
			GLint infoLen = 0;
			glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLen);
			if (infoLen)
			{
				char buf[500];
				glGetShaderInfoLog(shader, infoLen, NULL, buf);

				OUTPUT_DEBUG_MESSAGE(
					"compile shader error shaderType = %d, errorType = %d, errorMsg = %s",
					m_eShaderType, shaderType, buf);

				glDeleteShader(shader);
				shader = 0;
			}
		}
	}
	return shader;
}

// 创建着色器的方法
unsigned int CreateProgram(const char* szVSource, const char* szFSource)
{
	GLuint vertexShader = LoadShader(GL_VERTEX_SHADER, szVSource);		// 加载顶点着色器
	if (!vertexShader)
		return 0;

	GLuint pixelShader = LoadShader(GL_FRAGMENT_SHADER, szFSource);		// 加载片元着色器

	if (!pixelShader)
		return 0;
	// 创建着色器程序
	GLuint program = glCreateProgram();
	if (program) 
	{
		glAttachShader(program, vertexShader);		// 向程序中加入顶点着色器
		glAttachShader(program, pixelShader);		// 向程序中加入片元着色器
		glLinkProgram(program);
		GLint linkStatus = GL_FALSE;
		glGetProgramiv(program, GL_LINK_STATUS, &linkStatus);
		if (linkStatus != GL_TRUE)
		{
			OUTPUT_DEBUG_MESSAGE("create shaderProgram error shaderType = %d", m_eShaderType);
			glDeleteProgram(program);
			return 0;
		}
	}
	return program;
}

// 保存shader的变量或者说是程序的id
bool InitShader()
{
	if(!CreateShaderProgram())
		return false;

	// attach shader's program
	int nPosition = glGetAttribLocation(m_nProgram, "vPosition");
	int nTexcoord = glGetAttribLocation(m_nProgram, "vTexCoord");
	int nNormal = glGetAttribLocation(m_nProgram, "vNormal");
	int nMvpMatrix = glGetUniformLocation(m_nProgram, "MvpMatrix");
	int nTexture = glGetUniformLocation(m_nProgram, "Texture");
	int nColor = glGetUniformLocation(m_nProgram, "vColor");
	int nCameraPos = glGetUniformLocation(m_nProgram, "vCameraPos");
	int nLightPos = glGetUniformLocation(m_nProgram, "vLightPos");

	// 调用程序设置数据
	glVertexAttribPointer(nPosition, 3, GL_FLOAT, GL_FALSE, 0, pPointer);
	return true;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值