2

私のdraw内の私の機能でCCLayer。私はいくつかの線を描いており、CGPointsに保存されていstd::vectorます。ccDrawLine を使用して正常に線を描画しました。ただし、を使用するglDrawArrayと、何も表示されません。結果のスクリーンショットを含めました。ccDrawnLine を使用するとわかるように、線が正しく描画されました。何か案は?

[更新] 私は Cocos2d v2.0 を使用しており、デフォルトでは OpenGLES 2.0 を使用しています。

//openGLES
#include <OpenGLES/EAGL.h>
#include <OpenGLES/ES2/gl.h>
#include <OpenGLES/ES2/glext.h>

- (void) draw {
    glLineWidth( 3.0f );

    //begin and clear
    [renderTexture beginWithClear:waveform4F.r g:waveform4F.g b:waveform4F.b a:waveform4F.a];
    vector<CGPoint> vertices = bufferQueue.front();

    if (WaveformStyleLined) {
        for (int i = 1; i < vertices.size(); i++)
            ccDrawLine(vertices[i - 1], vertices[i]);
    } else {
        ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position );
        kmGLPushMatrix();

        glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, sizeof(CGPoint), &vertices[0]);
        glDrawArrays(GL_LINES, sizeof(CGPoint), vertices.size());

        kmGLPopMatrix();
    }

    bufferQueue.pop();
    [renderTexture end];
}

ccDrawLine の使用

glDrawArray の使用

CGPointここに私の のいくつかがありますvertices

2012-08-18 08:57:49.750 vertices[1]:NSPoint: {1, 48.09375}
2012-08-18 08:57:49.751 vertices[2]:NSPoint: {2, 47.996094}
2012-08-18 08:57:49.752 vertices[3]:NSPoint: {3, 48.046875}
2012-08-18 08:57:49.753 vertices[4]:NSPoint: {4, 48.214844}
2012-08-18 08:57:49.754 vertices[5]:NSPoint: {5, 48.152344}
2012-08-18 08:57:49.755 vertices[6]:NSPoint: {6, 48.035156}
2012-08-18 08:57:49.755 vertices[7]:NSPoint: {7, 48.078125}
2012-08-18 08:57:49.756 vertices[8]:NSPoint: {8, 48.144531}
2012-08-18 08:57:49.757 vertices[9]:NSPoint: {9, 48.0625}
2012-08-18 08:57:49.757 vertices[10]:NSPoint: {10, 48.242188}
4

2 に答える 2

0

DrummerB のようなシェーダーを追加することで、ラインが表示されるようになりました。Cocos2d から同じシェーダー コードをコピーしたところ、見事に機能しました。

//openGLES
#include <OpenGLES/EAGL.h>
#include <OpenGLES/ES2/gl.h>
#include <OpenGLES/ES2/glext.h>

static BOOL initialized = NO;
static CCGLProgram *shader_ = nil;
static int colorLocation_ = -1;
static ccColor4F color_ = {1,1,1,1};
static int pointSizeLocation_ = -1;
static void lazy_init( void )
{
    if( ! initialized ) {

    //
    // Position and 1 color passed as a uniform (to similate glColor4ub )
    //
        shader_ = [[CCShaderCache sharedShaderCache] programForKey:kCCShader_Position_uColor];

        colorLocation_ = glGetUniformLocation( shader_->program_, "u_color");
        pointSizeLocation_ = glGetUniformLocation( shader_->program_, "u_pointSize");

        initialized = YES;
    }
}


- (void) draw {
    glLineWidth( 3.0f );

    //begin and clear
    [renderTexture beginWithClear:waveform4F.r g:waveform4F.g b:waveform4F.b a:waveform4F.a];
    vector<CGPoint> vertices = bufferQueue.front();

    if (WaveformStyleLined) {

        ccDrawPoly(&vertices[0], vertices.size(), false);

    } else {

        lazy_init();

        [shader_ use];
        [shader_ setUniformForModelViewProjectionMatrix];
        [shader_ setUniformLocation:colorLocation_ with4fv:(GLfloat*) &color_.r count:1];

        ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position );

        glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, &vertices[0]);
        glDrawArrays(GL_LINE_STRIP, 0, vertices.size());
    }

    bufferQueue.pop();
    [renderTexture end];
}
于 2012-08-22T09:24:10.283 に答える
0

を使用することになりました。これは、ccDrawLine とまったく同じ出力ccDrawPolyを内部的に使用glDrawArrayして達成しますが、ポイントごとに取得していないため、はるかに高速です。ただし、純粋な OpenGL コードを使用してそれを行う方法については、まだ興味があります。どんな助けや指示も大歓迎です。

if (WaveformStyleLined) {
    for (int i = 1; i < vertices.size(); i++)
        ccDrawLine(vertices[i - 1], vertices[i]);

} else {
    ccDrawPoly(&vertices[0], vertices.size(), false);
}
于 2012-08-20T08:20:57.780 に答える