紋理的綜合應(yīng)用

1. MIP貼圖

MIP貼圖的產(chǎn)生主要是為了解決渲染時的閃爍和性能耗費(fèi)的問題沐兰,簡單來說就是當(dāng)需要屏幕上只需要處理一小部分片段時赏半,但是這時候確加載了大的紋理圖像贺归,而大的紋理圖像需要更多的變換操作這就帶來了性能的消耗,而圖片過大與屏幕顯示區(qū)域不成正比断箫,這樣各種變換從采樣到紋理應(yīng)用的過程中就容易帶來閃爍的效果拂酣。
MIP貼圖可以解決掉上述問題,當(dāng)載入某個紋理時仲义,會為加載的這個紋理圖像生成多個不同大小的紋理圖像婶熬,最大的為紋理圖像本身大小依次減半,直到最小的為紋理單元的大小埃撵,這樣當(dāng)處理小片段時可以選用小的紋理赵颅,大的片段可以選用大的紋理,這樣就避免了閃爍和性能的耗費(fèi)的問題了暂刘。但是使用MIP貼圖之后加載的紋理圖像需要的內(nèi)存會多三分之一左右饺谬。
加載MIP貼圖我們可以使用glTexImage函數(shù)而其中的level會指定使用那層的MIP層紋理,如果MIP貼圖沒有被使用那么久加載第零層谣拣,使用的話會加載所有MIP層的募寨。我們也可以通過glTexParameteri限制MIP加載范圍和使用范圍。

2.MIP貼圖過濾

沒有使用MIP時芝发,我們使用最鄰近過濾或者線性過濾绪商,都會給第零層的紋理貼圖進(jìn)行過濾,而使用了MIP貼圖辅鲸,我們也只會為第零層也就是基層紋理進(jìn)行過濾格郁,其它的MIP層會被忽略,但是我們可以通過下面過濾參數(shù)來指定那層需要過濾独悴。
MIP貼圖紋理的過濾.png

3. 生成MIP層

上面說到了可以在加載已經(jīng)構(gòu)建好的MIP層例书,但有時我們是不需要處理小片段紋理貼圖的,這時候加載所有的MIP層就有些不合適刻炒,這時候我們我們可以在使用某個紋理時在生成MIP層决采,我們可以使用

void glGaneraterMapMip(GLenum target)

需要注意的是在運(yùn)行過程中生成MIP層要比記載已經(jīng)創(chuàng)建好的MIP層慢很多,所以我們也要根據(jù)使用場景來確定使用哪種MIP層加載方式坟奥。

4. 各向?yàn)V性

對于紋理過濾我們可以使用基本的最鄰近過濾和線性過濾來處理紋理圖像顯示時的變形树瞭,但有時候由于觀察角度的改變物體各個方向上的排布也會發(fā)生改變拇厢,變的不那么規(guī)整,這時候如果紋理過濾的方式不做調(diào)整的話晒喷,就會失去一些真實(shí)性孝偎,各向?yàn)V性的紋理過濾方式會解決這個問題,它會根據(jù)物體各個方向上的不同的排布凉敲,而進(jìn)行不同的采樣衣盾,進(jìn)而達(dá)到更準(zhǔn)確的過濾。

5. 壓縮紋理

我們可以通過glTexImage來加載紋理并對其壓縮爷抓,其中internalFormat會指定壓縮的格式势决,需要注意的是不同的硬件支持的壓縮格式不同的,所以我們要在紋理壓縮之前對齊做出兼容判斷蓝撇,glTexImage是當(dāng)使用紋理時對其壓縮加載果复,我們也可以預(yù)先加載紋理,然后保存本地在使用時直接加載預(yù)先壓縮好的紋理渤昌,這時我們可以通過

void glCompressTexImage1d(GLenum target, GLint level, GLint internalformat , GLseizei width, GLint border , GLenum format, GLenum type, void *data)
void glCompressTexImage2d(GLenum target, GLint level, GLint internalformat , GLseizei width, GLseizei height, GLint border , GLenum format, GLenum type, void *data)
void glCompressTexImage3d(GLenum target, GLint level, GLint internalformat , GLseizei width, GLseizei height,  GLseizei depth, GLint border , GLenum format, GLenum type, void *data)

