Metal入門(mén)教程(七)天空盒全景

前言

Metal入門(mén)教程(一)圖片繪制
Metal入門(mén)教程(二)三維變換
Metal入門(mén)教程(三)攝像頭采集渲染
Metal入門(mén)教程(四)灰度計(jì)算
Metal入門(mén)教程(五)視頻渲染
Metal入門(mén)教程(六)邊界檢測(cè)

前面的教程介紹了Metal的圖片繪制疙描、三維變換、視頻渲染嚼贡、用MetalPerformanceShaders處理數(shù)據(jù)以及用計(jì)算管道實(shí)現(xiàn)灰度計(jì)算和sobel邊界檢測(cè)违柏,這次對(duì)Metal的三維變換做更復(fù)雜的嘗試——天空盒毁兆。

Metal系列教程的代碼地址
OpenGL ES系列教程在這里

你的star和fork是我的源動(dòng)力涮因,你的意見(jiàn)能讓我走得更遠(yuǎn)

正文

核心思路

天空盒的原理:想象有一個(gè)正方體坷虑,正方體的六個(gè)面都貼著紋理甲馋;攝像機(jī)在正方體的中心,近平面在正方體內(nèi)部迄损,遠(yuǎn)平面在正方體外面定躏,隨著攝像機(jī)的旋轉(zhuǎn)可以看到整個(gè)正方體的貼圖。
基于此芹敌,我們可以初步確定實(shí)現(xiàn)的思路:
1痊远、在三維空間繪制一個(gè)正方體;
2氏捞、給正方體六個(gè)面進(jìn)行貼圖碧聪;
3、把攝像機(jī)放在正方體中心液茎;
4逞姿、隨著時(shí)間改變攝像機(jī)的位置;

接下來(lái)我們考慮兩個(gè)問(wèn)題:
六個(gè)面共十二個(gè)三角形捆等,在繪制過(guò)程中是否會(huì)重疊以及是否需要使用深度測(cè)試滞造?
按照我們的思路,十二個(gè)三角形中楚里,每個(gè)三角形最多與另外一個(gè)三角形重疊(試想一條線穿過(guò)正方體断部,除了頂點(diǎn)外最多只能接觸兩個(gè)面)。
基于上面的分析班缎,因?yàn)樵谡襟w的中心蝴光,近平面在內(nèi)部而遠(yuǎn)平面在外面,重疊的兩個(gè)三角形必然一個(gè)在平截體的內(nèi)部达址,一個(gè)在平截體的外部蔑祟。故而這里不使用深度測(cè)試。

具體步驟

1沉唠、繪制一個(gè)正方體

首先疆虚,我們定義8個(gè)頂點(diǎn)。

        // 頂點(diǎn)坐標(biāo)满葛,                      頂點(diǎn)顏色径簿,                  紋理坐標(biāo),
        // 正方體上面的四個(gè)點(diǎn)
        {{-0.5f, 0.5f, 0.5f, 1.0f},      {1.0f, 0.0f, 0.0f},       {0.0f, 1.0f}},//左上 0
        {{0.5f, 0.5f, 0.5f, 1.0f},       {0.0f, 1.0f, 0.0f},       {1.0f, 1.0f}},//右上 1
        {{-0.5f, -0.5f, 0.5f, 1.0f},     {0.0f, 0.0f, 1.0f},       {0.0f, 0.0f}},//左下 2
        {{0.5f, -0.5f, 0.5f, 1.0f},      {1.0f, 1.0f, 1.0f},       {1.0f, 0.0f}},//右下 3
        
        // 正方體下面的四個(gè)點(diǎn)
        {{-0.5f, 0.5f, -0.5f, 1.0f},      {1.0f, 0.0f, 0.0f},       {0.0f, 1.0f}},//左上 4
        {{0.5f, 0.5f, -0.5f, 1.0f},       {0.0f, 1.0f, 0.0f},       {1.0f, 1.0f}},//右上 5
        {{-0.5f, -0.5f, -0.5f, 1.0f},     {0.0f, 0.0f, 1.0f},       {0.0f, 0.0f}},//左下 6
        {{0.5f, -0.5f, -0.5f, 1.0f},      {1.0f, 1.0f, 1.0f},       {1.0f, 0.0f}},//右下 7
2嘀韧、頂點(diǎn)與紋理位置對(duì)應(yīng)

假設(shè)把下圖的拼成一個(gè)正方體篇亭,根據(jù)我們定義的0~7號(hào)節(jié)點(diǎn),可以一一標(biāo)志出對(duì)應(yīng)的頂點(diǎn)所在锄贷,如下:


