//
// 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上是可以显示出图像的.