'glPopMatrix': 找不到标识符。

问题描述 投票:0回答:1

我正在做OpenGL项目,尽管我包含了glut.h并链接了opengl32.lib、glfw3.lib、glaux.lib、glu32.lib、glut32.lib和do on等常用库,但还是出现了以下编译错误。以下是我的一段不能使用的代码(cpu_fan.h)。

#ifndef CPU_FAN
#define CPU_FAN
#include "parameter.h"
#include "dragHandler.h"
#include <iostream>
#include <glad/glad.h>
#include <GLFW\glfw3.h>
#include "motion.h"
#include "objects.h"
#include "bitmap.h"
#include "light.h"
#include <GL/glut.h>
#include <windows.h>

class  cpu_fan {
private:GLfloat c_center[3] = { 0.0075, 0.0075, 0.0075};
        GLfloat c_meshCylinder[3] = { 0.0075, 0.0075, 0.0075 };
        GLfloat c_meshBlade[3] = { 0.015, 0.015, 0.015 };
        GLfloat c_rim[3] = { 0., 0., 0. };
        GLfloat c_blade[3] = { .0 , .0, .0 };
        GLfloat fan_spin_theta = 0, y_spin = 0;
        GLuint fan_no_blades = 6;
        int sides = 30;
        float rim_start = 0., rim_end = -0.9;
        float mesh_start = rim_end - 0.05, mesh_end = mesh_start - 3.;
        int meshCount = 50;
        GLfloat v_blade[30][3] = { {0.5, 0., -0.6},
                            {4.05, 0.9, 0.},
                            {4.9, 2., 0.},
                            {5.5, 3., 0.},
                            {6.15, 4., 0.},
                            {6.73, 5., 0.},
                            {7.23, 6., 0.},
                            {7.55, 7., 0.},
                            {8.1, 8., 0.},
                            {8.5, 9., 0.},
                            {8.8, 10., 0.},
                            {9.1, 11., 0.},
                            {9.28, 12., -0.1},
                            {9.47, 13., -0.15},
                            {9.51, 14., -0.2},
                            {9.4, 15., -0.25},
                            {9., 15.8, -0.3},
                            {8., 16.72, -0.35},
                            {7., 17.3, -0.4},
                            {6., 17.60, -0.45},
                            {5., 17.70, -0.5},
                            {4., 17.57, -0.55},
                            {3., 17.4, -0.6},
                            {2., 16.46, -0.65},
                            {1.3, 16., -0.7},
                            {1., 15.46, -0.75},
                            {0.5, 15., -0.8},
                            {0.15, 14., -0.85},
                            {0.123, 13., -0.9},
                            {0.12, 12., -0.95} };
        point3D move;
        GLfloat viewTheta = 0.;

        bool visible = true;
        bool objMove = false;

        void draw_fan_blades();
        void draw_fan_center();
        void draw_fan_rim();
        void draw_cooler_grills();
        void showDescrpiton();
        void motionHandle();
public: void render();
};

void cpu_fan::showDescrpiton() {
    GLfloat diff = 1.5;

    glPushMatrix();
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glEnable(GL_BLEND);

    //  Transperent Glass Frame
    glColor4f(0., 0., 0., .7);
    glBegin(GL_POLYGON);
        glVertex3f(-10., -10., objLoc.z - diff);
        glVertex3f(-10., 10., objLoc.z - diff);
        glVertex3f(10., 10., objLoc.z - diff);
        glVertex3f(10., -10., objLoc.z - diff);
    glEnd();    
    glPopMatrix();
}

void cpu_fan::motionHandle() {

    if (((enterPressed && objIndex == REMOVE_FAN) || objMove == true) && !assemble)
    {
        objMove = true;
        move.x -= 0.007;
        if (move.x < disapphereLimit)
        {
            enterPressed = false;
            visible = false;
            objMove = false;
        }
    }
    else if (((enterPressed && objIndex == REMOVE_FAN-1) || objMove == true) && assemble)
    {
        objMove = true;
        visible = true;
        move.x += 0.007;
        if (move.x >= 0.)
        {
            enterPressed = false;
            objMove = false;
        }
    }
}

