当前位置: 首页>>代码示例>>C++>>正文


C++ VertexArray::setAttributes方法代码示例

本文整理汇总了C++中VertexArray::setAttributes方法的典型用法代码示例。如果您正苦于以下问题:C++ VertexArray::setAttributes方法的具体用法?C++ VertexArray::setAttributes怎么用?C++ VertexArray::setAttributes使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在VertexArray的用法示例。


在下文中一共展示了VertexArray::setAttributes方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。

示例1: draw

void PassForward_Generic::draw()
{
    if(m_commands.empty()) { return; }
    ++m_frame;

    static const VBO_RID s_vboids[] = {VBO_GENERIC_PARAMS1, VBO_GENERIC_PARAMS2};
    i3d::DeviceContext *dc  = atmGetGLDeviceContext();
    RenderTarget *rt = atmGetBackRenderTarget();
    Buffer *vbo_params = atmGetVertexBuffer(s_vboids[m_frame%2]);
    rt->setDepthStencilBuffer(atmGetRenderTarget(RT_GBUFFER)->getDepthStencilBuffer());
    dc->setBlendState(atmGetBlendState(BS_BLEND_ALPHA));
    dc->setDepthStencilState(atmGetDepthStencilState(DS_DEPTH_ENABLED));
    dc->setRenderTarget(rt);

    for(auto si=m_commands.begin(); si!=m_commands.end(); ++si) {
        const ModelParamCont &mm = si->second;
        for(auto mi=mm.begin(); mi!=mm.end(); ++mi) {
            m_params.insert(m_params.end(), mi->second.begin(), mi->second.end());
        }
    }
    if(!m_params.empty()) {
        size_t capacity = vbo_params->getDesc().size;
        size_t size_byte = sizeof(InstanceParams)*m_params.size();
        istAssert(size_byte < capacity);
        MapAndWrite(dc, vbo_params, &m_params[0], std::min<size_t>(size_byte, capacity));
        m_params.clear();

        static const VertexDesc transform_descs[] = {
            {GLSL_INSTANCE_TRANSFORM1, I3D_FLOAT32,4,  0, false, 1},
            {GLSL_INSTANCE_TRANSFORM2, I3D_FLOAT32,4, 16, false, 1},
            {GLSL_INSTANCE_TRANSFORM3, I3D_FLOAT32,4, 32, false, 1},
            {GLSL_INSTANCE_TRANSFORM4, I3D_FLOAT32,4, 48, false, 1},
            {GLSL_INSTANCE_PARAM1,     I3D_FLOAT32,4, 64, false, 1},
            {GLSL_INSTANCE_PARAM2,     I3D_FLOAT32,4, 80, false, 1},
            {GLSL_INSTANCE_PARAM3,     I3D_FLOAT32,4, 96, false, 1},
            {GLSL_INSTANCE_PARAM4,     I3D_FLOAT32,4,112, false, 1},
        };
        size_t params_offset = 0;
        for(auto si=m_commands.begin(); si!=m_commands.end(); ++si) {
            const ModelParamCont &mm = si->second;

            AtomicShader *sh = atmGetShader(si->first);
            sh->bind();
            for(auto mi=mm.begin(); mi!=mm.end(); ++mi) {
                if(mi->second.empty()) { continue; }

                const ModelInfo &model = *atmGetModelInfo(mi->first);
                const ParamCont &params = mi->second;
                VertexArray *va = atmGetVertexArray(model.vertices);
                Buffer *ibo = atmGetIndexBuffer(model.indices);
                dc->setIndexBuffer(ibo, 0, I3D_UINT32);
                va->setAttributes(1, vbo_params, sizeof(InstanceParams)*params_offset, sizeof(InstanceParams), transform_descs, _countof(transform_descs));
                dc->setVertexArray(va);
                if(ibo) {
                    dc->drawIndexedInstanced(model.topology, 0, model.num_indices, params.size());
                }
                else {
                    dc->drawInstanced(model.topology, 0, model.num_indices, params.size());
                }
                dc->setIndexBuffer(nullptr, 0, I3D_UINT32);
                dc->setVertexArray(nullptr);

                params_offset += params.size();
            }
            sh->unbind();
        }
    }

    dc->setDepthStencilState(atmGetDepthStencilState(DS_NO_DEPTH_NO_STENCIL));
    dc->setBlendState(atmGetBlendState(BS_NO_BLEND));
    rt->setDepthStencilBuffer(nullptr);
}
开发者ID:WilliamChao,项目名称:atomic,代码行数:72,代码来源:Renderer_ForwardShading.cpp


注:本文中的VertexArray::setAttributes方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。