opengl显示一张渲染好的图

//
//  ViewController.m
//  FisheyeToPlane
//
//  Created by zhangkai on 2019/2/18.
//  Copyright © 2019 zhangkai. All rights reserved.
//

#import "ViewController.h"
#include "esUtil.h"
#include 

void CheckGlError(const char* op)
{
    for (GLint error = glGetError(); error; error = glGetError())
    {
        printf("after %s() glError (0x%x)\n", op, error);
    }
}

@interface ViewController ()
{
    GLuint _programObject;
    GLuint _attrPos;
    GLuint _attrUV;
    GLuint _samSrcImg;
    GLuint _textureID;
    
    GLuint _drawableWidth;
    GLuint _drawableHeight;
}

@property (strong, nonatomic) EAGLContext *context;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    //set context
    self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
    
    GLKView* glView = (GLKView*)self.view;
    glView.context = self.context;
    glView.drawableDepthFormat = GLKViewDrawableDepthFormat24;
}

- (void)InitShader
{
    const char *vertShader =
    
    "precision highp float;                                         \n"
    "attribute vec3 a_Position;             \n"
    "attribute vec2 a_TexCoord;             \n"
    
    "uniform mat4   u_MvpMatrix;            \n"
    "varying vec2   v_TexCoord;             \n"
    
    "void main()                            \n"
    "{                                      \n"
    "   v_TexCoord = a_TexCoord;            \n"
    "   gl_Position =  vec4(a_Position,1.0); \n"
    "}                                      \n"
    ;
    
    const char *fragmentShader =
    
    "precision highp float;                                         \n"
    "varying vec2    v_TexCoord;                                    \n"
    "uniform sampler2D  u_TextureOES;                               \n"
    "void main()                                                    \n"
    "{                                                              \n"
    "   gl_FragColor = texture2D(u_TextureOES,v_TexCoord).bgra;         \n"
    //"   gl_FragColor = vec4(1.0,0.0,0.0,1.0);         \n"
    "}                                                              \n"
    ;
    
    _programObject = esLoadProgram(vertShader, fragmentShader);
    
    _attrPos = glGetAttribLocation(_programObject, "a_Position");
    _attrUV  = glGetAttribLocation(_programObject, "a_TexCoord");
    
    //原始图片的纹理单元
    _samSrcImg = glGetUniformLocation(_programObject, "u_TextureOES");
    
    glGenTextures(1, &_textureID);
    glBindTexture(GL_TEXTURE_2D, _textureID);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    
    //opencv 读取
    NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString* documentDirectory = [paths objectAtIndex:0];
    NSString* imgPath = [documentDirectory stringByAppendingString:@"/one_eye_image.jpg"];
    
    cv::Mat src_img = cv::imread([imgPath UTF8String]);
    int photoWidth = src_img.cols;
    int photoHeight = src_img.rows;
    
    unsigned char* photoBytes = new unsigned char [sizeof(unsigned char) * photoWidth * photoHeight * 3];
    memcpy(photoBytes, src_img.data, sizeof(unsigned char) * photoWidth * photoHeight * 3 * sizeof(unsigned char));
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, photoWidth, photoHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, photoBytes);
    CheckGlError("step2");
    
    CheckGlError("step 2.1");
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    
}

- (void)Draw:(NSUInteger)drawableWidth height:(NSUInteger)drawableHeight
{
    glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    glViewport(0, 0, _drawableWidth, _drawableHeight);
    
    glUseProgram(_programObject);
    
    //顶点和纹理
    GLfloat vertices [5*6]=
    {
        1.0f , -1.0f ,0.0f , 1.0f ,0.0f , // bottom right
        1.0f,1.0f,0.0f , 1.0 , 1.0f , // top right
        -1.0f,-1.0f, 0.0f , 0.0f ,0.0f ,// bottom left
        
        1.0f,1.0f,0.0f , 1.0 , 1.0f , // top right
        -1.0f,1.0f,0.0f , 0.0f ,1.0f , // top left
        -1.0f,-1.0f, 0.0f , 0.0f ,0.0f ,// bottom left
    };
    
    //绑定顶点和纹理坐标
    glEnableVertexAttribArray( _attrPos );
    glVertexAttribPointer ( _attrPos,
                           3,
                           GL_FLOAT,
                           GL_FALSE,
                           5 * sizeof ( GLfloat ),
                           vertices );
    
    glEnableVertexAttribArray(_attrUV);
    glVertexAttribPointer ( _attrUV,
                           2,
                           GL_FLOAT,
                           GL_FALSE,
                           5 * sizeof ( GLfloat ),
                           &vertices[3] );
    
    CheckGlError("step 3");
    glActiveTexture(GL_TEXTURE0);//激活0号纹理单元,一定要使用glActiveTexture(GL_TEXTURE0),千万不要使用glActiveTexture(0)
    CheckGlError("step 3.111");
    glBindTexture(GL_TEXTURE_2D, _textureID);
    CheckGlError("step 3.222");
    glUniform1i(_samSrcImg, 0);
    CheckGlError("step 4");
    
    glDrawArrays(GL_TRIANGLES, 0,  6  );
    CheckGlError("finish draw");
}

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
    if(_drawableWidth == 0 && _drawableHeight == 0)
    {
        _drawableWidth = view.drawableWidth;
        _drawableHeight = view.drawableHeight;
        
        [self InitShader];
    }
    [self Draw:view.drawableWidth height:view.drawableHeight];
}

- (void) dealloc
{
    
}


@end

笔记容易错误点:

激活纹理单元一定要使用如下的方式:
glActiveTexture(GL_TEXTURE0);
以前一直使用的方式为:
glActiveTexture(0);

使用glActiveTexture(0);会报很多0x500的错误,但是结果在ios平台,iphone6上是可以显示出图像的.

你可能感兴趣的:(知识库)