頂點(diǎn)標(biāo)注圖
3译蒂、紋理轉(zhuǎn)換

上面的頂點(diǎn)標(biāo)注圖在加載曼月、處理的過(guò)程中并不方便,故而需要把圖片預(yù)處理成width=x, height=6*x的大小柔昼。


天空盒紋理圖

根據(jù)前面兩個(gè)圖哑芹,我們可以推導(dǎo)出最終天空盒的頂點(diǎn)數(shù)據(jù)如下:

        // 頂點(diǎn)坐標(biāo),                      頂點(diǎn)顏色捕透,                  紋理坐標(biāo)聪姿,

        // 上面
        {{-6.0f, 6.0f, 6.0f, 1.0f},      {1.0f, 0.0f, 0.0f},       {0.0f, 2.0f/6}},//左上 0
        {{-6.0f, -6.0f, 6.0f, 1.0f},     {0.0f, 0.0f, 1.0f},       {0.0f, 3.0f/6}},//左下 2
        {{6.0f, -6.0f, 6.0f, 1.0f},      {1.0f, 1.0f, 1.0f},       {1.0f, 3.0f/6}},//右下 3

        {{-6.0f, 6.0f, 6.0f, 1.0f},      {1.0f, 0.0f, 0.0f},       {0.0f, 2.0f/6}},//左上 0
        {{6.0f, 6.0f, 6.0f, 1.0f},       {0.0f, 1.0f, 0.0f},       {1.0f, 2.0f/6}},//右上 1
        {{6.0f, -6.0f, 6.0f, 1.0f},      {1.0f, 1.0f, 1.0f},       {1.0f, 3.0f/6}},//右下 3


        // 下面
        {{-6.0f, 6.0f, -6.0f, 1.0f},     {1.0f, 0.0f, 0.0f},       {0.0f, 4.0f/6}},//左上 4
        {{6.0f, 6.0f, -6.0f, 1.0f},      {0.0f, 1.0f, 0.0f},       {1.0f, 4.0f/6}},//右上 5
        {{6.0f, -6.0f, -6.0f, 1.0f},     {1.0f, 1.0f, 1.0f},       {1.0f, 3.0f/6}},//右下 7

        {{-6.0f, 6.0f, -6.0f, 1.0f},     {1.0f, 0.0f, 0.0f},       {0.0f, 4.0f/6}},//左上 4
        {{-6.0f, -6.0f, -6.0f, 1.0f},    {0.0f, 0.0f, 1.0f},       {0.0f, 3.0f/6}},//左下 6
        {{6.0f, -6.0f, -6.0f, 1.0f},     {1.0f, 1.0f, 1.0f},       {1.0f, 3.0f/6}},//右下 7
        
        // 左面
        {{-6.0f, 6.0f, 6.0f, 1.0f},      {1.0f, 0.0f, 0.0f},       {0.0f, 1.0f/6}},//左上 0
        {{-6.0f, -6.0f, 6.0f, 1.0f},     {0.0f, 0.0f, 1.0f},       {1.0f, 1.0f/6}},//左下 2
        {{-6.0f, 6.0f, -6.0f, 1.0f},     {1.0f, 0.0f, 0.0f},       {0.0f, 2.0f/6}},//左上 4

        {{-6.0f, -6.0f, 6.0f, 1.0f},     {0.0f, 0.0f, 1.0f},       {1.0f, 1.0f/6}},//左下 2
        {{-6.0f, 6.0f, -6.0f, 1.0f},     {1.0f, 0.0f, 0.0f},       {0.0f, 2.0f/6}},//左上 4
        {{-6.0f, -6.0f, -6.0f, 1.0f},    {0.0f, 0.0f, 1.0f},       {1.0f, 2.0f/6}},//左下 6


        // 右面
        {{6.0f, 6.0f, 6.0f, 1.0f},       {0.0f, 1.0f, 0.0f},       {1.0f, 0.0f/6}},//右上 1
        {{6.0f, -6.0f, 6.0f, 1.0f},      {1.0f, 1.0f, 1.0f},       {0.0f, 0.0f/6}},//右下 3
        {{6.0f, 6.0f, -6.0f, 1.0f},      {0.0f, 1.0f, 0.0f},       {1.0f, 1.0f/6}},//右上 5

        {{6.0f, -6.0f, 6.0f, 1.0f},      {1.0f, 1.0f, 1.0f},       {0.0f, 0.0f/6}},//右下 3
        {{6.0f, 6.0f, -6.0f, 1.0f},      {0.0f, 1.0f, 0.0f},       {1.0f, 1.0f/6}},//右上 5
        {{6.0f, -6.0f, -6.0f, 1.0f},     {1.0f, 1.0f, 1.0f},       {0.0f, 1.0f/6}},//右下 7
        
        // 前面
        {{-6.0f, -6.0f, 6.0f, 1.0f},     {0.0f, 0.0f, 1.0f},       {0.0f, 4.0f/6}},//左下 2
        {{6.0f, -6.0f, 6.0f, 1.0f},      {1.0f, 1.0f, 1.0f},       {1.0f, 4.0f/6}},//右下 3
        {{6.0f, -6.0f, -6.0f, 1.0f},     {1.0f, 1.0f, 1.0f},       {1.0f, 5.0f/6}},//右下 7

        {{-6.0f, -6.0f, 6.0f, 1.0f},     {0.0f, 0.0f, 1.0f},       {0.0f, 4.0f/6}},//左下 2
        {{-6.0f, -6.0f, -6.0f, 1.0f},    {0.0f, 0.0f, 1.0f},       {0.0f, 5.0f/6}},//左下 6
        {{6.0f, -6.0f, -6.0f, 1.0f},     {1.0f, 1.0f, 1.0f},       {1.0f, 5.0f/6}},//右下 7

        // 后面
        {{-6.0f, 6.0f, 6.0f, 1.0f},      {1.0f, 0.0f, 0.0f},       {1.0f, 5.0f/6}},//左上 0
        {{6.0f, 6.0f, 6.0f, 1.0f},       {0.0f, 1.0f, 0.0f},       {0.0f, 5.0f/6}},//右上 1
        {{6.0f, 6.0f, -6.0f, 1.0f},      {0.0f, 1.0f, 0.0f},       {0.0f, 6.0f/6}},//右上 5

        {{-6.0f, 6.0f, 6.0f, 1.0f},      {1.0f, 0.0f, 0.0f},       {1.0f, 5.0f/6}},//左上 0
        {{-6.0f, 6.0f, -6.0f, 1.0f},     {1.0f, 0.0f, 0.0f},       {1.0f, 6.0f/6}},//左上 4
        {{6.0f, 6.0f, -6.0f, 1.0f},      {0.0f, 1.0f, 0.0f},       {0.0f, 6.0f/6}},//右上 5
        