這個函數(shù)和glTexImage函數(shù)參數(shù)一樣据悔,僅有的區(qū)別是internalformat參數(shù)必須指定一種本地支持的壓縮格式。
需要注意的是經(jīng)過壓縮的紋理會占用更小的內(nèi)存耘沼,對紋理的讀寫效率更高,但是弊端就是可能不能保證紋理的質(zhì)量朱盐,這要依據(jù)使用場景選擇是否要對紋理進(jìn)行壓縮群嗤。

6. 下面是一個紋理貼圖的例子

GLShaderManager        shaderManager;
GLMatrixStack          modelViewMatrix;
GLMatrixStack          projectionMatrix;
GLFrustum              viewFrustum;
GLGeometryTransform    transformPipeline;

GLBatch                floorBatch;
GLBatch                ceilingBatch;
GLBatch                leftWallBatch;
GLBatch                rightWallBatch;

GLfloat                viewZ = -65.0f;

#define TEXTURE_BRICK   0
#define TEXTURE_FLOOR   1
#define TEXTURE_CEILING 2
#define TEXTURE_COUNT   3
GLuint  textures[TEXTURE_COUNT];
const char *szTextureFiles[TEXTURE_COUNT] = { "brick.tga", "floor.tga", "ceiling.tga" };

void ProcessMenu(int value)
{
    GLfloat fLargest;
    GLint iLoop;
    //便利紋理對象
    for(iLoop = 0; iLoop < TEXTURE_COUNT; iLoop++)
    {
        //根據(jù)紋理對象句柄得到紋理對象
        glBindTexture(GL_TEXTURE_2D, textures[iLoop]);
        switch(value)
        {
            case 0:
                //紋理縮小過濾,最鄰近濾波紋理坐標(biāo)會與最近紋理單元進(jìn)行映射完成一一對應(yīng)的關(guān)系兵琳,達(dá)到過濾的作用狂秘。
                glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
                break;
            case 1:
                //紋理縮小過濾,線性過濾躯肌,紋理坐標(biāo)會落在最近的紋理單元中心并對周圍紋理單元進(jìn)行加權(quán)平均運(yùn)算得到一個插值紋理單元與紋理坐標(biāo)映射完成一一對應(yīng)達(dá)到過濾作用者春。
                glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
                break;
            case 2:
                //MIP貼圖縮小過濾,最鄰近的MIP貼圖最鄰近過濾清女,對當(dāng)前應(yīng)用的MIP貼圖的紋理圖像的最鄰近的紋理圖像進(jìn)行最鄰近過濾钱烟。
                glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
                break;
            case 3:
                //MIP貼圖縮小過濾,最鄰近的MIP貼圖線性過濾嫡丙,對當(dāng)前應(yīng)用的MIP貼圖的紋理圖像的最鄰近的紋理圖像進(jìn)行線性過濾
                glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR);
                break;
            case 4:
                //MIP貼圖縮小過濾拴袭,線性的MIP貼圖對最鄰近過濾,對當(dāng)前應(yīng)用的MIP貼圖的紋理圖像的周圍紋理圖像進(jìn)行加權(quán)平均運(yùn)算得到插值的紋理圖像然后對齊進(jìn)行最鄰近過濾曙博。
                glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
                break;
            case 5:
                 //MIP貼圖縮小過濾拥刻,線性的MIP貼圖對最鄰近過濾,對當(dāng)前應(yīng)用的MIP貼圖的紋理圖像的周圍紋理圖像進(jìn)行加權(quán)平均運(yùn)算得到插值的紋理圖像然后對齊進(jìn)行線性過濾父泳。
                glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
                break;
            case 6:
                //得到本地硬件支持的最大各向異性濾波數(shù)量
                glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &fLargest);
                //紋理縮小過濾般哼,各向異性過濾吴汪,因紋理在各個方向可能存在不同的顏色和空間排布,所以針對方向上不同的紋理狀態(tài)采取不同的采樣方式蒸眠,進(jìn)而達(dá)到更準(zhǔn)確的過濾
                glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, fLargest);
                break;
            case 7:
                //關(guān)閉各向?yàn)V性過濾
                glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0f);
                break;
        }
    }
    // 重新渲染
    glutPostRedisplay();
}

