【问题标题】:Why is a float an "unexpected type"为什么浮点数是“意外类型”
【发布时间】:2016-03-23 10:16:11
【问题描述】:

我开始使用 OpenGL。我在 Visual Studio C++ 社区(在 Windows 10 上运行)中安装了 GLEW 和 GLFW 库。然后我按照教程,能够在窗口上绘制一个矩形。我继续按照教程进行操作,直到找到您要添加的部分:

glViewport(0.0f, 0.0f, SCREEN_WIDTH, SCREEN_HEIGHT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, SCREEN_WIDTH, 0, SCREEN_HEIGHT, 0, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();               

即使我添加了那个,四边形仍在绘制中。在视频中,导师的矩形对于窗口来说太小了,但在我的机器上一切正常,矩形的大小与添加这些行之前的大小相同(即使我的数组使用了小数)。 我开始寻找会使这些行“无效”的东西。过了一会儿,我忽略了它们。

但是在我删除它们并尝试创建另一个四边形之后,编译器说浮点是函数 glVertexPointer 上的“意外类型”。 image

我该如何解决这个问题? 以下是源代码:

#include <GL\glew.h>
#include <GLFW\glfw3.h>
#include <iostream>
#include <math.h>
#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480


int main(void) {

GLFWwindow *window;


if (!glfwInit()) {
    return -1;
};


window = glfwCreateWindow(SCREEN_WIDTH, SCREEN_HEIGHT, "OGL", NULL, NULL);

if (!window) {
    glfwTerminate();
    return -1;
};

glfwMakeContextCurrent(window);

float vertices[] = {

    -0.5, 0.5, 0.0,
    0.5, 0.5, 0.0,
    -0.5, -0.5, 0.0,
    0.5, -0.5, 0.0

};

while (!glfwWindowShouldClose(window)) {

    glClear(GL_COLOR_BUFFER_BIT);

    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, float, 0, vertices);
    glDrawArrays(GL_QUADS, 0, 4);
    glDisableClientState(GL_VERTEX_ARRAY);


    glfwSwapBuffers(window);
    glfwPollEvents();

}

glfwTerminate();

};

【问题讨论】:

    标签: c++ visual-studio opengl glfw glew


    【解决方案1】:

    看起来它抱怨的那一行是:

    glVertexPointer(3, float, 0, vertices);
    

    我想你的意思是:

    glVertexPointer(3, GL_FLOAT, 0, vertices);
    

    这里的区别在于float是一个类型,GL_FLOAT是一个值。您不能将类型作为参数传递给函数。第二个参数必须是 GLenum 类型。

    更多信息在这里:glVertexPointer

    【讨论】:

    • 天哪!是位图!我建议您在有新问题时提出一个新问题,@slashblock
    • 数组的类型仍然必须是 float 而不是 GL_FLOAT。您必须了解在哪里使用类型以及在哪里使用 GLenums。
    • 我很困惑。为什么之前完全相同的代码可以工作?我需要重新安装 Visual Studio 吗?我的电脑坏了?
    • 看,只需按照您发布的代码,但只进行我在一行中提到的更改。您的错误是将float其他 用法转换为GL_FLOAT,但我从未说过您应该这样做。
    • 我创建了一个新项目,并将 GL_FLOAT 作为 GLenum 的参数放在 glVertexPointer 中,并将 float 作为数组的标识符。现在可以了。
    【解决方案2】:

    float 是表示类型的保留字,不能作为参数传递。你需要GL_FLOAT。见https://www.opengl.org/sdk/docs/man2/xhtml/glVertexPointer.xml

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-08
      • 2016-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多