有了以上的頂點(diǎn)數(shù)據(jù)和紋理數(shù)據(jù),我們可以接著

4乙嘀、調(diào)整投影矩陣和模型變換矩陣

這里我們用GLKMatrix4MakeLookAt來(lái)生成模型變換矩陣

    // 調(diào)整眼睛的位置
    self.eyePosition = GLKVector3Make(2.0f * sinf(angle),
                                      2.0f * cosf(angle),
                                      0.0f);
    
    // 調(diào)整觀察的位置
    self.lookAtPosition = GLKVector3Make(2.0f * sinf(angleLook),
                                         2.0f * cosf(angleLook),
                                         2.0f);

    GLKMatrix4 modelViewMatrix = GLKMatrix4MakeLookAt(
                                                      self.eyePosition.x,
                                                      self.eyePosition.y,
                                                      self.eyePosition.z,
                                                      self.lookAtPosition.x,
                                                      self.lookAtPosition.y,
                                                      self.lookAtPosition.z,
                                                      self.upVector.x,
                                                      self.upVector.y,
                                                      self.upVector.z); // 模型變換矩陣

這里的眼睛位置就是平截體起點(diǎn)咳燕,觀察方向是指眼睛到遠(yuǎn)平面中心點(diǎn)的方向,如下:


投影矩陣如下乒躺,對(duì)應(yīng)的參數(shù)是上面的視野角、寬高比低缩、近平面距離嘉冒、遠(yuǎn)平面距離。
GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(85.0f), aspect, 0.1f, 20.f); // 投影變換矩陣