void SetupRC()
{
    GLbyte *pBytes;
    GLint iWidth, iHeight, iComponents;
    GLenum eFormat;
    GLint iLoop;
    
    //設(shè)置背景顏色
    glClearColor(0.0f, 0.0f, 0.0f,1.0f);
    //初始化存儲著色器
    shaderManager.InitializeStockShaders();
    //設(shè)置紋理對象個數(shù)漾橙,與紋理對象句柄集合
    glGenTextures(TEXTURE_COUNT, textures);
    for(iLoop = 0; iLoop < TEXTURE_COUNT; iLoop++)
    {
        //根據(jù)紋理句柄得到紋理對象
        glBindTexture(GL_TEXTURE_2D, textures[iLoop]);
        //讀取圖片像素
        pBytes = gltReadTGABits(szTextureFiles[iLoop],&iWidth, &iHeight,
                                &iComponents, &eFormat);
        
    //設(shè)置紋理參數(shù)
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);//紋理放大過濾,最鄰近過濾
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);//紋理縮小過濾黔宛,最鄰近過濾
        //紋理環(huán)繞近刘,這里是沿著S,T坐標(biāo)進(jìn)行紋理剪裁環(huán)繞,并對其坐標(biāo)內(nèi)的紋理單元采用上一個紋理單元的最后一行或者一列進(jìn)行采樣然后拼接臀晃,這樣避免了紋理剪裁環(huán)繞模式因?qū)R紋理圖像進(jìn)行切割成小方塊后而應(yīng)用到幾何體上出現(xiàn)縫隙的問題觉渴。
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
        //對像素解包,這里用的tag圖本身是沒有緊密包裝的徽惋,緊密包裝是按照本地硬件尋址大小而對像素地址進(jìn)行字節(jié)對齊的一種方式案淋,方便一次取更多的數(shù)據(jù)提高讀寫效率
        glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
        //加載紋理到內(nèi)存,紋理單元為2D圖像模式险绘,設(shè)置使用基層紋理踢京,設(shè)置壓縮方式為對RGB進(jìn)行壓縮方式,也可設(shè)置為原圖的壓縮方式通過iComponents指針找到宦棺,設(shè)置紋理的寬和高瓣距,設(shè)置紋理數(shù)據(jù)的類型為無符號字節(jié),像素數(shù)據(jù)的指針代咸,因無法將基本顏色值寫入到內(nèi)存蹈丸,這里通過像素的指針來指向基本顏色值
        glTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB, iWidth, iHeight, 0, eFormat, GL_UNSIGNED_BYTE, pBytes);
        //為所有紋理生成2D紋理單元的MIP貼圖層
        glGenerateMipmap(GL_TEXTURE_2D);
        // 釋放圖片像素
        free(pBytes);
    }
    GLfloat z;
    //批量管理頂點(diǎn)坐標(biāo),管理地板的頂點(diǎn)和紋理坐標(biāo)呐芥,指定頂點(diǎn)坐標(biāo)為三角帶鏈接逻杖,指定頂點(diǎn)坐標(biāo)和紋理對象數(shù)
    floorBatch.Begin(GL_TRIANGLE_STRIP, 28, 1);
    for(z = 60.0f; z >= 0.0f; z -=10.0f)
    {
        //設(shè)置地板的頂點(diǎn)的坐標(biāo)和紋理坐標(biāo)與頂點(diǎn)坐標(biāo)的映射關(guān)系,并且存儲到floorBatch容器中進(jìn)行批量管理
        floorBatch.MultiTexCoord2f(0, 0.0f, 0.0f);
        floorBatch.Vertex3f(-10.0f, -10.0f, z);
        
        floorBatch.MultiTexCoord2f(0, 1.0f, 0.0f);
        floorBatch.Vertex3f(10.0f, -10.0f, z);
    
        floorBatch.MultiTexCoord2f(0, 0.0f, 1.0f);
        floorBatch.Vertex3f(-10.0f, -10.0f, z - 10.0f);
        
        floorBatch.MultiTexCoord2f(0, 1.0f, 1.0f);
        floorBatch.Vertex3f(10.0f, -10.0f, z - 10.0f);
    }
    //批量管理結(jié)束標(biāo)識
    floorBatch.End();
    //批量管理頂點(diǎn)坐標(biāo)思瘟,管理天花板的頂點(diǎn)和紋理坐標(biāo)荸百,指定頂點(diǎn)坐標(biāo)為三角帶鏈接,指定頂點(diǎn)坐標(biāo)和紋理對象數(shù)
    ceilingBatch.Begin(GL_TRIANGLE_STRIP, 28, 1);
    for(z = 60.0f; z >= 0.0f; z -=10.0f)
    {
        //設(shè)置天花板的頂點(diǎn)的坐標(biāo)和紋理坐標(biāo)與頂點(diǎn)坐標(biāo)的映射關(guān)系滨攻,并且存儲到ceilingBatch容器中進(jìn)行批量管理
        ceilingBatch.MultiTexCoord2f(0, 0.0f, 1.0f);
        ceilingBatch.Vertex3f(-10.0f, 10.0f, z - 10.0f);
        
        ceilingBatch.MultiTexCoord2f(0, 1.0f, 1.0f);
        ceilingBatch.Vertex3f(10.0f, 10.0f, z - 10.0f);
        
        ceilingBatch.MultiTexCoord2f(0, 0.0f, 0.0f);
        ceilingBatch.Vertex3f(-10.0f, 10.0f, z);
        
        ceilingBatch.MultiTexCoord2f(0, 1.0f, 0.0f);
        ceilingBatch.Vertex3f(10.0f, 10.0f, z);
    }
    //批量管理結(jié)束標(biāo)識
    ceilingBatch.End();
     //批量管理頂點(diǎn)坐標(biāo)够话,管理左邊的墻的頂點(diǎn)和紋理坐標(biāo),指定頂點(diǎn)坐標(biāo)為三角帶鏈接铡买,指定頂點(diǎn)坐標(biāo)和紋理對象數(shù)
    leftWallBatch.Begin(GL_TRIANGLE_STRIP, 28, 1);
    for(z = 60.0f; z >= 0.0f; z -=10.0f)
    {
        //設(shè)置地板的頂點(diǎn)的坐標(biāo)和紋理坐標(biāo)與頂點(diǎn)坐標(biāo)的映射關(guān)系更鲁,并且存儲到leftWallBatch容器中進(jìn)行批量管理
        leftWallBatch.MultiTexCoord2f(0, 0.0f, 0.0f);
        leftWallBatch.Vertex3f(-10.0f, -10.0f, z);
        
        leftWallBatch.MultiTexCoord2f(0, 0.0f, 1.0f);
        leftWallBatch.Vertex3f(-10.0f, 10.0f, z);
        
        leftWallBatch.MultiTexCoord2f(0, 1.0f, 0.0f);
        leftWallBatch.Vertex3f(-10.0f, -10.0f, z - 10.0f);
        
        leftWallBatch.MultiTexCoord2f(0, 1.0f, 1.0f);
        leftWallBatch.Vertex3f(-10.0f, 10.0f, z - 10.0f);
    }
     //批量管理結(jié)束標(biāo)識
    leftWallBatch.End();
    //批量管理頂點(diǎn)坐標(biāo),管理右邊的墻的頂點(diǎn)和紋理坐標(biāo)奇钞,指定頂點(diǎn)坐標(biāo)為三角帶鏈接澡为,指定頂點(diǎn)坐標(biāo)和紋理對象數(shù)
    rightWallBatch.Begin(GL_TRIANGLE_STRIP, 28, 1);
    for(z = 60.0f; z >= 0.0f; z -=10.0f)
    {
        //設(shè)置地板的頂點(diǎn)的坐標(biāo)和紋理坐標(biāo)與頂點(diǎn)坐標(biāo)的映射關(guān)系,并且存儲到rightWallBatch容器中進(jìn)行批量管理
        rightWallBatch.MultiTexCoord2f(0, 0.0f, 0.0f);
        rightWallBatch.Vertex3f(10.0f, -10.0f, z);
        
        rightWallBatch.MultiTexCoord2f(0, 0.0f, 1.0f);
        rightWallBatch.Vertex3f(10.0f, 10.0f, z);
        
        rightWallBatch.MultiTexCoord2f(0, 1.0f, 0.0f);
        rightWallBatch.Vertex3f(10.0f, -10.0f, z - 10.0f);
        
        rightWallBatch.MultiTexCoord2f(0, 1.0f, 1.0f);
        rightWallBatch.Vertex3f(10.0f, 10.0f, z - 10.0f);
    }
     //批量管理結(jié)束標(biāo)識
    rightWallBatch.End();
}

