gpt4 book ai didi

c - OpenGL 中奇怪的方形照明伪影

转载 作者:太空狗 更新时间:2023-10-29 17:13:00 25 4
gpt4 key购买 nike

我有一个程序可以生成高度图,然后使用 OpenGL 将其显示为网格。当我尝试添加照明时,它最终会以奇怪的方形覆盖网格。它们在某些区域比其他区域更引人注目,但始终存在。

我使用的是四边形网格,但在切换到三角形网格后没有任何变化。我至少使用了三种不同的方法来计算顶点法线,所有方法都具有相同的效果。我正在使用着色器手动进行照明,但使用内置时没有任何变化OpenGL光照系统。

我最新的法线生成代码(面是顶点数组的索引数组):

int i;
for (i = 0; i < NINDEX; i += 3) {
vec v[3];
v[0] = verts[faces[i + 0]];
v[1] = verts[faces[i + 1]];
v[2] = verts[faces[i + 2]];

vec v1 = vec_sub(v[1], v[0]);
vec v2 = vec_sub(v[2], v[0]);

vec n = vec_norm(vec_cross(v2, v1));

norms[faces[i + 0]] = vec_add(norms[faces[i + 0]], n);
norms[faces[i + 1]] = vec_add(norms[faces[i + 1]], n);
norms[faces[i + 2]] = vec_add(norms[faces[i + 2]], n);
}

for (i = 0; i < NVERTS; i++) {
norms[i] = vec_norm(norms[i]);
}

虽然这不是我使用的唯一代码,所以我怀疑它是问题的原因。

我用以下方法绘制网格:

glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, verts);

glEnableClientState(GL_NORMAL_ARRAY);
glNormalPointer(GL_FLOAT, 0, norms);

glDrawElements(GL_TRIANGLES, NINDEX, GL_UNSIGNED_SHORT, faces);

而且我目前没有使用任何着色器。

这可能是什么原因造成的?

编辑:一组更全面的屏幕截图:

对于最后一个,shader代码是

顶点:

varying vec3 lightvec, normal;

void main() {
vec3 lightpos = vec3(0, 0, 100);
vec3 v = vec3(gl_ModelViewMatrix * gl_Vertex);
normal = gl_NormalMatrix * gl_Normal;

lightvec = normalize(lightpos - v);

gl_Position = ftransform();
}

片段:

varying vec3 lightvec, normal;

void main(void) {
float l = dot(lightvec, normal);
gl_FragColor = vec4(l, l, l, 1);
}

最佳答案

您需要在片段着色器中标准化法线,如下所示:

varying vec3 lightvec, normal;

void main(void) {
vec3 normalNormed = normalize(normal);
float l = dot(lightvec, normalNormed);
gl_FragColor = vec4(l, l, l, 1);
}

虽然这可能很昂贵。在这种情况下,使用定向光也可以使用顶点照明。所以在vertex shader中计算光照值

varying float lightItensity;

void main() {
vec3 lightpos = vec3(0, 0, 100);
vec3 v = vec3(gl_ModelViewMatrix * gl_Vertex);
normal = gl_NormalMatrix * gl_Normal;

lightvec = normalize(lightpos - v);

lightItensity = dot(normal, lightvec);

gl_Position = ftransform();
}

并在片段着色器中使用它,

varying float light;

void main(void) {
float l = light;
gl_FragColor = vec4(l, l, l, 1);
}

我希望这可以解决问题,如果没有,请告诉我。

编辑:这是一张小图,解释了最有可能发生的事情

enter image description here

编辑2:

如果这没有帮助,请添加更多三角形。插入高度图的值并在中间添加一些顶点。

或者,尝试更改您的曲面 segmentation 方案。例如,像这样的等边三角形网格可以使伪影不那么突出。

enter image description here

您必须对高度图进行一些插值。

否则我不知道..祝你好运!

关于c - OpenGL 中奇怪的方形照明伪影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11009698/

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