OpenGL ES Shader 实现代码

来源:互联网 发布:mac os x启动盘制作 编辑:程序博客网 时间:2024/05/08 09:43

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";//创建shaderGLuint 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";//创建shaderGLuint 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){    char logInfo[256]={0};    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);

六、使用逻辑

// 选择使用的programglUseProgram(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、iboglBindBuffer(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、iboglBindBuffer(GL_ARRAY_BUFFER, 0);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
0 0
原创粉丝点击