您的位置:首页 > 运维架构

[OpenGL] perlin noise渲染的一些东西

2017-05-07 15:55 253 查看
* 本项目属于游戏程序设计5000行计划

         用原始的柏林噪声渲染一只兔子,我知道这很难看。

         


void initColor()
{
float d1 = -200, d2 = -200, d3 = -200;
for (int i = 0; i<(sizeof(vertices) / sizeof(vertices[0])); i++)
{
float vec[3] = { d1 + vertices[i][0] * 10, d2 + vertices[i][1] * 10, d3 + vertices[i][2] * 10 };
float c = (noise3(vec) + 1) / 2;
color[i][0] = c;
color[i][1] = c;
color[i][2] = c;
}
}


        加上色彩映射后的兔子:
        


void initColor()
{
float d1 = -200, d2 = -200, d3 = -200;
for (int i = 0; i<(sizeof(vertices) / sizeof(vertices[0])); i++)
{
float vec[3] = { d1 + vertices[i][0] * 10, d2 + vertices[i][1] * 10, d3 + vertices[i][2] * 10 };
float c = (noise3(vec) + 1) / 2;
if (c < 0.3) {
color[i][0] = 0.2;
color[i][1] = 0.2;
color[i][2] = 0.3;
}
else if (c < 0.4) {
color[i][0] = 0.2;
color[i][1] = 0.2;
color[i][2] = 0.5;
}
else if (c < 0.5) {
color[i][0] = 0.2;
color[i][1] = 0.2;
color[i][2] = 0.7;
}
else if (c < 0.6) {
color[i][0] = 0.2;
color[i][1] = 0.2;
color[i][2] = 0.9;
}
else {
color[i][0] = 0.2;
color[i][1] = 0.7;
color[i][2] = 0.7;
}
}
}


        加入法线扰动后,在这里打开了灯光,因为这只兔子表面本来就比较粗糙所以效果并不明显:
        


float* dnoise3(float vec[3])
{
float* d = new float[3];
float vec_x[] = { vec[0] + 1, vec[1], vec[2] };
float vec_y[] = { vec[0], vec[1] + 1, vec[2] };
float vec_z[] = { vec[0], vec[1], vec[2] + 1 };
d[0] = noise3(vec_x) - noise3(vec);
d[1] = noise3(vec_y) - noise3(vec);
d[2] = noise3(vec_z) - noise3(vec);
return d;
}
void initNormal()
{
float d1 = -200, d2 = -200, d3 = -200;
for (int i = 0; i<(sizeof(normals) / sizeof(normals[0])); i++)
{
float vec[3] = { d1 + vertices[i][0] * 10, d2 + vertices[i][1] * 10, d3 + vertices[i][2] * 10 };
float* n = dnoise3(vec);
normals[i][0] += n[0];
normals[i][1] += n[1];
normals[i][2] += n[2];
normalize3(normals[i]);
}
}


        一维perlin + 水平方向扰动
        

   

      

        

    

        波浪

        
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: