当前位置: 首页 > 知识库问答 >
问题:

glewInit()失败和OpenGL错误1282

柳胜
2023-03-14

我有一个非常基本的OpenGL程序,使用glfw3进行窗口操作。

这里是我的主要:

//Headers
#include <GL\glew.h>
#include <GLFW/glfw3.h>
#include "Utils.h"



//Function Prototypes
void setupEvents(GLFWwindow* window);


//Main function
int main(void)
{
    GLFWwindow* window;
    if (!glfwInit())    exit(EXIT_FAILURE);

    window = glfwCreateWindow(640, 480, "Simple example", NULL, NULL);
    glewExperimental = GL_FALSE;
    GLenum error = glGetError();

    if (error != GL_NO_ERROR)
    {
        std::cout << "OpenGL Error: " << error << std::endl;
    }
    GLenum glewinit = glewInit();
    if (glewinit != GLEW_OK) {
        std::cout << "Glew not okay! " << glewinit;
        exit(EXIT_FAILURE);
    }
    if (!window){   glfwTerminate();    exit(EXIT_FAILURE); } //Failed to create window

    //Make our window current
    glfwMakeContextCurrent(window);
    setupEvents(window);

    //Let's make our program
    //GLuint glProgram = LoadShaders("../Shaders/Section_1/Basic.vert", "../Shaders/Section_1/Basic.frag");
    GLuint glProgram = LoadShaders("Basic.vert", "Basic.frag");

    while (!glfwWindowShouldClose(window))
    {
        glClear(GL_COLOR_BUFFER_BIT);

        //Swap buffers and call events.
        glfwSwapBuffers(window);
        glfwPollEvents();
    }



    //Destory our window and exit glfw.
    glfwDestroyWindow(window); 
    glfwTerminate();
    exit(EXIT_SUCCESS);
}

static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
    //The key callback
    if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
        glfwSetWindowShouldClose(window, GL_TRUE);
}

void setupEvents(GLFWwindow* window) {
    //Setup our events.
    glfwSetKeyCallback(window, key_callback);
} 

Utils:

#include <GL\glew.h>
#include <glm/glm.hpp>
#include <fstream> 
#include <vector>
#include <stdlib.h>
#include <algorithm>
#include <iostream>
#include <string>

using namespace std;
GLuint LoadShaders(const char * vertex_file_path, const char * fragment_file_path){

    // Create the shaders
    GLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER);
    GLuint FragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);

    // Read the Vertex Shader code from the file
    std::string VertexShaderCode;
    std::ifstream VertexShaderStream(vertex_file_path, std::ios::in);
    if (VertexShaderStream.is_open())
    {
        std::string Line = "";
        while (getline(VertexShaderStream, Line))
            VertexShaderCode += "\n" + Line;
        VertexShaderStream.close();
    }

    // Read the Fragment Shader code from the file
    std::string FragmentShaderCode;
    std::ifstream FragmentShaderStream(fragment_file_path, std::ios::in);
    if (FragmentShaderStream.is_open()){
        std::string Line = "";
        while (getline(FragmentShaderStream, Line))
            FragmentShaderCode += "\n" + Line;
        FragmentShaderStream.close();
    }

    GLint Result = GL_FALSE;
    int InfoLogLength;

    // Compile Vertex Shader
    printf("Compiling shader : %s\n", vertex_file_path);
    char const * VertexSourcePointer = VertexShaderCode.c_str();
    glShaderSource(VertexShaderID, 1, &VertexSourcePointer, NULL);
    glCompileShader(VertexShaderID);

    // Check Vertex Shader
    glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &Result);
    glGetShaderiv(VertexShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
    std::vector<char> VertexShaderErrorMessage(InfoLogLength);
    glGetShaderInfoLog(VertexShaderID, InfoLogLength, NULL, &VertexShaderErrorMessage[0]);
    fprintf(stdout, "%s\n", &VertexShaderErrorMessage[0]);

    // Compile Fragment Shader
    printf("Compiling shader : %s\n", fragment_file_path);
    char const * FragmentSourcePointer = FragmentShaderCode.c_str();
    glShaderSource(FragmentShaderID, 1, &FragmentSourcePointer, NULL);
    glCompileShader(FragmentShaderID);

    // Check Fragment Shader
    glGetShaderiv(FragmentShaderID, GL_COMPILE_STATUS, &Result);
    glGetShaderiv(FragmentShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
    std::vector<char> FragmentShaderErrorMessage(InfoLogLength);
    glGetShaderInfoLog(FragmentShaderID, InfoLogLength, NULL, &FragmentShaderErrorMessage[0]);
    fprintf(stdout, "%s\n", &FragmentShaderErrorMessage[0]);

    // Link the program
    fprintf(stdout, "Linking program\n");
    GLuint ProgramID = glCreateProgram();
    glAttachShader(ProgramID, VertexShaderID);
    glAttachShader(ProgramID, FragmentShaderID);
    glLinkProgram(ProgramID);

    // Check the program
    glGetProgramiv(ProgramID, GL_LINK_STATUS, &Result);
    glGetProgramiv(ProgramID, GL_INFO_LOG_LENGTH, &InfoLogLength);
    std::vector<char> ProgramErrorMessage(max(InfoLogLength, int(1)));
    glGetProgramInfoLog(ProgramID, InfoLogLength, NULL, &ProgramErrorMessage[0]);
    fprintf(stdout, "%s\n", &ProgramErrorMessage[0]);

    glDeleteShader(VertexShaderID);
    glDeleteShader(FragmentShaderID);

    return ProgramID;
}

输出:

OpenGL Error: 1282
Glew not okay! 1

我真的不知道我做错了什么。

共有1个答案

东郭阳德
2023-03-14

您检查窗口创建失败的时间太晚了,您试图在没有活动GL上下文的情况下调用GL函数。两者都错了。它应该是(复制粘贴并重新排序代码):

GLFWwindow* window;
if (!glfwInit())    exit(EXIT_FAILURE);

window = glfwCreateWindow(640, 480, "Simple example", NULL, NULL);
if (!window){   glfwTerminate();    exit(EXIT_FAILURE); } //Failed to create window

//Make our window current
glfwMakeContextCurrent(window);

glewExperimental = GL_FALSE;
GLenum error = glGetError();

if (error != GL_NO_ERROR)
{
    std::cout << "OpenGL Error: " << error << std::endl;
}
GLenum glewinit = glewInit();
if (glewinit != GLEW_OK) {
    std::cout << "Glew not okay! " << glewinit;
    exit(EXIT_FAILURE);
}
 类似资料:
  • 我正在尝试用glew/glfw构建一个OpenGL应用程序。我下载了二进制文件,将它们放在文件夹的根目录中,将路径添加到include和lib目录,并告诉我的项目需要glew32。lib,GLFW。lib和opengl32。lib。 我甚至复制了glew32。因为我的项目看不到,所以将lib添加到根目录。 我必须保留项目目录中的所有依赖项,因为我将分发它。我不知所措。 现在,当我运行我的程序时,它

  • 我在Visual Studio 2010中启动了一个空项目并下载了最新版本的GLEW和GLFW。我相信我已经在项目中正确设置了它们 我可以通过glfwInit()正确初始化GLFW,并且可以打开一个窗口上下文。然而,当我试图通过glewInit()初始化GLEW时,我得到了一个入口点Not Found错误。 未找到入口点程序入口点_glewInit@0在动态链接库D:\Blah\Debug\Tes

  • 我正在Linux上运行一些OpenGL程序。无法理解初始化glew时收到错误的原因。(错误1.5.2) 由以下人员管理:

  • 我试图使用mongorestore还原一个有100个集合(800GB)的数据库,它是从Mongo2.4.4中作为备份的。我使用了以下命令: 我使用batchSize=1000、500、100来尝试使其工作。我在10-15次收集后得到一个插入错误。当我得到这个错误时,它几乎完美地运行了将近一个半小时。 失败:还原错误:bp_prod079.anepisoDebreault:从/data/backup

  • 问题内容: 今天,我第一次在Fedora 21上安装了docker。现在,我需要从默认的/ var / lib / docker更改docker images文件夹的位置。 复制文件(跳过devicemapper子文件夹,docker服务停止)并更改/ etc / sysconfig / docker(添加- g选项)后,我再次运行docker service,没有问题,devicemapper

  • 我目前正在学习如何使用Appium。 我的工作区如下所示: 我正在使用Windows 10 Pro 过了一段时间,我把一切都安排好了。我认为我的路径变量设置正确,我可以在cmd中调用Java和adb。 所以我想开始一些测试用例,我想在其中自动登录邮件应用程序。 在这里我遇到了错误。 以下是Appium所需的功能: 我在google上搜索了错误:packageAndLaunchActivityFro