OpenGL ES Shader 实现代码
一、顶点shader代码
const char vscode[] = \
"uniform highp mat4 mvpMatrix;\
attribute highp vec3 position;\
attribute highp vec2 texcoord; \
varying mediump vec2 vTexCoord;\
void main ()\
{\
gl_Position = (mvpMatrix * vec4(position.x, position.y, position.z, 1.0));\
vTexCoord.x = texcoord.x;\
vTexCoord.y = texcoord.y;\
} \n";
GLuint handle = glCreateShader(GL_VERTEX_SHADER);
GLuint codeSize = sizeof(vscode);
glShaderSource(handle,1,&vscode,(GLint*)&codeSize);
glCompileShader(handle);
GLint comResult = 0;
glGetShaderiv(handle, GL_COMPILE_STATUS, &comResult);
if ( comResult == 0 )
{
char logInfo[256]={0};
GLint bufSize;
GLsizei logLength;
glGetShaderInfoLog(handle,bufSize,&logLength,logInfo);
glDeleteShader(handle);
}
二、片段shader代码
const char fscode[] = \
"uniform sampler2D uTexSampler;\
varying mediump vec2 vTexCoord; \
void main ()\
{\
lowp vec4 color = texture2D (uTexSampler, vTexCoord);\
gl_FragColor = color;\
}\n";
GLuint handle = glCreateShader(GL_FRAGMENT_SHADER);
GLuint codeSize = sizeof(fscode);
glShaderSource(handle,1,&fscode,(GLint*)&codeSize);
glCompileShader(handle);
GLint comResult = 0;
glGetShaderiv(handle, GL_COMPILE_STATUS, &comResult);
if ( comResult == 0 )
{
char logInfo[256]={0};
GLint bufSize;
GLsizei logLength;
glGetShaderInfoLog(handle,bufSize,&logLength,logInfo);
glDeleteShader(handle);
}
三、Program代码
GLuint program = glCreateProgram();
glAttachShader(program,vhandle);
glAttachShader(program,fhandle);
glLinkProgram(program);
GLint linkResult = 0;
glGetProgramiv( program, GL_LINK_STATUS, &linkResult );
if(0 == linkResult)
;
GLint bufSize;
GLsizei logLength;
glGetProgramInfoLog(program,bufSize,&length,infoLog);
glDetachShader(program,vhandle);
glDetachShader(program,fhandle);
glDeleteProgram(program);
return 0;
}
四、生成
//生成并绑定纹理
GLuint nWidth = 256;
GLuint nHeight = 256;
char pBits[] = {...};
GLuint iTexID;
glGenTextures(1, &iTexID);
glBindTexture(GL_TEXTURE_2D, iTexID);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, nWidth, nHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, pBits);
glTexGenMipmap();
五、生成VBO、IBO
char pVertexBuffer[]={...};
GLuint uVertexSize = sizeof(pVertexBuffer);
GLuint uVboID;
glGenBuffers(1, &uVboID);
glBindBuffer(GL_ARRAY_BUFFER, uVboID);
glBufferData(GL_ARRAY_BUFFER, uVertexSize, pVertexBuffer, GL_STATIC_DRAW);
char pIndexBuffer[]={...};
GLuint uIndexSize = sizeof(pIndexBuffer);
GLuint uIboID;
glGenBuffers(1, &uIboID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, uIboID);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, uIndexSize, pIndexBuffer, GL_STATIC_DRAW);
六、使用逻辑
// 选择使用的program
glUseProgram(program);
// 设定顶点shader变量数值
GLfloat *mvpValue[16]={...};
GLint locMVP = glGetUniformLocation(program,"mvpMatrix");
glUniformMatrix4fv(locMVP,1,GL_FALSE,mvpValue);
//设定片段shader纹理
GLint locTex = glGetUniformLocation(program,"uTexSampler");
glUniform1i(locMVP,0);// 纹理单元0
//绑定vbo、ibo
glBindBuffer(GL_ARRAY_BUFFER, uVboID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, uiboID);
//设定顶点坐标数值
GLfloat *posValue[4]={...};
GLuint u16VertCnt = ...;
GLuint uIBOOffset = 0;
GLUint locPos = glGetAttribLocation(program,"position");
glVertexAttribPointer(locPos,4,GL_FLOAT,GL_FALSE,sizeof(GLfloat)*4,posValue);
//设定顶点纹理坐标
GLfloat *texCoordValue[2]={...};
GLUint locTexCoord = glGetAttribLocation(program,"texcoord");
glVertexAttribPointer(locTexCoord,2,GL_FLOAT,GL_FALSE,sizeof(GLfloat)*2, texCoordValue);
//绑定纹理
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, iTexID);
// 绘制
glDrawElements(GL_TRIANGLES, u16VertCnt, GL_UNSIGNED_SHORT, (void *)&uIBOOffset);
//解绑vbo、ibo
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);