cocos2dx中 Node 在shader使用v_texCoord

来源:互联网 发布:淘宝论坛官网 编辑:程序博客网 时间:2024/05/17 18:19
1. drawNode 的fsh中无法使用v_texCoord,原因在于
void DrawNode::drawPolygon{}函数中的给顶点数组赋值的时候,__t(v2fzero)赋值给了V2F_C4B_T2F的T2F,因此TexCoords都是0.0f;
 for (int i = 0; i < count-2; i++)
    {
        V2F_C4B_T2F_Triangle tmp = {
            {verts[0], Color4B(fillColor), __t(v2fzero)},
            {verts[i+1], Color4B(fillColor), __t(v2fzero)},
            {verts[i+2], Color4B(fillColor), __t(v2fzero)},
        };

        *cursor++ = tmp;
    }

2. 在Sprite中,TexCoords的值是(0,0)到(1,1)。在函数void Sprite::setTextureCoords(Rect rect)中进行赋值。
 _quad.bl.texCoords.u = left;
        _quad.bl.texCoords.v = top;
        _quad.br.texCoords.u = left;
        _quad.br.texCoords.v = bottom;
        _quad.tl.texCoords.u = right;
        _quad.tl.texCoords.v = top;
        _quad.tr.texCoords.u = right;
        _quad.tr.texCoords.v = bottom;

3. 因此,想要在Node的shader中使用到v_texCoord,需要在调用gldrawarray的之前,绑定texCoords值。

typedef struct {
        float Position[2];
        float Color[4];
        float TexCoords[2];
    } Vertex;
    Vertex _quad[6];


void VRMaskNode::initQuad()
{
    _quad[0] = { { 0,0 },{ 0,1,0,1 },{0,0} };
    _quad[1] = { { _visibleSize.width,0 },{ 0,1,1,1 } ,{1,0} };
    _quad[2] = { { 0,_visibleSize.height },{ 0,1,1,1 },{ 0,1 } };
    _quad[3] = { { 0,_visibleSize.height },{ 0,1,1,1 },{ 0,1 } };
    _quad[4] = { { _visibleSize.width,0 },{ 0,1,1,1 } ,{ 1,0 } };
    _quad[5] = { { _visibleSize.width,_visibleSize.height },{ 0,1,1,1 },{ 1,1 } };
}


GL::enableVertexAttribs(GL::VERTEX_ATTRIB_FLAG_POSITION | GL::VERTEX_ATTRIB_FLAG_COLOR | GL::VERTEX_ATTRIB_FLAG_TEX_COORD);
    glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_POSITION,
        2,        GL_FLOAT,        GL_FALSE,        sizeof(Vertex),
        (GLvoid*)offsetof(Vertex, Position));
    glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_COLOR,
        4,        GL_FLOAT,        GL_FALSE,        sizeof(Vertex),
        (GLvoid*)offsetof(Vertex, Color));
    glVertexAttribPointer(GLProgram::VERTEX_ATTRIB_TEX_COORD, 
        2,         GL_FLOAT, GL_FALSE, sizeof(Vertex),
        (GLvoid*)offsetof(Vertex, TexCoords));

    glDrawArrays(GL_TRIANGLES, 0, 6);
0 0