1、定义传入着色器的顶点数据及索引
//传入结构体 typedef struct { float Position[3]; float TexCoord[2]; } Vertex; //顶点数据 const Vertex Vertices[] = { {{1, -1, 0}, {1, 1}}, {{1, 1, 0},{1, 0}}, {{-1, 1, 0}, {0, 0}}, {{-1, -1, 0},{0, 1}}, }; //顶点索引 const GLubyte Indices[] = { 0, 1, 2, 2, 3, 0 };
2、生成图片纹理并获得其索引 方法
+ (GLuint)setupTexture:(UIImage *)pImage { CGImageRef spriteImage = pImage.CGImage; if (!spriteImage) { NSLog(@"Failed to load image "); exit(1); } size_t width = CGImageGetWidth(spriteImage); size_t height = CGImageGetHeight(spriteImage); GLubyte * spriteData = (GLubyte *) calloc(width*height*4, sizeof(GLubyte)); CGContextRef spriteContext = CGBitmapContextCreate(spriteData, width, height, 8, width*4, CGImageGetColorSpace(spriteImage), kCGImageAlphaPremultipliedLast); CGContextDrawImage(spriteContext, CGRectMake(0, 0, width, height), spriteImage); CGContextRelease(spriteContext); GLuint texName; //生成纹理数 glGenTextures(1, &texName); glBindTexture(GL_TEXTURE_2D, texName); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); //生成图片纹理 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteData); free(spriteData); return texName; }
3、获取传入GLSL的槽位
//获得图片纹理索引 _imageTexture = [OpenGLHelper setupTexture:pImage]; //获得在GLSL中纹理的索引 _texCoordSlot = glGetAttribLocation(_programHandle, "TexCoordIn"); glEnableVertexAttribArray(_texCoordSlot); _textureUniform = glGetUniformLocation(_programHandle, "Texture"); //获得GLSL中顶点的索引 _positionSlot = glGetAttribLocation(_programHandle, "vPosition");
4、在render(渲染)方法中加入
//传入顶点着色器的数据 glVertexAttribPointer(_positionSlot, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0); glVertexAttribPointer(_texCoordSlot, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*) (sizeof(float) * 3 )); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, _imageTexture); glUniform1i(_textureUniform, 0); // 设置边缘截取模式 防止图片读取有问题 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glDrawElements(GL_TRIANGLES, sizeof(Indices)/sizeof(Indices[0]), GL_UNSIGNED_BYTE, 0);