glCreateShader(GL_VERTEX_SHADER);访问冲突执行位置

Posted

技术标签:

【中文标题】glCreateShader(GL_VERTEX_SHADER);访问冲突执行位置【英文标题】:glCreateShader(GL_VERTEX_SHADER); access violation executing location 【发布时间】:2019-11-04 11:12:15 【问题描述】:

我正在尝试绘制一些文本,并且在尝试为文本创建着色器程序时,我收到来自GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER); 的访问冲突执行位置错误

问题所在的主函数的开始:

int main(int argc, char **argv) 
    //GLTtext* text = gltCreateText();
    //gltSetText(text, "ElectroCraft");

    //GLFWwindow* window;
    int width = 860, height = 490;
    if (!glfwInit()) 
        printf("failed to init glfw");
        return -1;
    
    glutInit(&argc, argv);
    window = glfwCreateWindow(width, height, "ElectroCraft", NULL, NULL);
    glfwMakeContextCurrent(window);
    if (!window) 
        printf("failed to start window");
        glfwTerminate();
        return -1;
    
    /*if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) 
        std::cout << "Failed to initialize GLAD" << std::endl;
        return -1;
    */
    //build and compile shader program
    //-----------------------------------
    //vertex shader
    GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
    glCompileShader(vertexShader);
    //check for shader compile errors
    int success;
    char infoLog[512];
    glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
    if (!success) 
        glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
        std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
    
    //fragment shader
    int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
    glCompileShader(fragmentShader);
    //check for shader compile errors
    glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
    if (!success) 
        glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);
        std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;
    
    // link shaders
    int shaderProgram = glCreateProgram();
    glAttachShader(shaderProgram, vertexShader);
    glAttachShader(shaderProgram, fragmentShader);
    glLinkProgram(shaderProgram);
    //check for liunking errors
    glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
    if (!success) 
        glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
        std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;
    
...

全部包含,因为这也可能是问题所在:

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <GL/freeglut.h>
#include <map>
#include <GL/GL.h>
#include <stdio.h>
#include <string>
#include <glm\glm.hpp>
#include <iostream>
#include <ft2build.h>
//#include <glad.h>
#include FT_FREETYPE_H
using namespace std;

我可能会遇到这个问题,因为我可能没有提供正确的参数或其他东西。

【问题讨论】:

【参考方案1】:

您已包含glew,但您尚未对其进行初始化。

在访问任何 GL 函数之前,插入以下代码:

GLenum err = glewInit();
if (GLEW_OK != err)

   /* Problem: glewInit failed, something is seriously wrong. */
   std::cerr << "Error: " << glewGetErrorString(err) << std::endl;
   ...

std::cerr << "Status: Using GLEW " << glewGetString(GLEW_VERSION) << std::endl;

参考:GLEW Basics

【讨论】:

我已将它添加到我的项目并运行它我仍然得到同样的错误 你有链接到 GLEW 库吗?可以在调用glewInit();之前设置glewExperimental = GL_TRUE;,看看能不能解决问题 问题依旧 顺便说一句,您应该删除以下标题:GL/freeglut.hGL/GL.h 删除两个标题停止了问题,但由于我上面的示例代码中没有包含其他一些东西,我似乎需要两个标题,因为我遇到了更多错误,例如 glClear undefined。但是这两个标题可能导致 glCreateShader() 给出这个错误的原因是什么

以上是关于glCreateShader(GL_VERTEX_SHADER);访问冲突执行位置的主要内容,如果未能解决你的问题,请参考以下文章

glCreateShader 上的 GLUT 分段错误

glCreateShader 在 OSX 上抛出异常,为啥?

openGL之API学习(一八七)gl_Vertex

glCreateShader(GL_VERTEX_SHADER);访问冲突执行位置

调用glCreateShader崩溃的问题及解决

为啥调用 glCreateShader 时这个 OpenGL 着色器分段错误?