void cpu_fan::render() {
    motionHandle();
    if (!visible) return;
    glPushMatrix();
    glTranslatef(move.x, move.y, move.z);
    glRotatef(viewTheta, 0., 1., 0.);
    glColor3f(.001, 0.001, .001);
    glTranslatef(-0.974, .52, -0.745);
    glTranslatef(8.72, 4.321, -3.821);
    /// Remove this to stop rotate
    //glRotatef(y_spin * 0.5, 0., 1., 0.); //Rotate whole on Y axis
    //y_spin += 2.;
    //if (y_spin >= 720.) y_spin = 0;
    glRotatef(-90., 0., 1., 0.);
    glScalef(0.009375, 0.009375, 0.046875);
    draw_fan_blades();
    draw_fan_center();
    draw_fan_rim();
    draw_cooler_grills();
    glPopMatrix();
}

我的main.cpp的片段:

#include <iostream>
#include <glad/glad.h>
#include <GLFW\glfw3.h>
#include "parameter.h"
#include "motion.h"
#include "objects.h"
#include "bitmap.h"
#include "light.h"
#include <GL/glut.h>
#include <windows.h>

/* TEXTURE HANDLING */
void loadTexture(GLuint texture, const char* filename) {
    BmpLoader image(filename);
    glBindTexture(GL_TEXTURE_2D, texture);

    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

    gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, image.iWidth, image.iHeight, GL_RGB, GL_UNSIGNED_BYTE, image.data);
}

void textureInit() {
    // Create Texture.
    textures = new GLuint[NUM_TEXTURE];
    glGenTextures(NUM_TEXTURE, textures);

    // Load the Texture.
    for (int i = 0; i < NUM_TEXTURE; i++)
        loadTexture(textures[i], texPath[i]);
}

/* REDNDERING HANDLING */
void change_size(int w, int h) {
    // Update global parameters
    width = w;
    hight = h;
    // Do reshape
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    float ratio = 0.0f;
    h = h == 0 ? 1 : h;
    ratio = (float)w / (float)h;
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(80.0f, ratio, 0.7f, 100.0f);
    glMatrixMode(GL_MODELVIEW);
}

我在Visual Studio 2019中得到的构建错误。

1>------ Build started: Project: desktop-simulator, Configuration: Debug Win32 ------
1>main.cpp
1>C:\Users\username\cpu_fan.h(7,56): warning C4305: 'initializing': truncation from 'double' to 'GLfloat'
1>C:\Users\username\cpu_fan.h(8,57): warning C4305: 'initializing': truncation from 'double' to 'GLfloat'
1>C:\Users\username\cpu_fan.h(9,51): warning C4305: 'initializing': truncation from 'double' to 'GLfloat'
1>C:\Users\username\cpu_fan.h(15,39): warning C4305: 'initializing': truncation from 'double' to 'float'
1>C:\Users\username\cpu_fan.h(16,30): warning C4244: 'initializing': conversion from 'double' to 'float', possible loss of data
1>C:\Users\username\cpu_fan.h(16,60): warning C4244: 'initializing': conversion from 'double' to 'float', possible loss of data
1>C:\Users\username\cpu_fan.h(47,28): warning C4305: 'initializing': truncation from 'double' to 'GLfloat'
1>C:\Users\username\cpu_fan.h(66,2): error C3861: 'glPushMatrix': identifier not found
1>C:\Users\username\cpu_fan.h(71,2): error C3861: 'glColor4f': identifier not found
1>C:\Users\username\cpu_fan.h(72,10): error C2065: 'GL_POLYGON': undeclared identifier
1>C:\Users\username\cpu_fan.h(72,2): error C3861: 'glBegin': identifier not found
1>C:\Users\username\cpu_fan.h(73,3): error C3861: 'glVertex3f': identifier not found
1>C:\Users\username\cpu_fan.h(74,3): error C3861: 'glVertex3f': identifier not found
1>C:\Users\username\cpu_fan.h(75,3): error C3861: 'glVertex3f': identifier not found
1>C:\Users\username\cpu_fan.h(76,3): error C3861: 'glVertex3f': identifier not found
1>C:\Users\username\cpu_fan.h(77,2): error C3861: 'glEnd': identifier not found
1>C:\Users\username\cpu_fan.h(78,2): error C3861: 'glPopMatrix': identifier not found
1>C:\Users\username\cpu_fan.h(110,2): error C3861: 'glPushMatrix': identifier not found

请帮助我解决这个问题

先谢谢你

c++ visual-studio opengl visual-c++ glut
1个回答
1
投票

glPushMatrix, glPopMatrix 等已被废弃(传统的OpenGL),而没有在 核心 概况 OpenGL上下文. 你必须使用一个 兼容性 profile OpenGL上下文,您必须生成相应的OpenGL加载器。该 很高兴 loader生成器提供了一个 "Profile "选项,可以设置为 "Compatibility "或 "Core"

© www.soinside.com 2019 - 2024. All rights reserved.