固定著色器加載紋理(OpenGL ES)

用固定著色器繪制三角形類似,這里重點講下不同的地方。

1.加載圖片

- (void)setupTexture {
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"triangle.png" ofType:nil];
    // GLKTextureLoaderOriginBottomLeft 表示是否需要翻轉(zhuǎn)圖片以適配OpenGL坐標(biāo)系(UIKIt坐標(biāo)原點在左上方,OpenGL原點在左下方)
    GLKTextureInfo *textureInfo = [GLKTextureLoader textureWithContentsOfFile:filePath options:@{GLKTextureLoaderOriginBottomLeft : @YES} error:nil];
    _effect.texture2d0.name = textureInfo.name;
    _effect.texture2d0.target = textureInfo.target;
}

2.設(shè)置頂點數(shù)據(jù)

- (void)setupVertexBuffer {
    // 頂點數(shù)據(jù)(頂點坐標(biāo) + 紋理坐標(biāo))
    SceneVertex vertices[] = {
        // N 形
//        { {-0.5, 0.5, 0}, {0, 1} },
//        { {-0.5, -0.5, 0}, {0, 0} },
//        { {0.5, 0.5, 0}, {1, 1} },
//        { {0.5, -0.5, 0}, {1, 0} },

        // Z 形
        { {-0.5, 0.5, 0}, {0, 1} },
        { {0.5, 0.5, 0}, {1, 1} },
        { {-0.5, -0.5, 0}, {0, 0} },
        { {0.5, -0.5, 0}, {1, 0} },

//        未重復(fù)利用
//        { {-0.5, 0.5, 0}, {0, 1} },
//        { {-0.5, -0.5, 0}, {0, 0} },
//        { {0.5, 0.5, 0}, {1, 1} },
//        { {-0.5, -0.5, 0}, {0, 0} },
//        { {0.5, -0.5, 0}, {1.0, 0} },
//        { {0.5, 0.5, 0}, {1, 1} },
    };

    // 操作頂點緩存區(qū) (GPU)
    glGenBuffers(1, &_vertextBufferID);
    // 1.綁定頂點到緩存區(qū),將attrBuffer綁定到GL_ARRAY_BUFFER標(biāo)識符上
    glBindBuffer(GL_ARRAY_BUFFER, _vertextBufferID);
    // 2.拷貝數(shù)據(jù)到頂點緩存區(qū)上 cpu內(nèi)存 -> gpu顯存
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

    // 在iOS中,系統(tǒng)處于性能考慮,默認(rèn)所有的頂點著色器的屬性(Attribute)通道都是關(guān)閉的,需要開啟后才能操作數(shù)據(jù)
    // 1.打開頂點坐標(biāo)通道
    glEnableVertexAttribArray(GLKVertexAttribPosition);
    /**
     glVertexAttribPointer (GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr)
     上傳頂點數(shù)據(jù)到顯存的方法
     @param indx GLKVertexAttrib枚舉值
     @param size 每次讀取的數(shù)量,比如position是由3個坐標(biāo)組成(x,y,z),顏色是由4個組成(r,g,b,a) 紋理則兩個(s,t)
     @param type 數(shù)組中每個頂點的數(shù)據(jù)類型(GL_FLOAT、GL_SHORT、GL_BYTE、GL__UNSIGNED_BYTE等)
     @param normalized 頂點數(shù)據(jù)是否需要被歸一化
     @param stride 指定連續(xù)頂點屬性之間的偏移量(讀取步長)。如果為0,那么頂點屬性會被理解為:他們是緊密排在一起的。初始值為0
     @param ptr 指定一個指針,指向數(shù)組中第一個頂點屬性的第一個組件。初始值為0
     */
    glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(SceneVertex) , NULL + offsetof(SceneVertex, positionCoords));
    glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
    glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(SceneVertex),  NULL + offsetof(SceneVertex, textureCoord));
}

3.繪制結(jié)果

加載圖片.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容