glmark2代码分析8(其他scene)

这里对各个scene的测试点和实现方式概括一下。

包含的scene

包含的scene有:
default-options: option的setup和set
function:和collections一样,就是shader不同,得验证下
grid: 绘制基本的网格,调用的是mesh的类,比较简单
jellyfish:

setup

加载模型和纹理:jellyfish.jobj
loop
pulsar
refract
shading
shadow
terrain
texture

effect-2d

测试点

测试不同kernel进行图像处理速度。

实现方式

只有一个类 SceneEffect2D
create_convolution_fragment_shader:创建图像卷积的shader程序,用字符串替换的方式,传入的参数是:图像的宽高、卷积因子
kernel_printout: 打印shader函数
parse_matrix:将矩阵的字符串形式转成数字矩阵
normalize:对kernel矩阵进行Normalizes
setup:查找纹理 effect-2d,加载shader,解析输入参数,创建grid生成顶点属性,传递顶点数据。用vbo传递数据
draw:直接绘制
validate:和其他的scene相同,读取一个像素进行比较

bump

测试点:

测试不同算法的height map法向量计算方法。

实现方法:

绘制模型,和build的过程差不多,重点在 bump_render 这个参数的控制,

if (bump_render == "normals")
    setup_succeeded = setup_model_normals();
else if (bump_render == "normals-tangent")
    setup_succeeded = setup_model_normals_tangent();
else if (bump_render == "height")
    setup_succeeded = setup_model_height();
else if (bump_render == "off" || bump_render == "high-poly")
    setup_succeeded = setup_model_plain(bump_render);

这几个参数调用的模型文件差不多,是 asteroid,最后一项,调用两个模型:asteroid-low,asteroid-high,模型加载都一样,调用的shader不同:
normals: 正常的计算光照,法向量是从NormalMap中读出来的。
normals-tangent:在vertex shader中多计算一次切面向量,用法向量,切线和双切线,得到一个normal矩阵,这个normal矩阵传给fragment shader中,和法向量相乘,作为光源的N值。
height:和normal相比,直接传递了tangent和bittangent参数,从height map中获取值后计算delta h,用delta h的x、y做线性计算。

// Get the data from the height map
float height0 = texture2D(HeightMap, TextureCoord).x;
float heightX = texture2D(HeightMap, TextureCoord + vec2(TextureStepX, 0.0)).x;
float heightY = texture2D(HeightMap, TextureCoord + vec2(0.0, TextureStepY)).x;
vec2 dh = vec2(heightX - height0, heightY - height0);

// Adjust the normal based on the height map data
vec3 N = NormalEye - height_factor * dh.x * TangentEye -
                     height_factor * dh.y * BitangentEye;

high-poly: 区别于上面的三个更简单,直接用法向量,没有用height map。

clear

一个框架,setup和draw中什么都没有做。

SceneConditionals

不是scene点,属于辅助方法,只实现了,shader文件的获取,shade的加载,和替换,没有draw和update方法。

ideas

测试点:

测试旋转和字体的一个综合场景

实现方法:

按照绘制的物体进行初始化创建:light、table、logo、lamp;
update 视景体矩阵,设置旋转等变换;绘制过程中 update 时间和物体的位置,计算旋转和平移等矩阵,更新绘制。

你可能感兴趣的:(算法)