【问题标题】:Vertex object doesn't show up (legacy OpenGL 1.2)顶点对象不显示(旧版 OpenGL 1.2)
【发布时间】:2020-12-02 16:16:16
【问题描述】:

所以我得到了 OpenGL Redbook 3e,目前正在阅读第 2 章(较新的 OpenGL 对初学者来说似乎太难进行图形编程)。我从书中复制了一段代码 sn-p(我添加了初始化代码和绘图代码),并尝试了渲染顶点数组的每个选项(glDrawElementsglDrawRangeElementsgDrawArrays)。对于这个示例,我决定使用 glDrawArrays,因为它似乎是最直接的。据我所知,这段代码没有任何问题,因为它可以编译并运行。但是,没有绘制多边形。有谁知道发生了什么?我觉得我要么犯了一个非常愚蠢的错误,要么错过了一些基本的东西。

#include <stdio.h>
#include <GL/gl.h>
#include <GL/glext.h>
#include <GL/freeglut.h>

void init() {
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
}

void display() {
    static GLint vertices[] = { 25, 25,
                    100, 325, 
                    175, 25,
                    175, 325,
                    250, 25,
                    325, 325 };

    static GLfloat colors[] = { 1.0, 0.2, 0.2,
                    0.2, 0.2, 1.0,
                    0.8, 1.0, 0.2,
                    0.75, 0.75, 0.75,
                    0.35, 0.35, 0.35,
                    0.5, 0.5, 0.5 };
    
    glClear(GL_COLOR_BUFFER_BIT);

    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);

    glColorPointer(3, GL_FLOAT, 0, colors);
    glVertexPointer(2, GL_INT, 0, vertices);

    glDrawArrays(GL_POLYGON, 0, sizeof(vertices) / sizeof(GLint));
    
    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_COLOR_ARRAY);

    glFlush();
}

int main(int argc, char **argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB);
    glutInitWindowSize(512, 512);
    glutCreateWindow(argv[0]);

    init();

    glutDisplayFunc(display);
    glutMainLoop();

    return 0;
}

【问题讨论】:

  • user253751:看起来我遇到的问题是 glOrtho。这就说得通了。我会在解决方案中解决这个问题。

标签: c opengl opengl-1.x


【解决方案1】:

您的顶点在剪裁平面之外太远了。

glOrtho 通常使用像素坐标设置(但这不是必需的)参见ref

你可能想要

glOrtho(0.0, 512.0, 0.0, 512.0, -1.0, 1.0);

【讨论】:

  • 了解 glOrtho 一直是我要学习的内容之一。谢谢。
  • @testaccoun0987 没问题,This 是一个非常好的关于 OpenGL 中使用的坐标系的教程。
  • @testaccoun0987 glOrtho 基本上是 glScalef 和 glTranslatef。但不是告诉它要缩放和平移多少,而是告诉它你希望屏幕边缘的坐标。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-31
  • 1970-01-01
  • 1970-01-01
  • 2012-12-27
相关资源
最近更新 更多