紋理
紋理是用來保存圖像顏色元素之的OpenGL ES 緩存.當用一個圖像初始化一個紋理緩存之后,在這個圖像的中的每個像素變成紋理中的一個紋素(texel).
紋理坐標系中---命名為S 和 T的2D坐標.S的坐標范圍0.0到1.0,T坐標是0.0到1.0.遠點坐標在左下角.
幀緩存
是按像素來匹配屏幕尺寸的.在渲染時,GPU會轉換純數(shù)字OpenGL ES 坐標系中的每個頂點的X,Y,Z坐標為幀緩存中所對應的真實像素位置.幀緩存對應的像素位置叫做視口(viewport)坐標.在每個頂點被轉化成視口坐標后,GPU會設置轉換生成的三角形內的每個像素的顏色.轉換幾何形狀數(shù)據(jù)為幀緩存中的顏色像素的渲染步驟叫做
點陣化
(rasterizing),每個顏色的像素叫做片元
(fragment).對其方式
: 每個頂點還給出了U 和 V坐標值.每個U坐標會映射到頂點的視口中的最終位置到紋理中的沿著S軸的一個位置,V坐標映射到T軸.取樣模式
GPU會根據(jù)計算出的每個片元的U,V位置從綁定的紋理中選擇紋素.這個過程叫做取樣
.
-
減小過濾選項
glTexParameteri(GL_TEXTURE_2D,GL_TEXTTURE_MIN_FILTER,GL_NEAREST)
glTexParameteri(GL_TEXTURE_2D,GL_TEXTTURE_MIN_FILTER,GL_LINEAR)
來配置每個綁定的紋理.
GL_LINEAR 來指定參數(shù),GL_TEXTURE_MIN_FILTER :多個紋素對應一個片元,從相匹配的多個紋素中取樣顏色,然后用線性內插法混合這些顏色得到片元顏色.
GL_NEAREST 來指定參數(shù),GL_TEXTURE_MIN_FILTER :與片元的U,V坐標最接近的紋素顏色會被取樣.
-
放大過濾選項
glTexParameteri(GL_TEXTURE_2D,GL_TEXTTURE_MAG_FILTER,GL_NEAREST)
glTexParameteri(GL_TEXTURE_2D,GL_TEXTTURE_MAG_FILTER,GL_LINEAR)
GL_LINEAR 指定參數(shù):GL_TEXTURE_MAG_FILTER : 一個紋素對應多個片元,會有一個放大紋理的效果,并讓它模糊的出現(xiàn)在渲染的三角形上.
GL_NEAREST :取最臨近紋素,并放大紋理.
-
超出紋理選項
當U,V坐標的值小于0或者大于1時,設置紋理的循環(huán)模式,分別設置 S 和 T 軸
S 軸
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WARP_S,GL_GLAMP_TO_EDGE)
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WARP_S,GL_REPEAT)
T 軸
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WARP_T,GL_GLAMP_TO_EDGE)
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WARP_T, GL_REPEAT)
透明度,混合和多重紋理
當紋理計算出來一個完全不透明的最終片元顏色時,這個片元的顏色會簡單替換任何幀緩存的像素顏色渲染緩存內現(xiàn)存的對應的像素顏色.
如果部分透明或者全透明.OpenGL ES 會使用一個混合函數(shù)來混合片元顏色和像素顏色渲染緩存對應的像素.
- 通過
glEnalbe(GL_BLEND)
開啟混合 - 通過
glBlendFunc(sourceFactor,destinationFactor)
設置混合函數(shù).
sourceFactor
:用于指定每個片元的最終顏色元素怎么影響混合,常用值GL_SRC_ALPHA,讓源片元的透明度元素依次與其他片元顏色元素相乘;
destinationFactor
:用于指定目標幀緩存中已經(jīng)存在的顏色元素怎么影響混合,常用值:GL_ONE_MINUS_SRC_ALPHA,讓源片元的透明度元素(1.0)與在幀緩存內的正在被更新的像素的顏色元素相乘.
所以app開發(fā)中將,視圖設置為不透明,可以有效的提高圖片的渲染性能
- 配置參數(shù)
- (void)viewDidLoad {
[super viewDidLoad];
GLKView *glkView = (GLKView *)self.view;
glkView.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
[EAGLContext setCurrentContext:glkView.context];
self.buffer = [[AGLKVertexAttribArrayBuffer alloc] initWithAtrribStride:sizeof(ScenceVertex) numberOfVertices:sizeof(vertices)/sizeof(ScenceVertex) data:vertices usage:GL_STATIC_DRAW];
self.baseEffect = [[GLKBaseEffect alloc] init];
self.baseEffect.useConstantColor = GL_TRUE;
self.baseEffect.constantColor = GLKVector4Make(
1,
1,
1,
1);
self.info1 = [self loadTextureInfoWith:@"chi.jpg"];
self.info2 = [self loadTextureInfoWith:@"vs_star_center.png"];
//開啟圖片混合
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}
-(GLKTextureInfo *)loadTextureInfoWith:(NSString *)cgImageName
{
CGImageRef imageRef = [UIImage imageNamed:cgImageName].CGImage;
return [GLKTextureLoader textureWithCGImage:imageRef options:@{GLKTextureLoaderOriginBottomLeft:@YES} error:NULL];
}
- 開始渲染
//重繪
-(void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
[self.baseEffect prepareToDraw];
//glClear 函數(shù)來設置當前綁定的幀緩存的像素顏色渲染緩存中的每一個像素的顏色為前面使用的glClearColor()函數(shù)設定的值.可以有效的設置幀緩存中的每一個像素的顏色為背景色.
glClear(GL_COLOR_BUFFER_BIT);
[self.buffer prepareToDrawWithAttrib:GLKVertexAttribPosition numberOfCoordinates:3 attribOfOffset:offsetof(ScenceVertex, positionCoords) shouldEnabled:YES];
[self.buffer prepareToDrawWithAttrib:GLKVertexAttribTexCoord0 numberOfCoordinates:2 attribOfOffset:offsetof(ScenceVertex, textureCoords) shouldEnabled:YES];
self.baseEffect.texture2d0.name = self.info1.name;
self.baseEffect.texture2d0.target = self.info1.target;
[self.baseEffect prepareToDraw];
[self.buffer drawArrayWithMode:GL_TRIANGLES startVertexIndex:0 numberOfVertices:6];
self.baseEffect.texture2d0.name = self.info2.name;
self.baseEffect.texture2d0.target = self.info2.target;
[self.baseEffect prepareToDraw];
[self.buffer drawArrayWithMode:GL_TRIANGLES startVertexIndex:0 numberOfVertices:6];
//
// //4.啟用頂點數(shù)據(jù)
// glEnableVertexAttribArray(GLKVertexAttribPosition);
//
// //5.設置指針
// glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(ScenceVertex), NULL);
//
//
// //畫圖
// glDrawArrays(GL_TRIANGLES, 0, 3);
// [self prepareToDrawWithAttrib:GLKVertexAttribPosition AttribStride:sizeof(ScenceVertex) numberOfCoordinates:3 attribOfOffset:offsetof(ScenceVertex, positionCoords) shouldEnable:YES];
// [self prepareToDrawWithAttrib:GLKVertexAttribTexCoord0 AttribStride:sizeof(ScenceVertex) numberOfCoordinates:2 attribOfOffset:offsetof(ScenceVertex, textureCoords) shouldEnable:YES];
//
//
// [self drawArrayWithMode:GL_TRIANGLES startVertexIndex:0 numberOfVertices:3];
//
}
最后合成圖片如下