C++ OpenGL中使用glm::rotate旋转纹理出现单三角形渲染异常问题求助
旋转异常的核心原因
你的代码存在几处明确的错误,直接导致了图元显示异常:
- 图元绘制参数与顶点数不匹配
你一共只有4个顶点组成矩形,却在glDrawElements里传入了6个索引值、用三角形条带模式绘制。三角形条带每多一个索引就会生成一个新三角形,4个顶点只需要4个索引就能拼成完整矩形,多出来的2个索引没有对应有效顶点数据,会触发显存越界读取,生成位置随机的异常三角形,视觉上就会误以为“只有一个三角形完成了变换”。
正确的绘制调用是:glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_INT, nullptr); - 旋转轴参数输入错误
你在调用glm::rotate时写的旋转轴是glm::vec3(1.f),按照GLM的构造规则,这会生成三个分量全为1的斜向轴(1,1,1),根本不是你想要的垂直于屏幕的Z轴方向(0,0,1)。绕斜轴旋转时,原本在Z=0平面的矩形会产生Z方向的位置偏移,结合你设置的正交投影裁剪范围(Z值在0到1之间的内容才会被显示),超出范围的顶点会被直接裁剪,进一步让显示结果混乱。
正确的旋转轴参数应该写为glm::vec3(0.0f, 0.0f, 1.0f)。 - 旋转的逻辑顺序完全不对
你现在的变换是先做了0.5、-0.5单位的微小平移,再绕全局坐标原点旋转,既没有让矩形绕自身中心旋转,微小的平移量也根本抵消不了绕远点旋转带来的位置偏移。
想要让矩形绕自己的中心旋转,必须按照固定顺序构建变换矩阵:- 先把矩形的中心平移到坐标原点,这样后续的旋转操作才会围绕中心进行。你的矩形顶点范围是X从100到400、Y从100到400,中心坐标是(250,250)。
- 完成旋转操作。
- 再把旋转后的矩形平移回原来的中心位置。
正确的构建示例:
glm::vec3 rectCenter(250.0f, 250.0f, 0.0f); glm::mat4 trans = glm::mat4(1.0f); // 移到原点 trans = glm::translate(trans, -rectCenter); // 绕Z轴旋转,需要每帧累加角度才能实现动态旋转效果 trans = glm::rotate(trans, glm::radians(currentRotateAngle), glm::vec3(0,0,1)); // 移回原位 trans = glm::translate(trans, rectCenter); // 合并投影和模型矩阵 glm::mat4 mvp = proj * trans; glUniformMatrix4fv(loc, 1, GL_FALSE, glm::value_ptr(mvp)); - 没有累加旋转角度
你现在固定用1度的旋转角度,即使变换逻辑正确,也只会看到矩形静止在旋转1度的位置,不会有连续旋转的动态效果,只需要在每帧更新时给角度值加上固定的增量(比如1度)即可。
内容的提问来源于stack exchange,提问作者Xxsource98
相关产品推荐
相关产品推荐

