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;
}