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度斜条。

 

posted @ 2012-02-23 23:43  zenny_chen  Views(840)  Comments(0Edit  收藏  举报