• 大小: 7KB
    文件类型: .7z
    金币: 1
    下载: 0 次
    发布日期: 2021-05-07
  • 语言: 其他
  • 标签: Qt  shadow  map  OpenGL  

资源简介

要实现基于OpenGL ES 2.0的阴影映射,要攻克这三个技术难点: 1、 熟练操作FBO。帧缓存FBO是需要熟练操控的,因为FBO可以很快地将深度图写入一块显存中,然后作为纹理渲染到真实的场景中。 2、 掌握着色器的使用。由于OpenGL ES 2.0只允许使用着色器来对其进行渲染,因此对着色器的书写熟练程度要求较高。 3、 掌握将float深度数据分拆成vec4再将vec4合并成float的操作。这个已经成为业内熟练掌握的技能之一了,网络上搜索“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];
    }

    // 复制顶点数据,用于渲染
    memcpy( m_cubePosition m_cubePositionData sizeof( float ) * 108 );
    memcpy( m_cubeNormal s_cubeNormalData sizeof( floa

评论

共有 条评论