Opengl es 需要使用cocos2d-x绘制非矩形精灵的帮助吗

Opengl es 需要使用cocos2d-x绘制非矩形精灵的帮助吗,opengl-es,cocos2d-x,Opengl Es,Cocos2d X,我在尝试绘制一些非矩形精灵时遇到问题。由于某些原因,图像在三角形条带上没有正确映射。有人能告诉我可能做错了什么吗?任何帮助都将不胜感激 以下是我得到的结果: class TestNode : public CCNode { public: CREATE_FUNC( TestNode ); virtual bool init() { CCNode::init(); m_texture = CCTextureCache::sharedTe

我在尝试绘制一些非矩形精灵时遇到问题。由于某些原因,图像在三角形条带上没有正确映射。有人能告诉我可能做错了什么吗?任何帮助都将不胜感激

以下是我得到的结果:

class TestNode : public CCNode
{
public:

    CREATE_FUNC( TestNode );

    virtual bool init()
    {
        CCNode::init();

        m_texture = CCTextureCache::sharedTextureCache()->addImage( "Test/test.png" );
        m_texture->retain();

        setShaderProgram( CCShaderCache::sharedShaderCache()->programForKey( kCCShader_PositionTextureColor ) );

        return true;
    }

    virtual void draw()
    {
        CC_NODE_DRAW_SETUP();

        ccGLEnableVertexAttribs( kCCVertexAttribFlag_PosColorTex );
        ccGLBlendFunc( CC_BLEND_SRC, CC_BLEND_DST );
        ccGLBindTexture2D( m_texture->getName() );

        static ccVertex2F   verts[4] = { {0.0f, 0.0f}, {256.0f, 0.0f}, {64.0f, 256.0f}, {192, 256.0f} };
        static ccTex2F      uvs[4] = { {0.0f, 1.0f}, {1.0f, 1.0f}, {0.0f, 0.0f}, {1.0f, 0.0f} };
        static ccColor4B    colors[4] = { {255, 255, 255, 255}, {255, 255, 255, 255}, {255, 255, 255, 255}, {255, 255, 255, 255} };

        glVertexAttribPointer( kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, verts );
        glVertexAttribPointer( kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, 0, uvs );
        glVertexAttribPointer( kCCVertexAttrib_Color, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, colors );

        glDrawArrays( GL_TRIANGLE_STRIP, 0, (GLsizei)4 );
    }

protected:

    CCTexture2D*    m_texture;
};

这是我正在使用的图像:

class TestNode : public CCNode
{
public:

    CREATE_FUNC( TestNode );

    virtual bool init()
    {
        CCNode::init();

        m_texture = CCTextureCache::sharedTextureCache()->addImage( "Test/test.png" );
        m_texture->retain();

        setShaderProgram( CCShaderCache::sharedShaderCache()->programForKey( kCCShader_PositionTextureColor ) );

        return true;
    }

    virtual void draw()
    {
        CC_NODE_DRAW_SETUP();

        ccGLEnableVertexAttribs( kCCVertexAttribFlag_PosColorTex );
        ccGLBlendFunc( CC_BLEND_SRC, CC_BLEND_DST );
        ccGLBindTexture2D( m_texture->getName() );

        static ccVertex2F   verts[4] = { {0.0f, 0.0f}, {256.0f, 0.0f}, {64.0f, 256.0f}, {192, 256.0f} };
        static ccTex2F      uvs[4] = { {0.0f, 1.0f}, {1.0f, 1.0f}, {0.0f, 0.0f}, {1.0f, 0.0f} };
        static ccColor4B    colors[4] = { {255, 255, 255, 255}, {255, 255, 255, 255}, {255, 255, 255, 255}, {255, 255, 255, 255} };

        glVertexAttribPointer( kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, verts );
        glVertexAttribPointer( kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, 0, uvs );
        glVertexAttribPointer( kCCVertexAttrib_Color, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, colors );

        glDrawArrays( GL_TRIANGLE_STRIP, 0, (GLsizei)4 );
    }

protected:

    CCTexture2D*    m_texture;
};

以下是我正在使用的代码:

class TestNode : public CCNode
{
public:

    CREATE_FUNC( TestNode );

    virtual bool init()
    {
        CCNode::init();

        m_texture = CCTextureCache::sharedTextureCache()->addImage( "Test/test.png" );
        m_texture->retain();

        setShaderProgram( CCShaderCache::sharedShaderCache()->programForKey( kCCShader_PositionTextureColor ) );

        return true;
    }

    virtual void draw()
    {
        CC_NODE_DRAW_SETUP();

        ccGLEnableVertexAttribs( kCCVertexAttribFlag_PosColorTex );
        ccGLBlendFunc( CC_BLEND_SRC, CC_BLEND_DST );
        ccGLBindTexture2D( m_texture->getName() );

        static ccVertex2F   verts[4] = { {0.0f, 0.0f}, {256.0f, 0.0f}, {64.0f, 256.0f}, {192, 256.0f} };
        static ccTex2F      uvs[4] = { {0.0f, 1.0f}, {1.0f, 1.0f}, {0.0f, 0.0f}, {1.0f, 0.0f} };
        static ccColor4B    colors[4] = { {255, 255, 255, 255}, {255, 255, 255, 255}, {255, 255, 255, 255}, {255, 255, 255, 255} };

        glVertexAttribPointer( kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, verts );
        glVertexAttribPointer( kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, 0, uvs );
        glVertexAttribPointer( kCCVertexAttrib_Color, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, colors );

        glDrawArrays( GL_TRIANGLE_STRIP, 0, (GLsizei)4 );
    }

protected:

    CCTexture2D*    m_texture;
};
==============

更新#1: 我发现:

我创建了一个使用texture2DProj()的新着色器。这是一个进步,但仍然不是我想要的。我不想要沿垂直轴的透视效果

新结果如下:

class TestNode : public CCNode
{
public:

    CREATE_FUNC( TestNode );

    virtual bool init()
    {
        CCNode::init();

        m_texture = CCTextureCache::sharedTextureCache()->addImage( "Test/test.png" );
        m_texture->retain();

        setShaderProgram( CCShaderCache::sharedShaderCache()->programForKey( kCCShader_PositionTextureColor ) );

        return true;
    }

    virtual void draw()
    {
        CC_NODE_DRAW_SETUP();

        ccGLEnableVertexAttribs( kCCVertexAttribFlag_PosColorTex );
        ccGLBlendFunc( CC_BLEND_SRC, CC_BLEND_DST );
        ccGLBindTexture2D( m_texture->getName() );

        static ccVertex2F   verts[4] = { {0.0f, 0.0f}, {256.0f, 0.0f}, {64.0f, 256.0f}, {192, 256.0f} };
        static ccTex2F      uvs[4] = { {0.0f, 1.0f}, {1.0f, 1.0f}, {0.0f, 0.0f}, {1.0f, 0.0f} };
        static ccColor4B    colors[4] = { {255, 255, 255, 255}, {255, 255, 255, 255}, {255, 255, 255, 255}, {255, 255, 255, 255} };

        glVertexAttribPointer( kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, verts );
        glVertexAttribPointer( kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, 0, uvs );
        glVertexAttribPointer( kCCVertexAttrib_Color, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, colors );

        glDrawArrays( GL_TRIANGLE_STRIP, 0, (GLsizei)4 );
    }

protected:

    CCTexture2D*    m_texture;
};