gpt4 book ai didi

c++ - 需要帮助理解为什么在 OpenGL 中没有任何东西被绘制到屏幕上,过剩

转载 作者:行者123 更新时间:2023-11-30 03:48:57 26 4
gpt4 key购买 nike

任何人都可以解释发生了什么或没有发生什么,以便我可以更正它。到目前为止,这是来自 .cpp 文件的代码。在 Visual Studio Community 2015 中运行。

#include <windows.h>
#include <gl/GL.h>
#include <gl/glu.h>
#include <gl/glut.h>
#include <math.h>

#define M_PI 3.14159265358979323846

const int screenWidth = 640;
const int screenHeight = 480;

这里使用aa, bb, cc, & dd 将世界坐标映射到屏幕坐标.我把它们打印出来以确保它工作正常并且坐标计算正确。在这种情况下 0 < 半径 <= 5。

void drawHex(GLdouble radius, GLdouble aa, GLdouble bb, GLdouble cc, GLdouble dd) {
glBegin(GL_POLYGON);
for (int i = 0; i < 6; i++) {
glVertex2d(((cos(i / 6.0 * 2 * M_PI) * radius) * aa) + cc,
((sin(i / 6.0 * 2 * M_PI) * radius) * bb) + dd);
}
glEnd();
glFlush();
}

这里我计算ABCD 来将世界映射到 View ,将它们传递给 drawHex 函数。

void myDisplay(void) {
glClear(GL_COLOR_BUFFER_BIT);
GLdouble winWidth = glutGet(GLUT_WINDOW_WIDTH);
GLdouble winHeight = glutGet(GLUT_WINDOW_HEIGHT);
GLdouble A, B, C, D;
glViewport((GLint)0, (GLint)0, (GLint)winWidth, (GLint)winHeight);
A = winWidth / 10.0;
B = winHeight / 10.0;
C = 0 - (A * -5.0);
D = 0 - (B * -5.0);
drawHex(0.5, A, B, C, D);
}

程序初始化和主循环。

void myInit() {
glClearColor(0.93, 0.93, 0.93, 0.0);
glColor3f(1.0, 0.0, 0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-5.0, 5.0, -5.0, 5.0);
glClear(GL_COLOR_BUFFER_BIT);
}

int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(screenWidth, screenHeight);
glutInitWindowPosition(100, 150);
glutCreateWindow("Window");
myInit();
glutDisplayFunc(myDisplay);
glutMainLoop();
return 0;
}

我得到的只是一个带有背景色的空白窗口。我希望 View 中间有一个六边形(尚未调整大小以保持适当的纵横比)。

最佳答案

在您调用 gluOrtho2D 时您将 [-5, 5] 作为两个维度的边界传递。在您的计算中,超出此范围的任何内容都将被剪掉并且不可见。让我们看看是否是这种情况。

aa , bb , ccdd你通过的是常量;他们总是保持:64 , 48 , 320240 .更正上述问题后得到的值将始终在 [-1, 1] 范围内,因为那是 cos 的辅域和 sin功能。这乘以 radius * aa并添加到 cc .所以最坏的情况是 (1 * 0.5 * 64) + 320 = 352 , 这显然在 -5 之外您通过 gluOrtho2D 设置的边界.

同样的观察结果适用于 y也。先在纸上做数学,然后再编写代码。确保所有边界条件都在限制范围内。

建议您通过GLUT_DOUBLE为避免闪烁,正如另一个答案所提到的,您需要在显示功能末尾交换缓冲区才能使双缓冲工作。阅读 Difference between single buffered(GLUT_SINGLE) and double buffered drawing(GLUT_DOUBLE) 的答案了解详情。此外,您无需调用 glViewport在每次渲染调用中,将其放入您的 init 中功能。

关于c++ - 需要帮助理解为什么在 OpenGL 中没有任何东西被绘制到屏幕上,过剩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32879890/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com