5咆繁、shader繪制
vertex RasterizerData
vertexShader(uint vertexID [[ vertex_id ]], // 頂點(diǎn)索引
             constant LYVertex *vertexArray [[ buffer(LYVertexInputIndexVertices) ]], // 頂點(diǎn)數(shù)據(jù)
             constant LYMatrix *matrix [[ buffer(LYVertexInputIndexMatrix) ]]) { // 變換矩陣
    RasterizerData out; // 輸出數(shù)據(jù)
    out.clipSpacePosition = matrix->projectionMatrix * matrix->modelViewMatrix * vertexArray[vertexID].position; // 變換處理
    out.textureCoordinate = vertexArray[vertexID].textureCoordinate; // 紋理坐標(biāo)
    out.pixelColor = vertexArray[vertexID].color; // 頂點(diǎn)顏色讳推,調(diào)試用
    return out;
}

fragment float4
samplingShader(RasterizerData input [[stage_in]],
               texture2d<half> textureColor [[ texture(LYFragmentInputIndexTexture) ]])
{
    constexpr sampler textureSampler (mag_filter::linear,
                                      min_filter::linear); // 采樣器
    half4 colorTex = textureColor.sample(textureSampler, input.textureCoordinate); // 紋理顏色
//    half4 colorTex = half4(input.pixelColor.x, input.pixelColor.y, input.pixelColor.z, 1); // 頂點(diǎn)顏色,方便調(diào)試
    return float4(colorTex);
}

頂點(diǎn)shader是正常對(duì)頂點(diǎn)進(jìn)行變換處理玩般,紋理坐標(biāo)银觅、頂點(diǎn)顏色讀取buffer的值;
片元shader是從紋理中讀取顏色坏为,為了方便調(diào)試究驴,可以注釋上面的紋理顏色,采用下面的頂點(diǎn)顏色可以快速定位紋理坐標(biāo)匀伏、頂點(diǎn)坐標(biāo)的問(wèn)題洒忧。

注意事項(xiàng)

在繪制正方體的時(shí)候,可以把正方體縮小够颠,整個(gè)放在平截體內(nèi)熙侍,這樣可以看到完整的正方體,便于調(diào)整頂點(diǎn)坐標(biāo)和紋理坐標(biāo)履磨。
此時(shí)需要解決重復(fù)渲染的問(wèn)題蛉抓,常用兩種辦法:

  • 方案1、圖元朝向做剔除剃诅;
        [renderEncoder setFrontFacingWinding:MTLWindingCounterClockwise];
        [renderEncoder setCullMode:MTLCullModeBack];
  • 方案2巷送、深度測(cè)試剔除;
    // 創(chuàng)建深度緩存
    MTLDepthStencilDescriptor *depthStencilDescriptor = [MTLDepthStencilDescriptor new];
    depthStencilDescriptor.depthCompareFunction = MTLCompareFunctionLess;
    self.depthStencilState = [self.mtkView.device newDepthStencilStateWithDescriptor:depthStencilDescriptor];

    // 然后設(shè)置深度測(cè)試
    [renderEncoder setDepthStencilState:self.depthStencilState];

實(shí)現(xiàn)過(guò)程還有另外的一個(gè)問(wèn)題综苔,棱角效果太明顯惩系。這個(gè)是因?yàn)樘炜蘸刑∥徊恚芡队暗浇矫娴拿娣e過(guò)小,導(dǎo)致棱角分明堡牡。解決方案是把天空盒的邊長(zhǎng)適當(dāng)放大(不要超過(guò)遠(yuǎn)平面)抒抬,使得天空盒更多區(qū)域能投影到屏幕,減少棱角區(qū)域的面積晤柄。

附錄 ---- 天空盒的另一種簡(jiǎn)單實(shí)現(xiàn)

注意看前文步驟擦剑,shader讀取紋理用的是texture2d格式,而天空盒還有另外一種方案是通過(guò)立方體紋理textureCube讀取芥颈。
由于篇幅惠勒,不再贅述具體步驟,詳見(jiàn)demo--TextureCube爬坑。
需要注意的是:
1纠屋、紋理加載方案不同,要用-textureCubeDescriptorWithPixelFormat方法盾计,同時(shí)紋理上傳接口也不相同售担。如下:

    MTLTextureDescriptor *textureDescriptor = [MTLTextureDescriptor textureCubeDescriptorWithPixelFormat:MTLPixelFormatRGBA8Unorm size:image.size.width mipmapped:NO];
    self.texture = [self.mtkView.device newTextureWithDescriptor:textureDescriptor];
    
    Byte *imageBytes = [self loadImage:image];
    NSInteger pixels = image.size.width * image.size.width;
    if (imageBytes) {
        for (int i = 0; i < 6; i++)
        {
            [self.texture replaceRegion:MTLRegionMake2D(0, 0, image.size.width, image.size.width)
                            mipmapLevel:0
                                  slice:i
                              withBytes:imageBytes + (i * pixels * 4)
                            bytesPerRow:4 * (NSInteger)image.size.width
                          bytesPerImage:pixels * 4];
        }
        
        free(imageBytes);
        imageBytes = NULL;
    }