void ShutdownRC(void)
{
    //刪除紋理對象
    glDeleteTextures(TEXTURE_COUNT, textures);
}

void SpecialKeys(int key, int x, int y)
{
    // 通過前后建控制模型視圖的z坐標(biāo)
    if(key == GLUT_KEY_UP)
        viewZ += 0.5f;
    if(key == GLUT_KEY_DOWN)
        viewZ -= 0.5f;
    //重新渲染
    glutPostRedisplay();
}

void ChangeSize(int w, int h)
{
    GLfloat fAspect;
    if(h == 0)
        h = 1;
    //設(shè)置視口大小
    glViewport(0, 0, w, h);
    fAspect = (GLfloat)w/(GLfloat)h;
    //進(jìn)行透視投影
    viewFrustum.SetPerspective(80.0f,fAspect,1.0,120.0);
    //將投影矩陣載入投影堆棧中
    projectionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix());
    //設(shè)置管線管理模型視圖矩陣堆棧和投影矩陣堆棧
    transformPipeline.SetMatrixStacks(modelViewMatrix, projectionMatrix);
    
}

void RenderScene(void)
{
    //清理顏色緩沖區(qū)
    glClear(GL_COLOR_BUFFER_BIT);
    //推入一個單位矩陣到模型視圖矩陣堆棧當(dāng)中
    modelViewMatrix.PushMatrix();
    //模型視圖矩陣變換景埃,沿z軸移動變換
    modelViewMatrix.Translate(0.0f, 0.0f, viewZ);
    //使用交換存儲著色器可以將紋理坐標(biāo)應(yīng)用到幾何體上媒至,這里transformPipeline.GetModelViewProjectionMatrix()將投影矩陣轉(zhuǎn)換成單元的模型視圖投影矩陣顶别,設(shè)置一重紋理貼圖
    shaderManager.UseStockShader(GLT_SHADER_TEXTURE_REPLACE, transformPipeline.GetModelViewProjectionMatrix(), 0);
    //得到地板紋理對象
    glBindTexture(GL_TEXTURE_2D, textures[TEXTURE_FLOOR]);
    //渲染地板
    floorBatch.Draw();
    //得到天花板紋理對象
    glBindTexture(GL_TEXTURE_2D, textures[TEXTURE_CEILING]);
    //渲染天花板
    ceilingBatch.Draw();
    //得到墻紋理對象
    glBindTexture(GL_TEXTURE_2D, textures[TEXTURE_BRICK]);
    //渲染左邊的墻
    leftWallBatch.Draw();
    //渲染右邊的墻
    rightWallBatch.Draw();
    //彈出模型視圖矩陣,每次重新渲染要把結(jié)果給到ChangeSize中的管線進(jìn)行管理
    modelViewMatrix.PopMatrix();
    // 雙緩沖渲染時交換前后臺渲染數(shù)據(jù)
    glutSwapBuffers();
}

