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();
OGRE渲染流程学习记录1
最新推荐文章于 2019-06-15 18:21:14 发布