Тема: C3D Engine
Показать сообщение отдельно
Старый 10.06.2012, 01:31   #66
pozitiffcat
Мастер
 
Аватар для pozitiffcat
 
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений
(для 533 пользователей)
Ответ: C3D Engine

ППЦ я не понимаю почему такая задержка
HolyDel:
В ядре:
сначала вызывается scene->draw();
в сцене лежит std::vector<CNode*> _nodes; //это список объектов для отрисовки
кратко, что делает CScene::draw()
...............
	glm::mat4 m_view = camera()->matrix_view();//один раз за фрейм получаем матрицу вида
	_frustum->CalculateFrustum(m_view);//считаем фрутсум
	for(int i=-1;++i<_nodes.size();)//проходим по всем нодам (ентитям) (этот метод цикла быстрей итераторного)
	{
		CNode* curnode = _nodes[i];//берем 1 раз за итерацию объект массива (так быстрей)
		if(curnode->vbo()!=NULL){//если есть геометрия
			glm::vec4 cur_pos = curnode->position(true);//определяем позицию (4 столбец из матрицы)
			if(_frustum->CubeInFrustum(cur_pos.x,cur_pos.y,cur_pos.z,curnode->vbo()->box()))//эта строка вообще никак не влияет на скорость как ни странно
				curnode->drawVBO(m_view); //рисуем геометрию
		}
	}
.........................
}
вот код CNode::drawVBO
void CNode::drawVBO(glm::mat4 &m_view)
{
	if(!_effect || !_visible) return;
	_effect->setWorldMatrixSemantic(matrix(true));//тут ничего страшного тупо передача в шейдер не должно тормозить
	_effect->setViewMatrixSemantic(m_view);
	_effect->setProjMatrixSemantic(APP->render()->projection());
	_effect->setTexture0Semantic(_texture);
	_shader_queue->bind();//тут пусто, это передача кастомных параметров в шейдер
	while(_effect->pass())//тут проходим по всем проходам, тоже ни чего мудреного проход один в шейдере
	{
		_vbo->drawBuffers();//рисуем буфферы на гапи
	}
	//_shader_queue->unbind();
}
код отрисовки буферов на гапи

if(_vbuffer && _ibuffer)
	{
		glBindBufferARB( GL_ARRAY_BUFFER_ARB, _vbuffer );
		glVertexPointer( 3, GL_FLOAT, 0, 0 );
		if(_nbuffer)
		{	
			glBindBufferARB( GL_ARRAY_BUFFER_ARB, _nbuffer );
			glNormalPointer(GL_FLOAT,0,0);
		}
		if(_tbuffer)
		{	
			glBindBufferARB( GL_ARRAY_BUFFER_ARB, _tbuffer );
			glTexCoordPointer( 2, GL_FLOAT, 0, 0 );
		}

		{
			APP->render()->dips_up();
			glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, _ibuffer);
			glDrawElements(GL_TRIANGLES,_cnt_indices,GL_UNSIGNED_SHORT,0);
			//glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
		}
	}
мля!! что тут может тормозить я не понимаю!! я даже бинды убирал, эффект от этого не поменялся.. у мня 4к кубов 40 фпс, axel 255!!! юнити 50, все остальное 80
(Offline)
 
Ответить с цитированием