Metal 笔记

Metal的大坑
    1 顶点buffer,顶点是4个float对齐的,index数据没发现对齐要求
    2 顶点shader,你输出的顶点(projMatrix*modelviewMatrix*pos) 范围:xy是[-1,1],z是[0,1]
    3 片段shader,片段shader给你输入的点:in.position,xy的范围是[0,渲染目标的宽高],比如渲染到1024*1024的纹理,xy范围就是[0,1024]
                z的范围还是[0,1]

device:
    代表渲染环境,整个程序只有一个,是个单例对象,可以从view获得,也可以单独获得
    1 创建commandQueue
    2 创建纹理
    3 创建 library(shader)
    4 创建 renderPipleLine( 相当于OpenGL里面shader链接后的program)
    5 创建 buffer (vbo)
library:
    就是shader:
    MTL::Library* pLibrary = _pDevice->newLibrary( NS::String::string(shaderSrc, UTF8StringEncoding), nullptr, &pError );
    //通过shader里面的函数名字拿到函数
    MTL::Function* pVertexFn = pLibrary->newFunction( NS::String::string("vertexMain", UTF8StringEncoding) );
    MTL::Function* pFragFn = pLibrary->newFunction( NS::String::string("fragmentMain", UTF8StringEncoding) );

buffer:
    相当于vbo:
    
    MTL::Buffer* pVertexPositionsBuffer = _pDevice->newBuffer( positionsDataSize, MTL::ResourceStorageModeManaged );
    MTL::Buffer* pVertexColorsBuffer = _pDevice->newBuffer( colorDataSize, MTL::ResourceStorageModeManaged );
    //拷贝数据
    memcpy( pVertexPositionsBuffer->contents(), positions, positionsDataSize );
    memcpy( pVertexColorsBuffer->contents(), colors, colorDataSize );
    //上传到显卡
    pVertexPositionsBuffer->didModifyRange( NS::Range::Make( 0, _pVertexPositionsBuffer->length() ) );
    pVertexColorsBuffer->didModifyRange( NS::Range::Make( 0, _pVertexColorsBuffer->length() ) );
纹理:
    使用纹理描述符来创建,
    纹理描述符对象,直接new
    MTLTextureDescriptor *texDescriptor = [MTLTextureDescriptor new];
        texDescriptor.textureType = MTLTextureType2D;
        texDescriptor.width = 512;
        texDescriptor.height = 512;
        texDescriptor.pixelFormat = MTLPixelFormatRGBA8Unorm;
        texDescriptor.usage = MTLTextureUsageRenderTarget |
                              MTLTextureUsageShaderRead;
                              
    _renderTargetTexture = [_device newTextureWithDescriptor:texDescriptor];

RenderPipeline(RenderPipelineState):
        RenderPipelineDescriptor desp
        desp.xxxx  设置。。。
    就是指定shader,开启混合,深度测试,如渲染目标的像素格式,深度buffer的像素格式
        
    MTL::RenderPipelineState* _pIntersectProgram = _pDevice->newRenderPipelineState( pDesc, &pError );

RenderCommandEncoder(创建的时候就要指定渲染目标)就叫renderpass吧:
    可以渲染一个mesh
    
    1 指定colorAttachments:纹理或者view
        需要用到 RenderPassDescriptor
        渲染到纹理需:
            renderPassDescriptor.colorAttachments[0].texture = _renderTargetTexture;
            renderPassDescriptor.colorAttachments[0].loadAction = MTLLoadActionClear;
            renderPassDescriptor.colorAttachments[0].clearColor = MTLClearColorMake(1, 1, 1, 1);
            renderPassDescriptor.colorAttachments[0].storeAction = MTLStoreActionStore;
            //用commandBuffer来创建
            RenderCommandEncoder renderEncoder = commandBuffer.renderCommandEncoderWithDescriptor
        渲染到窗口:
            renderPassDescriptor = view.currentRenderPassDescriptor;
            RenderCommandEncoder renderEncoder = commandBuffer.renderCommandEncoderWithDescriptor
            
    2 指定用什么程序来渲染pipeline
        renderEncoder.setRenderPipelineState(renderPipeline);
        
    3 指定shader用到的各种数据
        //设置渲染方式
        renderEncoder.drawPrimitives(MTLPrimitiveTypeTriangle..)
    
        //设置纹理
        renderEncoder setFragmentTexture:_renderTargetTexture atIndex:AAPLTextureInputIndexColor
        
        //设置mesh的顶点数据,可以通过buffer来指定,这样才效率高。
            renderEncoder->setVertexBuffer( _pVertexPositionsBuffer, 0, 0 );
            renderEncoder->setVertexBuffer( _pVertexColorsBuffer, 0, 1 );
            
            renderEncoder->setVertexBytes(data,len)//低效
    
    renderEncoder.endEncoding()//这之后这个对象就可以销毁了,东西已经保存在commandQueue里面了

commandBuffer:
    创建多个renderEncoder,提交渲染,显示渲染结果到view
    
        commandBuffer presentDrawable:view.currentDrawable
    commandBuffer commit
CommandQueue:
    创建commandBuffer
        [_commandQueue commandBuffer];
        

onDraw(){
    CommandQueue 创建一个 commandBuffer
    
    commandBuffer 创建若干个RenderCommandEncoder 有几个mesh 就创建几个
}

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值