gpt4 book ai didi

opengl - GLSL - 计算片段的法线

转载 作者:行者123 更新时间:2023-12-02 03:40:54 27 4
gpt4 key购买 nike

我正在尝试创建一个程序来显示带有地形的地球仪,并在 GPU 上执行所有纬度/经度/Alt 到 XYZ (ECEF) 的操作。

我已经编写了一个可用的顶点着色器,它将代表经度、纬度和高度(分别)的 XYZ 转换为正确的 XYZ(使用 ECEF)。

我无法正确完成的是照明。

只要没有地形数据,我就可以使用定向光正确照亮每个顶点。地形数据未正确照亮,我无法使不同的坡度具有正确的阴影。

这是我正在使用的顶点着色器:

const float a = 6378137.0;
const float f = 0.003352810664747480719845528618;

varying vec3 Normal;
varying vec3 ecPos;

vec3 LatLonAltToEcef(in vec3 latLonAlt)
{
vec3 v = latLonAlt;

float cosLat = cos(radians(v.y));
float sinLat = sin(radians(v.y));
float nfs = (1.0 - f) * (1.0 - f);

float C = 1.0 / (sqrt(cosLat * cosLat + nfs * sinLat * sinLat));
float S = nfs * C;

float lon = radians(v.x);
float h = v.z;

v.x = (a * C + h) * cosLat * cos(lon) / a;
v.y = (a * C + h) * cosLat * sin(lon) / a;
v.z = (a * S + h) * sinLat / a;

return v;
}

vec4 LatLonAltToEcef(in vec4 latLonAlt)
{
vec3 ecef = LatLonAltToEcef(latLonAlt.xyz);
return vec4(ecef.x, ecef.y, ecef.z, latLonAlt.w);
}

void main(void)
{
vec4 v = LatLonAltToEcef(gl_Vertex); //x=lon, y=lat, z=alt
ecPos = vec3(gl_ModelViewMatrix * v);

Normal = normalize(gl_NormalMatrix * v.xyz);
vec4 lightPos = LatLonAltToEcef(gl_LightSource[0].position);
vec3 lightDir = normalize(gl_NormalMatrix * lightPos.xyz);
float NdotL = max(dot(Normal, lightDir), 0.0);
vec4 diffuse = gl_FrontMaterial.diffuse * gl_LightSource[0].diffuse;

gl_FrontColor = NdotL * diffuse;
gl_Position = gl_ModelViewProjectionMatrix * v;
}

为了绘制地球网格,需要执行以下操作:

for (float lat = -90; lat < 90; lat += 5)
{
glBegin(GL_LINE_LOOP);
for (float lon = -180; lon < 180; lon += 5)
glVertex3f(lon, lat, 0);
glEnd();
}

for (float lon = -180; lat < 180; lon += 5)
{
glBegin(GL_LINE_LOOP);
for (float lat = -90; lon < 90; lon += 5)
glVertex3f(lon, lat, 0);
glEnd();
}

有人可以指导我如何正确地对地形进行着色吗?

最佳答案

我觉得你需要学习更多的计算机图形学,因为你对计算机渲染几何的基础知识似乎存在一些差距。

无论如何:

如果您从一开始就没有坡度信息,那么获取任意点的法线(表面方向)通常需要查看周围环境。

其次,您可能想要绘制三角形,而不是直线。

三角形有一个表面。曲面具有法线。法线是向量,可以与其他向量成角度。光的方向是一个矢量。点积是你的 friend 。 :)

因此,拥有一组连接顶点的三角形将帮助您到达某个地方。

此外,避免在着色器中计算可以在任何渲染之前一次性计算的内容。

关于opengl - GLSL - 计算片段的法线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6095036/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com