OpenGL学习(五)纹理

(一)、纹理:我们可以为每个顶点添加颜色来增加图形的细节,从而创建出有趣的图像。但是,如果想让图形看起来更真实,我们就必须有足够多的顶点,从而指定足够多的颜色。这将会产生很多额外开销,因为每个模型都会需求更多的顶点,每个顶点又需求一个颜色属性。

艺术家和程序员更喜欢使用纹理(Texture)。纹理是一个2D图片(甚至也有1D和3D的纹理),它可以用来添加物体的细节;你可以想象纹理是一张绘有砖块的纸,无缝折叠贴合到你的3D的房子上,这样你的房子看起来就像有砖墙外表了。因为我们可以在一张图片上插入非常多的细节,这样就可以让物体非常精细而不用指定额外的顶点。

为了能够把纹理映射(Map)到三角形上,我们需要指定三角形的每个顶点各自对应纹理的哪个部分。这样每个顶点就会关联着一个纹理坐标(Texture Coordinate),用来标明该从纹理图像的哪个部分采样。之后在图形的其它片段上进行片段插值(Fragment Interpolation)。

纹理坐标在x和y轴上,范围为0到1之间(注意我们使用的是2D纹理图像)。使用纹理坐标获取纹理颜色叫做采样(Sampling)。纹理坐标起始于(0, 0),也就是纹理图片的左下角,终始于(1, 1),即纹理图片的右上角。下面的图片展示了我们是如何把纹理坐标映射到三角形上的。

纹理坐标可以是:

float textCoords[ ]={

  0.0f, 0.0f, // 左下角  

1.0f, 0.0f, // 右下角  

0.5f, 1.0f // 上中

 };

变换的代码调试记录:

 float vertices[] = {

        //     ---- 位置 ----       ---- 颜色 ----     - 纹理坐标 -

        0.5f0.5f, 0.0f,   1.0f, 0.0f, 0.0f,   1.0f, 1.0f,   // 右上

        0.5f, -0.5f, 0.0f,   0.0f, 1.0f, 0.0f,   1.0f, 0.0f,   // 右下

        -0.5f, -0.5f, 0.0f,   0.0f, 0.0f, 1.0f,   0.0f, 0.0f,   // 左下

        -0.5f0.5f, 0.0f,   1.0f, 1.0f, 0.0f,   0.0f, 1.0f    // 左上

    };

//

//    float vertices2[] = {

//        //     ---- 位置 ----           - 纹理坐标 -

//        0.5f,  0.5f, 0.0f,     1.0f, 1.0f,   // 右上

//        0.5f, -0.5f, 0.0f,     1.0f, 0.0f,   // 右下

//        -0.5f, -0.5f, 0.0f,     0.0f, 0.0f,   // 左下

//        -0.5f,  0.5f, 0.0f,     0.0f, 1.0f    // 左上

//    };

    unsigned int indices[]={

        0,1,3,

        1,2,3

    };

    unsigned int VBO,VAO,EBO;

    glGenVertexArrays(1, &VAO);

    glGenBuffers(1, &VBO);

    glGenBuffers(1, &EBO);

    glBindVertexArray(VAO);

    glBindBuffer(GL_ARRAY_BUFFER, VBO);

    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);

    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

    //position attribute

    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 *sizeof(float),(void*)0);

    glEnableVertexAttribArray(0);

    

 //如果用的vertices2[],则改成5,5指的步长,即前面的顶点定义那里,下一个顶点是第几个数据之后

    //Texture attribute

    //指第六个偏移量是纹理坐标

    glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 8 *sizeof(float),(void*)(6*sizeof(float)));

    glEnableVertexAttribArray(1);

猜你喜欢

转载自blog.csdn.net/honry55/article/details/80284883