資源簡介
要實(shí)現(xiàn)基于OpenGL ES 2.0的陰影映射,要攻克這三個(gè)技術(shù)難點(diǎn):
1、 熟練操作FBO。幀緩存FBO是需要熟練操控的,因?yàn)镕BO可以很快地將深度圖寫入一塊顯存中,然后作為紋理渲染到真實(shí)的場(chǎng)景中。
2、 掌握著色器的使用。由于OpenGL ES 2.0只允許使用著色器來對(duì)其進(jìn)行渲染,因此對(duì)著色器的書寫熟練程度要求較高。
3、 掌握將float深度數(shù)據(jù)分拆成vec4再將vec4合并成float的操作。這個(gè)已經(jīng)成為業(yè)內(nèi)熟練掌握的技能之一了,網(wǎng)絡(luò)上搜索“how to pack float into RGBA”,能夠得到很多有用的回答。
代碼片段和文件信息
#include?“Cube.h“
static?float?s_cubePositionData[]?=
{
????-1.0f-1.0f-1.0f?//?triangle?1?:?begin
????-1.0f-1.0f?1.0f
????-1.0f?1.0f?1.0f?//?triangle?1?:?end
????1.0f?1.0f-1.0f?//?triangle?2?:?begin
????-1.0f-1.0f-1.0f
????-1.0f?1.0f-1.0f?//?triangle?2?:?end
????1.0f-1.0f?1.0f
????-1.0f-1.0f-1.0f
????1.0f-1.0f-1.0f
????1.0f?1.0f-1.0f
????1.0f-1.0f-1.0f
????-1.0f-1.0f-1.0f
????-1.0f-1.0f-1.0f
????-1.0f?1.0f?1.0f
????-1.0f?1.0f-1.0f
????1.0f-1.0f?1.0f
????-1.0f-1.0f?1.0f
????-1.0f-1.0f-1.0f
????-1.0f?1.0f?1.0f
????-1.0f-1.0f?1.0f
????1.0f-1.0f?1.0f
????1.0f?1.0f?1.0f
????1.0f-1.0f-1.0f
????1.0f?1.0f-1.0f
????1.0f-1.0f-1.0f
????1.0f?1.0f?1.0f
????1.0f-1.0f?1.0f
????1.0f?1.0f?1.0f
????1.0f?1.0f-1.0f
????-1.0f?1.0f-1.0f
????1.0f?1.0f?1.0f
????-1.0f?1.0f-1.0f
????-1.0f?1.0f?1.0f
????1.0f?1.0f?1.0f
????-1.0f?1.0f?1.0f
????1.0f-1.0f?1.0f
};
static?float?s_cubeNormalData[]?=
{
????//?nX?nY?nZ
????-1.0f?0.0f?0.0f?//?triangle?1?:?begin
????-1.0f?0.0f?0.0f
????-1.0f?0.0f?0.0f?//?triangle?1?:?end
????0.0f?0.0f?-1.0f?//?triangle?2?:?begin
????0.0f?0.0f?-1.0f
????0.0f?0.0f?-1.0f?//?triangle?2?:?end
????0.0f-1.0f?0.0f?//
????0.0f-1.0f?0.0f
????0.0f-1.0f?0.0f
????0.0f?0.0f-1.0f?//
????0.0f?0.0f-1.0f
????0.0f?0.0f-1.0f
????-1.0f?0.0f?0.0f?//
????-1.0f?0.0f?0.0f
????-1.0f?0.0f?0.0f
????0.0f-1.0f?0.0f?//
????0.0f-1.0f?0.0f
????0.0f-1.0f?0.0f
????0.0f?0.0f?1.0f?//
????0.0f?0.0f?1.0f
????0.0f?0.0f?1.0f
????1.0f?0.0f?0.0f?//
????1.0f?0.0f?0.0f
????1.0f?0.0f?0.0f
????1.0f?0.0f?0.0f?//
????1.0f?0.0f?0.0f
????1.0f?0.0f?0.0f
????0.0f?1.0f?0.0f?//
????0.0f?1.0f?0.0f
????0.0f?1.0f?0.0f
????0.0f?1.0f?0.0f?//
????0.0f?1.0f?0.0f
????0.0f?1.0f?0.0f
????0.0f?0.0f?1.0f?//
????0.0f?0.0f?1.0f
????0.0f?0.0f?1.0f
};
Cube::Cube(?float?center[]?float?size?float?color[]?)
{
????initializeOpenGLFunctions(?);
????//set?color?data
????for?(?int?v?=?0;?v?12*3;?v++?)
????{
????????m_cubeColorData[4*v+0]?=?color[0];
????????m_cubeColorData[4*v+1]?=?color[1];
????????m_cubeColorData[4*v+2]?=?color[2];
????????m_cubeColorData[4*v+3]?=?color[3];
????}
????//resize?the?cube
????for?(int?i?=?0;?i?108;?i++)
????{
????????m_cubePositionData[i]?=?s_cubePositionData[i]?*?size/2;
????}
????//move?the?center?of?the?cube?to?the?place?specified?in?parameter
????for?(int?j?=?0;?j?36;?j++)
????{
????????m_cubePositionData[3*j]?=?m_cubePositionData[3*j]?+?center[0];
????????m_cubePositionData[3*j?+?1]?=?m_cubePositionData[3*j?+?1]?+?center[1];
????????m_cubePositionData[3*j?+?2]?=?m_cubePositionData[3*j?+?2]?+?center[2];
????}
????//?復(fù)制頂點(diǎn)數(shù)據(jù),用于渲染
????memcpy(?m_cubePosition?m_cubePositionData?sizeof(?float?)?*?108?);
????memcpy(?m_cubeNormal?s_cubeNormalData?sizeof(?floa
評(píng)論
共有 條評(píng)論