渲染时 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();
有你的问题。我假设 getScreenWidth
和 getScreenHeight
返回整数。在 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 立方体出现拉伸的主要内容,如果未能解决你的问题,请参考以下文章
Unity3D Camera RenderToCubemap 渲染到立方体纹理