Quartz2D之着色器使用初步
上一讲谈到了如何使用CGGradient来做线性渐变效果。那么本讲将介绍如何使用CGShader来做线性渐变效果。
使用着色器制作渐变的方法与直接用Quartz提供的CGGradient方法类似:
1、首先创建色彩空间
2、创建一个函数对象。该对象包含了输入范围信息以及输出范围信息。
3、创建着色器对象。创建着色器对象时也指定了所要绘制矩形的起点坐标与终点坐标。
4、绘制
代码如下:
//
// MyQuartzView.m
// QuartzTest
//
// Created by zenny_chen on 12-2-21.
// Copyright (c) 2012年 GreenGames Studio. All rights reserved.
//
#import "MyQuartzView.h"
// Quartz2D以及Core Animation所需要的头文件
#import <QuartzCore/QuartzCore.h>
@implementation MyQuartzView
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
}
return self;
}
static void MyShaderProcedure(void *info, const CGFloat *in, CGFloat *out)
{
CGFloat color;
if(in[0] < 0.33f)
color = 0.3f;
else if(in[0] < 0.66f)
color = 0.9f;
else
color = 0.6f;
out[0] = color;
out[1] = color;
out[2] = color;
out[3] = 1.0f;
}
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
// Drawing code
// 创建Quartz上下文
CGContextRef context = UIGraphicsGetCurrentContext();
const CGFunctionCallbacks callbacks = {
.version = 0, .evaluate = &MyShaderProcedure, .releaseInfo = NULL
};
// 创建函数对象
CGFunctionRef funcRef = CGFunctionCreate(NULL, // 将info置空
1, // 1个输入元素(每个元素为2个分量来表示区间)
(CGFloat[]){0.0f, 1.0f},
4, // 4个输出元素
(CGFloat[]){0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f},
&callbacks);
// 创建色彩空间对象
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
// 创建着色器对象
CGShadingRef shadingRef = CGShadingCreateAxial(colorSpaceRef,
CGPointMake(0.0f, 0.0f), // 起点坐标
CGPointMake(320.0f, 460.0f), // 终点坐标
funcRef, false, false);
// 释放色彩空间对象
CGColorSpaceRelease(colorSpaceRef);
// 释放函数对象
CGFunctionRelease(funcRef);
// 绘制着色渐变
CGContextDrawShading(context, shadingRef);
// 释放着色器对象
CGShadingRelease(shadingRef);
}
@end
从效果上我们可以看出,利用着色器做线性渐变仍然是以一个45度轴为基础进行渐变操作的。上述代码将产生一个从上到下的,暗灰、白到灰白的45度斜条。

浙公网安备 33010602011771号