int main(int argc, char *argv[])
{
    gltSetWorkingDirectory(argv[0]);
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(800, 600);
    glutCreateWindow("Anisotropic Tunnel");
    glutReshapeFunc(ChangeSize);
    glutSpecialFunc(SpecialKeys);
    glutDisplayFunc(RenderScene);
    //創(chuàng)建菜單管理
    glutCreateMenu(ProcessMenu);
    //創(chuàng)建各個菜單管理的操作
    glutAddMenuEntry("GL_NEAREST",0);
    glutAddMenuEntry("GL_LINEAR",1);
    glutAddMenuEntry("GL_NEAREST_MIPMAP_NEAREST",2);
    glutAddMenuEntry("GL_NEAREST_MIPMAP_LINEAR", 3);
    glutAddMenuEntry("GL_LINEAR_MIPMAP_NEAREST", 4);
    glutAddMenuEntry("GL_LINEAR_MIPMAP_LINEAR", 5);
    glutAddMenuEntry("Anisotropic Filter", 6);
    glutAddMenuEntry("Anisotropic Off", 7);
    //菜單管理的事件觸發(fā)方式
    glutAttachMenu(GLUT_RIGHT_BUTTON);
    GLenum err = glewInit();
    if (GLEW_OK != err) {
        fprintf(stderr, "GLEW Error: %s\n", glewGetErrorString(err));
        return 1;
    }
    SetupRC();
    glutMainLoop();
    //刪除紋理對象
    ShutdownRC();
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拒啰,一起剝皮案震驚了整個濱河市驯绎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谋旦,老刑警劉巖剩失,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異册着,居然都是意外死亡拴孤,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門甲捏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來演熟,“玉大人,你說我怎么就攤上這事司顿∶⒋猓” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵大溜,是天一觀的道長化漆。 經(jīng)常有香客問我,道長钦奋,這世上最難降的妖魔是什么获三? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮锨苏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘棺聊。我一直安慰自己伞租,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布限佩。 她就那樣靜靜地躺著葵诈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪祟同。 梳的紋絲不亂的頭發(fā)上作喘,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天,我揣著相機(jī)與錄音晕城,去河邊找鬼泞坦。 笑死,一個胖子當(dāng)著我的面吹牛砖顷,可吹牛的內(nèi)容都是我干的贰锁。 我是一名探鬼主播赃梧,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼豌熄!你這毒婦竟也來了授嘀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤锣险,失蹤者是張志新(化名)和其女友劉穎蹄皱,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芯肤,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡巷折,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了纷妆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盔几。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖掩幢,靈堂內(nèi)的尸體忽然破棺而出逊拍,到底是詐尸還是另有隱情,我是刑警寧澤际邻,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布芯丧,位于F島的核電站,受9級特大地震影響世曾,放射性物質(zhì)發(fā)生泄漏缨恒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一轮听、第九天 我趴在偏房一處隱蔽的房頂上張望骗露。 院中可真熱鬧,春花似錦血巍、人聲如沸萧锉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽柿隙。三九已至,卻和暖如春鲫凶,著一層夾襖步出監(jiān)牢的瞬間禀崖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工螟炫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留波附,地道東北人。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像叶雹,于是被迫代替她去往敵國和親财饥。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 一折晦、紋理基礎(chǔ) 3D圖形渲染中最基本的操作就是對一個表面應(yīng)用紋理钥星。紋理可以表現(xiàn)只從網(wǎng)格的幾何形狀無法得到的附加細(xì)節(jié)。...
    cain_huang閱讀 8,806評論 0 7
  • 紋理的基礎(chǔ)知識 2D 紋理 2d紋理是OpenGlES中最基礎(chǔ)和普遍的一種紋理結(jié)構(gòu)满着。一個2d紋理谦炒,就是圖片的數(shù)據(jù)的...
    Zsj_Sky閱讀 5,410評論 0 8
  • 紋理只是一種能夠應(yīng)用到場景中的三角形上的圖像數(shù)據(jù),它通過經(jīng)過過濾的紋理單元(texel风喇,相當(dāng)于紋理的像素)填充到實(shí)...
    Gaolex閱讀 2,830評論 0 1
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,139評論 25 707
  • Lind宁改,我姐們,知性魂莫,漂亮还蹲。看完《明月千里寄江河》后提問兼感慨如下: 天啦耙考,你在練那個法什么功不成谜喊? 眼睛還帶神...
    師太你就從了吧閱讀 342評論 1 1