我开始在OpenGL中使用修补程序,并且我想绘制一个立方体。我去了一个教程,然后去了,只得到了这个奇怪的方块。
这是我的代码。
#include <GLFW/glfw3.h>
void drawCube() {
float rotate_x{ 193 };
float rotate_y{ 112 };
glBegin(GL_POLYGON);
glColor3f(1.0, 0.0, 0.0); glVertex3f(0.5, -0.5, -0.5);
glColor3f(0.0, 1.0, 0.0); glVertex3f(0.5, 0.5, -0.5);
glColor3f(0.0, 0.0, 1.0); glVertex3f(-0.5, 0.5, -0.5);
glColor3f(1.0, 0.0, 1.0); glVertex3f(-0.5, -0.5, -0.5);
glColor3f(1.0, 1.0, 1.0);
glVertex3f(0.5, -0.5, 0.5);
glVertex3f(0.5, 0.5, 0.5);
glVertex3f(-0.5, 0.5, 0.5);
glVertex3f(-0.5, -0.5, 0.5);
glColor3f(1.0, 0.0, 1.0);
glVertex3f(0.5, -0.5, -0.5);
glVertex3f(0.5, 0.5, -0.5);
glVertex3f(0.5, 0.5, 0.5);
glVertex3f(0.5, -0.5, 0.5);
glColor3f(0.0, 1.0, 0.0);
glVertex3f(-0.5, -0.5, 0.5);
glVertex3f(-0.5, 0.5, 0.5);
glVertex3f(-0.5, 0.5, -0.5);
glVertex3f(-0.5, -0.5, -0.5);
glColor3f(0.0, 0.0, 1.0);
glVertex3f(0.5, 0.5, 0.5);
glVertex3f(0.5, 0.5, -0.5);
glVertex3f(-0.5, 0.5, -0.5);
glVertex3f(-0.5, 0.5, 0.5);
glColor3f(1.0, 0.0, 0.0);
glVertex3f(0.5, -0.5, -0.5);
glVertex3f(0.5, -0.5, 0.5);
glVertex3f(-0.5, -0.5, 0.5);
glVertex3f(-0.5, -0.5, -0.5);
glLoadIdentity();
glRotatef(30, 0.0, 1.0, 0.0);
glEnd();
}
int main(void)
{
GLFWwindow* window;
/* Initialize the library */
if (!glfwInit())
return -1;
/* Create a windowed mode window and its OpenGL context */
window = glfwCreateWindow(640, 480, "Triangle", NULL, NULL);
if (!window)
{
glfwTerminate();
return -1;
}
/* Make the window's context current */
glfwMakeContextCurrent(window);
/* Loop until the user closes the window */
while (!glfwWindowShouldClose(window))
{
/* Render here */
glClear(GL_COLOR_BUFFER_BIT);
drawCube();
/* Swap front and back buffers */
glfwSwapBuffers(window);
/* Poll for and process events */
glfwPollEvents();
}
glfwTerminate();
return 0;
}
我正在使用GLFW进行此操作,并在Visual Studio 2017 Community Edition中进行构建。 我还尝试在drawCube()的末尾旋转它。 我遵循的教程是https://www.wikihow.com/Make-a-Cube-in-OpenGL,但是我对它进行了一些微调以使用glfw。
答案 0 :(得分:4)
您正在绘制具有24个顶点的单个多边形。由于OpenGL要求多边形必须是凹面且是平面的(不是您的数据),所以它会绘制一些随机的东西。
如果要绘制一个立方体,则必须分别为每个面将调用glBegin(GL_POLYGON)
和glEnd()
分开绘制(如本教程在第4部分的第二个代码示例中所示),或者您可以将原始模式更改为GL_QUADS
。
请注意,您正在使用的OpenGL版本(固定功能管道)已经过时了10多年。您可能要考虑切换到(至少)OpenGL 3.3核心配置文件并使用着色器。
答案 1 :(得分:0)
相机
我看不到您在任何地方设置矩阵...所以我敢打赌,无论您如何调整渲染的轴对齐数据,您的矩阵都是单位的2D视图。
将gluPerspective
用于GL_PROJECTION
。为新手正确设置透视3D视图(在-Z
方向上与恒等矩阵完全相反)上设置透视图有点麻烦,因此网格处于可见区域。
CULL_FACE
对于初学者,请尝试glDisable(GL_CULL_FACE)
,因为您的数据很可能包含缠绕错误,并且您将不知道自己已经拥有什么样的面孔。
立方体网格
现在,您正在使用glVertex
对其进行硬编码,调用它更容易为点和面(QUADS或TRIANGLES)使用单独的数组。另外,正如BDL指出的那样,您在glBegin/glEnd
调用中使用了禁止的命令,由于错误处理,它们会被忽略并减慢运行速度。
照明
要使3D更好,您还应该为每张脸添加法线并启用灯光。否则,您需要为每个面孔涂上不同的颜色才能看到“ 3D”。
看看我的:
只需忽略高级内容(GLSL,VAO / VBO ...),然后查看视图设置和立方体网格数据。您只需要使用for循环而不是VAO / VBO来渲染它。例如:
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_COLOR_MATERIAL);
#ifndef vao_indices
glBegin(GL_QUADS);
for (int i=0;i<6*4*3;i+=3)
{
glNormal3fv(vao_nor+i);
glColor3fv (vao_col+i);
glVertex3fv(vao_pos+i);
}
glEnd();
#else
int i,j,k;
const GLfloat vao_nor[]=
{
// nx ny nz
0.0, 0.0,-1.0,
0.0, 0.0,+1.0,
0.0,-1.0, 0.0,
+1.0, 0.0, 0.0,
0.0,+1.0, 0.0,
-1.0, 0.0, 0.0,
};
glBegin(GL_QUADS);
for (j=0;j<6*4;j++)
{
i=vao_ix[j]; i+=i+i;
k=j>>2; k+=k+k;
glNormal3fv(vao_nor+k);
glColor3fv (vao_col+i);
glVertex3fv(vao_pos+i);
}
glEnd();
#endif
glDisable(GL_COLOR_MATERIAL);
glDisable(GL_LIGHTING);
glDisable(GL_LIGHT0);
在两种模式下(索引和直接)在链接的质量检查中使用gl_simple
中的网格。