OpenGL中奇怪的方形照明人工制品

OpenGL中奇怪的方形照明人工制品,第1张

概述我有一个生成高度图的程序,然后将其显示为OpenGL的网格.当我尝试添加光照时,最终会形成覆盖网格的奇怪方形.它们在某些方面比其他方面更明显,但总是在那里. 我使用的是四边形网格,但切换到三角形网格后没有任何变化.我使用至少三种不同的方法来计算顶点法线,所有方法都具有相同的效果.我正在使用着色器手动进行照明,但使用内置时没有任何变化 OpenGL照明系统. 我最新的法线生成代码(faces是一个顶 我有一个生成高度图的程序,然后将其显示为OpenGL的网格.当我尝试添加光照时,最终会形成覆盖网格的奇怪方形.它们在某些方面比其他方面更明显,但总是在那里.

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

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

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,verts);glEnableClIEntState(GL_norMAL_ARRAY);glnormalPointer(GL_float,norms);glDrawElements(GL_TRIANGLES,NINDEX,GL_UNSIGNED_SHORT,faces);

我目前没有使用任何着色器.

可能是什么导致了这个?

编辑:一套更全面的截图:

> Wireframe
> Flat shading,OpenGL lighting
> Smooth shading,OpenGL lighting
> Lighting done in shader

对于最后一个,着色器代码是

顶点:

varying vec3 lightvec,normal;voID main() {    vec3 lightpos = vec3(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,1);}
解决方法 您需要在片段着色器中规范化法线,如下所示:
varying vec3 lightvec,normal;voID main(voID) {    vec3 normalnormed = normalize(normal);    float l = dot(lightvec,normalnormed);    gl_Fragcolor = vec4(l,1);}

但这可能很昂贵.在这种情况下,使用方向灯也可以使用顶点照明.因此,计算顶点着色器中的光值

varying float lightItensity;voID main() {    vec3 lightpos = vec3(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,1);}

我希望这可以解决它,如果没有,请告诉我.

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

EDIT2:

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

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

您必须在高度图上进行一些插值.

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

总结

以上是内存溢出为你收集整理的OpenGL中奇怪的方形照明人工制品全部内容,希望文章能够帮你解决OpenGL中奇怪的方形照明人工制品所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1239186.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存