OGRE渲染流程学习记录1

7 篇文章 0 订阅

Root->renderOneFrame();
  Root->_updateAllRenderTargets();
    RenderSystem->_updateAllRenderTargets();(RenderSystem->mPrioritisedRenderTargets)
      RenderTarget->update(bool swapBuffers = true);
        RenderTarget->_updateAutoUpdatedViewports(bool updateStatistics = true);
           RenderTarget->_updateViewport(Viewport* viewport, bool updateStatistics = true);(RenderTarget->mViewportList)
             Viewport->update();
               Camera->_renderScene(Viewport *vp, bool includeOverlays);
                 SceneManager->_renderScene(Camera* camera, Viewport* vp, bool includeOverlays);
                   SceneManager->_findVisibleObjects(camera, &(camVisObjIt->second),mIlluminationStage == IRS_RENDER_TO_TEXTURE? true : false); (OctreeScene or BsptreeScene继承了这个虚接口,walkOctree,  填充RenderQueue)
                    OctreeNode->_addToRenderQueue( Camera* cam, RenderQueue * q, bool onlyShadowCasters, VisibleObjectsBoundsInfo* visibleBounds);
                      RenderQueue->processVisibleObject(MovableObject* mo, Camera* cam, bool onlyShadowCasters, VisibleObjectsBoundsInfo* visibleBounds);
                        MovableObject->_notifyCurrentCamera(cam);(LOD, mMeshLodIndex, mMaterialLodIndex在这里被改变)
                        MovableObject->_updateRenderQueue(RenderQueue* queue);  (LOD,根据mMeshLodIndex做真正的Mesh LOD处理)           
              RenderQueue->addRenderable(Renderable* pRend, uint8 groupID, ushort priority);
                Renderable->getTechnique();
                  Material->getBestTechnique(unsigned short lodIndex = 0, const Renderable* rend = 0);(LOD, 根据mMaterialLodIndex做真正的LOD Technique 处理, Technique里包含了pass lod, 纹理lod, shader lod)
                RenderQueueGroup->addRenderable(Renderable* pRend, Technique* pTech, ushort priority);
                  RenderPriorityGroup->addRenderable(Renderable* pRend, Technique* pTech);
                    RenderPriorityGroup->addSolidRenderable(pTech, rend, false);
                      while (pi.hasMoreElements())
                     {
                        Pass* p = pi.getNext();
                   collection->addRenderable(p, rend);
                     }
                     QueuedRenderableCollection->addRenderable(Pass* pass, Renderable* rend);
          mDestRenderSystem->_beginFrame();
                   SceneManager->_renderVisibleObjects();
                     SceneManager->renderVisibleObjectsDefaultSequence();(renderQueue里面有若干RenderQueueGroup, 每个RenderQueueGroup相当于一个层, 产生人为的前后关系)
                       SceneManager->_renderQueueGroupObjects(RenderQueueGroup* group, QueuedRenderableCollection::OrganisationMode om);(RenderQueue->RenderQueueGroupMap mGroups;)
                         SceneManager->renderBasicQueueGroupObjects(RenderQueueGroup* pGroup, QueuedRenderableCollection::OrganisationMode om);(RenderPriorityGroup,层里的优先级划分)
                             // Sort the queue first
                   pPriorityGrp->sort(mCameraInProgress);
                   // Do solids
                   renderObjects(pPriorityGrp->getSolidsBasic(), om, true, true);
               // Do unsorted transparents
               renderObjects(pPriorityGrp->getTransparentsUnsorted(), om, true, true);
                   // Do transparents (always descending)
                   renderObjects(pPriorityGrp->getTransparents(), QueuedRenderableCollection::OM_SORT_DESCENDING, true, true);
                        SceneManager->renderObjects(const QueuedRenderableCollection& objs, QueuedRenderableCollection::OrganisationMode om, bool lightScissoringClipping,bool doLightIteration, const LightList* manualLightList = 0);
                          QueuedRenderableCollection->acceptVisitor(QueuedRenderableVisitor* visitor, OrganisationMode om) const;
                 acceptVisitorGrouped(visitor); 
                 acceptVisitorDescending(visitor);
                 acceptVisitorAscending(visitor);
                QueuedRenderableCollection->acceptVisitorGrouped(QueuedRenderableVisitor* visitor) const; (map<Pass*, vector<Renderable*>*, PassGroupLess> mGrouped)
                  for(pass1->passN)
                    QueuedRenderableVisitor->visit(Renderable* r);
                      SceneManager->renderSingleObject(Renderable* rend, const Pass* pass, bool lightScissoringClipping, bool doLightIteration, const LightList* manualLightList = 0);
                   SceneManager->updateGpuProgramParameters(const Pass* pass);
                     Pass->_updateAutoParams(const AutoParamDataSource* source, uint16 variabilityMask) const;(SceneManager->mAutoParamDataSource)
                       GpuProgramUsage->getParameters()->_updateAutoParams(const AutoParamDataSource* source, uint16 variabilityMask);
                         GpuProgramParameters->_updateAutoParams(const AutoParamDataSource* source, uint16 variabilityMask);
                           ACT_XXXXXX
                           GpuProgramParameters->_writeRawConstant(i->physicalIndex, source->getViewMatrix(),i->elementCount);
                           ACT_CUSTOM
                           source->getCurrentRenderable()->_updateCustomGpuParameter(*i, this);
                           AutoParamDataSource->getCurrentRenderable()->_updateCustomGpuParameter(const GpuProgramParameters::AutoConstantEntry& constantEntry,GpuProgramParameters* params) const
                              CustomParameterMap::const_iterator i = mCustomParameters.find(constantEntry.data); (map<size_t, Vector4> mCustomParameters)
                               if (i != mCustomParameters.end())
                               {
                                   params->_writeRawConstant(constantEntry.physicalIndex, i->second, constantEntry.elementCount);
                               }
                            
                     GLRenderSystem->bindGpuProgramParameters(GpuProgramType gptype, GpuProgramParametersSharedPtr params, uint16 variabilityMask);(第二个参数:pass->getVertexProgramParameters())
                       GLGpuProgram->bindProgramParameters(GpuProgramParametersSharedPtr params, uint16 mask);
                         GLSLLinkProgram->activate()
                           mGLHandle = glCreateProgramObjectARB();
                           GLSLLinkProgram->compileAndLink();
                             GLSLGpuProgram->getGLSLProgram()->compile(true);
                               GLSLProgram->compile( const bool checkErrors = true);
                                 mGLHandle = glCreateShaderObjectARB(shaderType);
                                 glShaderSourceARB(mGLHandle, 1, &source, NULL);
                                 glCompileShaderARB(mGLHandle);
                                 glGetObjectParameterivARB(mGLHandle, GL_OBJECT_COMPILE_STATUS_ARB, &mCompiled);
                             GLSLGpuProgram->getGLSLProgram()->attachToProgramObject(const GLhandleARB programObject);
                               childShader->compile(false);
                               childShader->attachToProgramObject( programObject );
                               glAttachObjectARB( programObject, mGLHandle );
                             glLinkProgramARB( mGLHandle );
                             glGetObjectParameterivARB( mGLHandle, GL_OBJECT_LINK_STATUS_ARB, &mLinked );
                           buildGLUniformReferences();
                             extractUniforms(mGLHandle, vertParams, geomParams, fragParams, mGLUniformReferences);
                              GLSLLinkProgramManager::getSingleton().extractUniforms(mGLHandle, vertParams, geomParams, fragParams, mGLUniformReferences);
                                glGetObjectParameterivARB(programObject, GL_OBJECT_ACTIVE_UNIFORMS_ARB,&uniformCount);
                                glGetActiveUniformARB(programObject, index, BUFFERSIZE, NULL, &arraySize, &glType, uniformName);
                                glGetUniformLocationARB(programObject, uniformName);
                                completeParamSource(paramName,vertexConstantDefs, geometryConstantDefs, fragmentConstantDefs, newGLUniformReference);
                           extractAttributes();
                             glGetAttribLocationARB(mGLHandle, a.name.c_str());
                           glUseProgramObjectARB( mGLHandle );                          
                       GLSLLinkProgram->updateUniforms(params, mask, mType);
                         glUniform1fv(currentUniform->mLocation, def->arraySize, params->getFloatPointer(def->physicalIndex));
                    GLRenderSystem->_render(ro);  
                      bindVertexElementToGpu(elem, vertexBuffer, op.vertexData->vertexStart, mRenderAttribsBound, mRenderInstanceAttribsBound);
                        glBindBufferARB(GL_ARRAY_BUFFER_ARB, hwGlBuffer->getGLBufferId());
                        glVertexAttribPointerARB(attrib,typeCount, GLHardwareBufferManager::getGLType(elem.getType()), normalised, static_cast<GLsizei>(vertexBuffer->getVertexSize()), pBufferData);
                        glEnableVertexAttribArrayARB(attrib);
          mDestRenderSystem->_endFrame(); 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值