渲染时 3D 立方体出现拉伸

Posted

技术标签:

【中文标题】渲染时 3D 立方体出现拉伸【英文标题】:3D cube appears stretched when rendered 【发布时间】:2013-04-07 11:25:21 【问题描述】:

我有一个将 3D 立方体绘制到屏幕上的基本 opengl 项目。我的分辨率是 1600 x 900。无论相机离立方体多远或近,立方体总是水平拉伸,看起来像一个三角形。我已经将同一个多维数据集加载到一个 java 项目中,并且它绘制得很完美。但是在 C++ 中使用相同的代码,我得到了拉伸效果。关于可能导致此问题的任何建议?

GLvoid RenderSettings::init()

    const GLfloat FOV = 60.0F; 
    const GLfloat ASPECT_RATIO = getScreenWidth() / getScreenHeight();
    const GLfloat NEAREST_VIEW = 1.0F;
    const GLfloat FARTHEST_VIEW = 1000.0F;

    glViewport(0, 0, getScreenWidth(), getScreenHeight());

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(FOV, ASPECT_RATIO, NEAREST_VIEW, FARTHEST_VIEW);

    glClearColor(0.0, 0.0, 0.0, 1.0);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);
    glDepthFunc(GL_LEQUAL);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();


【问题讨论】:

两个项目中的窗口高度、宽度和 FOV 是否相同? 调整 FOV 会发生什么?也许 30 而不是 60。 【参考方案1】:

这个

const GLfloat ASPECT_RATIO = getScreenWidth() / getScreenHeight();

有你的问题。我假设 getScreenWidthgetScreenHeight 返回整数。在 C/C++ 中,当除以整数时,这发生在整数运算中,这意味着结果将(总是)向下舍入到下一个较小的整数。您将结果分配给的类型无关紧要。 C/C++ 分别查看 L 值和 R 值的类型。您可以通过将除法的一侧类型转换为浮点数来修复它(通常您只需将两者都转换),即

GLfloat const ASPECT_RATIO = (float)getScreenWidth() / (float)getScreenHeight();

还要注意const 限定符是左关联的,即它作用于它的剩余部分。只有当它是变量定义语句中的 very first 标记时,它才会向右移动。但是许多语言纯粹主义者(包括我)认为这看起来很难看。在类型之后也写 const 更适合自然语言。

【讨论】:

所以你更喜欢char* const s = 'a'; 而不是const char* s = 'a';const 限定词在语句右侧时总是让我感到困惑,不知道为什么.. 他更喜欢int const foo = 1 而不是const int foo = 1。不错的捕获@datenwolf @user1520427: char const *(表示指向不可变字符内存的指针)与char * const(指向可变字符内存的不可变指针)不同。还有char const * const(指向不可变字符内存的不可变指针)。

以上是关于渲染时 3D 立方体出现拉伸的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL:从原点平移时模型拉伸

unity3D 如何渲染出图,一张JPG的就行~

Unity3D Camera RenderToCubemap 渲染到立方体纹理

GLUT OpenGL Cube 拉伸错误

使用 VBO 使用 LWJGL 对 3D 立方体进行纹理处理

Unity 拆分立体显示