OpenGL ES学习之三---你好三角形(顶点属性数组)

  1. 使用常量指定顶点属性

加载顶点属性的方式一:顶点属性数组 结合绘制三角形的实例,介绍使用定义顶点属性及其赋值的方法。 初始化,获得程序对象

bool HelloTriangle::init()
{
    bool ret = false;
    do
    {
        CC\_BREAK\_IF(false == TestCase::init());

        char vShaderStr\[\] =
            "//着色器语言版本                              \\n"
            "#version 300 es                          \\n"
            "//布局变量块指定变量在内存布局方式          \\n"
            "layout(location = 0) in vec4 vPosition;  \\n"
            "void main()                              \\n"
            "{                                        \\n"
            "   gl_Position = vPosition;              \\n"
            "}                                        \\n";

        char fShaderStr\[\] =
            "#version 300 es                              \\n"
            "//指定默认精度限定符为mediump                  \\n"
            "precision mediump float;                     \\n"
            "//指定输出变量                                \\n"
            "out vec4 fragColor;                          \\n"
            "void main()                                  \\n"
            "{                                            \\n"
            "   fragColor = vec4 ( 1.0, 0.0, 0.0, 1.0 );  \\n"
            "}                                            \\n";

        //创建程序对象
        programObject = GLShader::LoadProgram(vShaderStr, fShaderStr);

        //获取最大顶点属性数量
        GLint maxVertexAttribs; // n will be >= 16
        glGetIntegerv(GL\_MAX\_VERTEX_ATTRIBS, &maxVertexAttribs);

        // Bind vPosition to attribute 0   
        // 第二个方法使用layout 在着色器中指定
        glBindAttribLocation(programObject, 0, "vPosition");

        ////获取属性的索引
        //GLuint index =  glGetAttribLocation(programObject,
        //    "vPosition");

        ret = true;
    } while (0);

    return ret;
}

绘制函数

void HelloTriangle::onDraw(const Mat4& transform, uint32_t flags)
{
    GLfloat vVertices\[\] = { 0.0f,  0.5f, 0.0f,
        -0.5f, -0.5f, 0.0f,
        0.5f, -0.5f, 0.0f };

    // Clear the color buffer
    glClear(GL\_COLOR\_BUFFER_BIT);

    // Use the program object
    //函数原型:
    //    void glUseProgram(int program)
    //    参数含义:
    //    program是要使用的着色器程序的id。
    glUseProgram(programObject);

    //glVertexAttribPointer( GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride,const GLvoid * pointer):加载顶点数据
    //index:顶点属性的索引值
    //size:每个顶点属性的组件数量。必须为1、2、3或者4。初始值为4。(如position是由3个(x,y,z)组成,而颜色是4个(r,g,b,a))
    //type:顶点的数据类型
    //normalized:是否归一化
    //stride:顶点属性之间的偏移量
    //pointer:指定第一个组件在数组的第一个顶点属性中的偏移量
    // Load the vertex data
    glVertexAttribPointer(0, 3, GL\_FLOAT, GL\_FALSE, 0, vVertices);
    glEnableVertexAttribArray(0);

    //(v0,v1,v2,v3,v4,v5)
    //GL_TRIANGLES:两个三角形 (v0,v1,v2) (v3,v4,v5)
    //GL\_TRIANGLE\_STRIP:三个三角形(v0,v1,v2)(v1,v2,v3)(v2,v3,v4)
    //GL\_TRIANGLE\_FAN:三个三角形(v0,v1,v2)(v0,v2,v3)(v0,v3,v4)
    //glDrawArrays (GLenum mode, GLint first, GLsizei count):绘制三角形
    //mode:GL\_POINTS、GL\_LINES、GL\_LINE\_LOOP、GL\_LINE\_STRIP、GL\_TRIANGLES、GL\_TRIANGLE\_STRIP、GL\_TRIANGLE_FAN
    //first: 0
    //count: 3
    glDrawArrays(GL_TRIANGLES, 0, 3);
}
使用常量指定顶点属性

初始化

bool HelloTriangle_ConstAndVertexArray::init()
{
    bool ret = false;
    do
    {
        CC\_BREAK\_IF(false == TestCase::init());

        const char vShaderStr\[\] =
            "#version 300 es                            \\n"
            "layout(location = 0) in vec4 a_color;        \\n"
            "layout(location = 1) in vec4 a_position;    \\n"
            "out vec4 v_color;                            \\n"
            "void main()                                \\n"
            "{                                            \\n"
            " v\_color = a\_color;                        \\n"
            " gl\_Position = a\_position;                    \\n"
            "}";
        const char fShaderStr\[\] =
            "#version 300 es                            \\n"
            "precision mediump float;                    \\n"
            "in vec4 v_color;                            \\n"
            "out vec4 o_fragColor;                        \\n"
            "void main()                                \\n"
            "{                                            \\n"
            " o\_fragColor = v\_color;                    \\n"
            "}";

        //创建程序对象
        programObject = GLShader::LoadProgram(vShaderStr, fShaderStr);

        glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

        ret = true;
    } while (0);

    return ret;
}

绘制函数

void HelloTriangle\_ConstAndVertexArray::onDraw(const Mat4& transform, uint32\_t flags)
{
    auto winSize = Director::getInstance()->getWinSize();
    GLfloat color\[4\] = { 1.0f, 0.0f, 0.0f, 1.0f };
    // 3 vertices, with (x, y, z) per-vertex
    GLfloat vertexPos\[3 * 3\] =
    {
        0.0f, 0.5f, 0.0f, // v0
        -0.5f, -0.5f, 0.0f, // v1
        0.5f, -0.5f, 0.0f // v2
    };
    glViewport(0, 0, winSize.width, winSize.height);

    glClear(GL\_COLOR\_BUFFER_BIT);

    glUseProgram(programObject);

    //指定常量顶点属性
    glVertexAttrib4fv(0, color);
    glVertexAttribPointer(1, 3, GL\_FLOAT, GL\_FALSE, 0,vertexPos);

    //glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);
    glDrawArrays(GL_TRIANGLES, 0, 3);
    //glDisableVertexAttribArray(1);

    //查询活动属性变量数量
    //GLint numActiveAttribs;
    //glGetProgramiv(programObject, GL\_ACTIVE\_ATTRIBUTES, &numActiveAttribs);
}

不知道为什么三个顶点的颜色不一样… 工程源码:CocosShader


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 xue_huashan@163.com

文章标题:OpenGL ES学习之三---你好三角形(顶点属性数组)

文章字数:874

本文作者:max-xue

发布时间:2017-06-05, 09:52:15

最后更新:2019-11-09, 10:43:44

原始链接:http://blog.le-more.com/2017/06/05/cocos/a1-b6-e7-82-b9-e5-b1-9e/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