OpenGL ES Shader 实现代码

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

//创建shader
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";

//创建shader
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)
{
    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);

六、使用逻辑

// 选择使用的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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值