OpenGL多边形绘制抗锯齿(在cocos2d中)

时间:2014-01-09 21:20:33

标签: ios opengl-es cocos2d-iphone draw antialiasing

我正在使用cocos2d作为游戏enigne而我正在尝试在那里绘制漂亮的抗锯齿多边形。 我写了一个简单的多边形(现在只有三角形)绘图类,类似于cocos2d的CCDrawNode。

如何仅对这些三角形应用抗锯齿而不对整个系统应用AA? :)

MLDrawNode.h

#import "CCNode.h"
#import "CCProgressTimer.h"

typedef struct {
NSUInteger indexInBuffer;
NSUInteger vertexCount;
MLVertexData *vertexData;
} mlPolygonData;


@interface MLDrawNode : CCNode
{
GLuint          _vao;
GLuint          _vbo;

NSUInteger      _bufferCapacity;
GLsizei         _bufferCount;
MLVertexData    *_buffer;

ccBlendFunc     _blendFunc;
NSUInteger _nextFreeVertexIndex;

BOOL _dirty;
}

@property(nonatomic, assign) ccBlendFunc blendFunc;

-(mlPolygonData) drawPolyWithVerts:(CGPoint *)verts count:(NSUInteger)count fillColor:(ccColor4F)fill  borderWidth:(CGFloat)width borderColor:(ccColor4F)line;
-(void) clear;
@end

MLDrawNode.m

@implementation MLDrawNode

-(void)ensureCapacity:(NSUInteger)count
{
if(_bufferCount + count > _bufferCapacity){
    _bufferCapacity += MAX(_bufferCapacity, count);
    _buffer = realloc(_buffer, _bufferCapacity*sizeof(MLVertexData));

    //      NSLog(@"Resized vertex buffer to %d", _bufferCapacity);
    }
}

-(id)init {

if((self = [super init])){
    self.blendFunc = (ccBlendFunc){CC_BLEND_SRC, CC_BLEND_DST};

    self.shaderProgram = [[CCShaderCache sharedShaderCache] programForKey:kCCShader_PositionLengthTexureColor];

    [self ensureCapacity:512];

    glGenVertexArrays(1, &_vao);
    ccGLBindVAO(_vao);

    glGenBuffers(1, &_vbo);
    glBindBuffer(GL_ARRAY_BUFFER, _vbo);
    glBufferData(GL_ARRAY_BUFFER, sizeof(ccV2F_C4B_T2F)*_bufferCapacity, _buffer, GL_STREAM_DRAW);

    glEnableVertexAttribArray(kCCVertexAttrib_Position);
    glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, sizeof(MLVertexData), (GLvoid *)offsetof(ccV2F_C4B_T2F, vertices));

    glEnableVertexAttribArray(kCCVertexAttrib_Color);
    glVertexAttribPointer(kCCVertexAttrib_Color, 4, GL_FLOAT, GL_FALSE, sizeof(MLVertexData), (GLvoid *)offsetof(MLVertexData, color));

    glEnableVertexAttribArray(kCCVertexAttrib_TexCoords);
    glVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, sizeof(MLVertexData), (GLvoid *)offsetof(MLVertexData, texCoord));

    glBindBuffer(GL_ARRAY_BUFFER, 0);
    ccGLBindVAO(0);

    CHECK_GL_ERROR();

    _dirty = YES;
    _nextFreeVertexIndex = 0;
}

return self;
}

-(void)dealloc
{
#ifdef __CC_PLATFORM_IOS
NSAssert([EAGLContext currentContext], @"No GL context set!");
#endif

free(_buffer); _buffer = NULL;

glDeleteBuffers(1, &_vbo); _vbo = 0;
glDeleteVertexArrays(1, &_vao); _vao = 0;

}



 -(void)render
{
if( _dirty ) {
    glBindBuffer(GL_ARRAY_BUFFER, _vbo);
    glBufferData(GL_ARRAY_BUFFER, sizeof(MLVertexData)*_bufferCapacity, _buffer,         GL_STREAM_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    _dirty = NO;
}

ccGLBindVAO(_vao);
glDrawArrays(GL_TRIANGLES, 0, _bufferCount);

CC_INCREMENT_GL_DRAWS(1);

CHECK_GL_ERROR();
}

-(void)draw
{


_dirty = YES;
ccGLBlendFunc(_blendFunc.src, _blendFunc.dst);

[_shaderProgram use];
[_shaderProgram setUniformsForBuiltins];

[self render];
}

-(mlPolygonData)drawPolyWithVerts:(CGPoint *)verts count:(NSUInteger)count fillColor:    (ccColor4F)fill  borderWidth:(CGFloat)width borderColor:(ccColor4F)line;
{


[self ensureCapacity: count];
for (int i = 0; i < count; i++) {
    MLVertexData newVertex = MLVertexDataMake(0.0, 0.0, verts[i].x, verts[i].y, mlColor4FMake(fill.r, fill.g, fill.b, fill.a));
    _buffer[_nextFreeVertexIndex + i] = newVertex;

}

mlPolygonData polyData;
polyData.indexInBuffer = _nextFreeVertexIndex;
polyData.vertexCount = count;
polyData.vertexData = _buffer;

_nextFreeVertexIndex += count;
_bufferCount += count;





_dirty = YES;

return polyData;

}


-(void)clear
{
_bufferCount = 0;
_nextFreeVertexIndex = 0;
_dirty = YES;
}


@end

0 个答案:

没有答案