OpenGL:如何使 z=f(x,y) 3D 表面光滑,目前比较粗糙

问题描述 投票:0回答:0

我使用

z=f(x,y)
函数生成曲面,现在我可以在 OpenGL 中绘制曲面。

请看下面的图片,表面的颜色取决于顶点的

Z
值,越高,越红。

这是我用来生成顶点的函数:

int g_N = 30;

float f(float x, float y, float tx = 0);

float f(float x, float y, float tx)
{
    // conver the value to [0, 1]
    x = x/g_N;
    y = y/g_N;

    // use any curve function you want
    float dx = x-0.5;
    float dy = y-0.5;

    float r = sqrt(dx*dx + dy*dy);

    return sin((r+tx)*8.0f*3.141526f) * 5.0f;
}

我只是创建一个从

(X,Y)
(0,0)
(29,29)
网格,因此每个
(X,Y)
对都可以有一个值 Z。

然后我生成了很多三角形。每个矩形将被分成两个三角形,我将顶点和索引添加到VBO中,最后使用着色器绘制三角形,从而制作表面。我使用了这里提到的方法:在OpenGL中创建一个网格从网格中获取三角形。

这是我用来使表面颜色取决于顶点的 Z 值的表面着色器。

#version 330 core

uniform float ZL;
uniform float ZH;

out vec3 color;
in vec3 pos;


// https://stackoverflow.com/questions/7706339/grayscale-to-red-green-blue-matlab-jet-color-scale
vec3 jet(float t)
{
    return clamp(vec3(1.5) - abs(4.0 * vec3(t) + vec3(-3, -2, -1)), vec3(0), vec3(1));
}

void main()
{
   float param = (pos.z - ZL) / (ZH - ZL);
   color = jet(param);
}

如您所见,结果图像并不像我预期的那样平滑,请参见图像截图上的箭头。那么,如何让表面更加光滑呢?

我知道我可以通过使用维基百科中的方法来生成每个顶点的法线向量:1.1计算表面法线,它只需要计算

X
Y
轴上的偏导数,但我不确定使用法线向量会使表面更平滑,该怎么做?我需要调整着色器吗?谢谢。

编辑: 也许,已经有一些OpenGL相关的库来生成这些顶点并制作光滑的表面?我认为这是一个非常普遍的需求。

opengl shader surface
© www.soinside.com 2019 - 2024. All rights reserved.