大佬教程收集整理的这篇文章主要介绍了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中奇怪的方形照明人工制品所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。