2、shader中的紋理坐標(biāo)不同署辉,這里的紋理坐標(biāo)使用的是頂點(diǎn)坐標(biāo)族铆,而之前的方案使用的是頂點(diǎn)的紋理坐標(biāo)。

out.textureCoordinate = vertexArray[vertexID].position.xyz;

注意哭尝,這里使用的是頂點(diǎn)變換前的坐標(biāo)哥攘,如果使用頂點(diǎn)變換后的坐標(biāo),會(huì)導(dǎo)致的現(xiàn)象是視角無(wú)法旋轉(zhuǎn)材鹦。

// 試試代碼改為下面這段
out.textureCoordinate = out.clipSpacePosition.xyz;

總結(jié)

demo嘗試實(shí)現(xiàn)天空盒的效果逝淹,通過(guò)較為復(fù)雜的方式,去更好學(xué)習(xí)天空盒的原理侠姑。
通過(guò)對(duì)頂點(diǎn)创橄、紋理、變換矩陣的處理莽红,能更好掌握?qǐng)D形學(xué)中三維空間的理解妥畏。
具體的代碼在這里

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末安吁,一起剝皮案震驚了整個(gè)濱河市醉蚁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鬼店,老刑警劉巖网棍,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異妇智,居然都是意外死亡滥玷,警方通過(guò)查閱死者的電腦和手機(jī)氏身,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)惑畴,“玉大人蛋欣,你說(shuō)我怎么就攤上這事∪绱” “怎么了陷虎?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)杠袱。 經(jīng)常有香客問(wèn)我尚猿,道長(zhǎng),這世上最難降的妖魔是什么楣富? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任凿掂,我火速辦了婚禮,結(jié)果婚禮上纹蝴,老公的妹妹穿的比我還像新娘缠劝。我一直安慰自己,他們只是感情好骗灶,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著秉馏,像睡著了一般耙旦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上萝究,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天免都,我揣著相機(jī)與錄音,去河邊找鬼帆竹。 笑死绕娘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的栽连。 我是一名探鬼主播险领,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼秒紧!你這毒婦竟也來(lái)了绢陌?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤熔恢,失蹤者是張志新(化名)和其女友劉穎脐湾,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體叙淌,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡秤掌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年愁铺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闻鉴。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡茵乱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出椒拗,到底是詐尸還是另有隱情似将,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布蚀苛,位于F島的核電站在验,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏堵未。R本人自食惡果不足惜腋舌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望渗蟹。 院中可真熱鬧块饺,春花似錦、人聲如沸雌芽。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)世落。三九已至淮腾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間屉佳,已是汗流浹背谷朝。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留武花,地道東北人圆凰。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像体箕,于是被迫代替她去往敵國(guó)和親专钉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

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

  • 本文首發(fā)于個(gè)人博客:Lam's Blog - 【OpenGL ES】入門(mén)及繪制一個(gè)三角形累铅,文章由MarkDown語(yǔ)...
    格子林ll閱讀 7,274評(píng)論 2 18
  • 教程 OpenGLES入門(mén)教程1-Tutorial01-GLKitOpenGLES入門(mén)教程2-Tutorial02...
    落影l(fā)oyinglin閱讀 10,546評(píng)論 19 22
  • <轉(zhuǎn)>我也忘了轉(zhuǎn)自哪里,抱歉,感謝原作者 什么是Shader Shader(著色器)是一段能夠針對(duì)3D對(duì)象進(jìn)行操作...
    星易乾川閱讀 5,595評(píng)論 1 16
  • 原創(chuàng)日記(一百零一)2018.06.27天氣 晴 起初觀看佛學(xué)入門(mén)書(shū)籍驶沼,里邊常說(shuō)儒釋道。重點(diǎn)強(qiáng)調(diào)了儒家經(jīng)典思想争群,這...
    黑磚頭文化閱讀 1,074評(píng)論 0 1
  • 上臺(tái)演講回怜、表演時(shí)緊張是極其普遍的現(xiàn)象,只要我們自己有正確的認(rèn)知覺(jué)得這是正常的,我們才能更坦然的面對(duì)觀眾玉雾,把注意...
    最?lèi)?ài)大小白閱讀 119評(píng)論 0 0