c – 使用OpenGL渲染3D对象(.obj文件)时闪烁

c – 使用OpenGL渲染3D对象(.obj文件)时闪烁,第1张

概述在尝试使用OpenGL(和GLFW库)渲染3D对象时,模型会经历大量闪烁.我正在使用我自己编写的库读取.obj文件. 下面写的是我的渲染功能: 不幸的是,为了理解面部和顶点的输入方式,我将不得不提供所有链接的代码: 压缩代码以及可执行文件和示例.obj: Source 我使用here的.obj文件来测试程序.现在,该程序不支持法线和纹理,这不是问题,因为网站上的大多数模型都没有它们.此外,(现在) 在尝试使用OpenGL(和GLFW库)渲染3D对象时,模型会经历大量闪烁.我正在使用我自己编写的库读取.obj文件.

下面写的是我的渲染功能:
不幸的是,为了理解面部和顶点的输入方式,我将不得不提供所有链接的代码:
压缩代码以及可执行文件和示例.obj:
Source

我使用here的.obj文件来测试程序.现在,该程序不支持法线和纹理,这不是问题,因为网站上的大多数模型都没有它们.此外,(现在)它只读取“123.obj”所以该文件不应该被命名为其他任何东西.它只接受一个空间,而不是更多.

float render()    {        glfwSetTime(0.0f);        int win_wIDth;        int win_height;        glfwGetwindowsize(&win_wIDth,&win_height);        float win_aspect = (float)win_wIDth / (float)win_height;        glVIEwport(0,win_wIDth,win_height);        glMatrixMode(GL_PROJECTION);        glLoadIDentity();        gluPerspective(90,win_aspect,100.0);        glMatrixMode(GL_MODELVIEW);        glLoadIDentity();        gluLookAt(0,50.0,0.0,1.0,0.0);        glEnable(GL_DEPTH);        glEnable(GL_DEPTH_TEST);        glEnable(GL_color_MATERIAL);        glEnable(GL_norMAliZE);         glClear(GL_color_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);        glrotatef(angle,1,0);        glcolor3f(0.0f,0.0f,0.0f);        int index = 0;        for(int a = 0; a < faces.size(); a++)        {            if(faces[a].vertices.size() == 3)            {                glBegin(GL_TRIANGLES);            }            else            {                glBegin(GL_QUADS);            }            for(int b = 0; b < faces[a].vertices.size(); b++)            {                index = faces[a].vertices[b];                glVertex3f(vertices[index].Dimensions[_x],vertices[index].Dimensions[_y],vertices[index].Dimensions[_z]);            }            glEnd();        }        glfwSwapBuffers();        return (float)glfwGetTime();
解决方法 这是问题所在

gluPerspective(90,100.0);

您不能将0设置为近距离,将其设置为大于0.1或1.0的值.

gluPerspective(90,100.0);

当nearclip为0时,你的所有深度都被映射到z = 1,你就会得到z格斗.

编辑:如果你有兴趣,这里有一些关于透视深度的理论:

对于距摄像机x的给定距离,您的透视变换输出certian深度值z.在farclip处,此值将最大为1,而在nearclip处它将为0.
然而,在这些值之间,关系不像您预期​​的那样是线性的.曲线类似于下图:

Diagram

当您将近距离设置为0时,您的曲线会发生剧烈扭曲,因此现在所有距离都会映射到z = 1.

因为这一切,你还应该尽量保持比率远:接近小于10000:1

总结

以上是内存溢出为你收集整理的c – 使用OpenGL渲染3D对象(.obj文件)时闪烁全部内容,希望文章能够帮你解决c – 使用OpenGL渲染3D对象(.obj文件)时闪烁所遇到的程序开发问题。

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

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存