【问题标题】:GLSL errors in visual studioVisual Studio 中的 GLSL 错误
【发布时间】:2015-12-21 04:56:49
【问题描述】:

我正在尝试使用 GLSL 编写着色器,但每当我尝试编译此代码时,Visual Studio 中就会引发异常,我不知道如何处理它或究竟是什么导致了这里的问题,所以我会很感激帮助。异常说:

Open GL.exe 中 0x00220645 处的第一次机会异常:0xC0000005:访问冲突读取位置 0x00D54000。

我真的不知道该怎么做。当我检查我的输出时,我发现除了两行之外,一切都按预期进行:

'Open GL.exe' (Win32): Loaded 'C:\Windows\SysWOW64\ig7icd32.dll'. Cannot find or open the PDB file.
'Open GL.exe' (Win32): Loaded 'C:\Windows\SysWOW64\igdusc32.dll'. Cannot find or open the PDB file.

这是我的代码:

Main.cpp

#include <iostream>
#include "Display.h"
#include "Shader.h"

int main(int argc, char *argv[])
{
    Display display(800, 600, "test");
    Shader shader("basicshader");

    while (!display.isClosed())
    {
        display.Clear(1.0f, 0.0f, 0.0f, 1.0f);
        shader.Bind();
        display.Update();
    }

    return 0;
}

Display.cpp

#pragma once
#include "Display.h"

Display::Display(int width, int height, const char *title)
{
    if (SDL_Init(SDL_INIT_EVERYTHING) == 0)
    {
        SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);

        m_window = SDL_CreateWindow(title, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, SDL_WINDOW_OPENGL);
        m_context = SDL_GL_CreateContext(m_window);

        GLenum status = glewInit();
        if (status != GLEW_OK){
            std::cerr << "this is where the problem is" << std::endl;
        }
        m_isClosed = false;
    }
}


Display::~Display()
{
        std::cerr << "destructor ran" << std::endl;
        SDL_GL_DeleteContext(m_context);
        SDL_DestroyWindow(m_window);
        SDL_Quit();
}

void Display::Update()
{
    SDL_Event event;
    SDL_GL_SwapWindow(m_window);

    while (SDL_PollEvent(&event))
    {
        switch (event.type)
        {
        case SDL_QUIT:
            m_isClosed = true;
        }
    }
}

void Display::Clear(float r, float g, float b, float a)
{
    glClearColor(r, g, b, a);
    glClear(GL_COLOR_BUFFER_BIT);
}

bool Display::isClosed(){
    return m_isClosed;
}

Display.h

#pragma once
#include <SDL.h>
#include <glew.h>
#include <iostream>

class Display
{
public:
    void Update();
    void Clear(float r, float g, float b, float a);
    bool isClosed();
    Display(int width, int height, const char *title);
    virtual  ~Display();
private:
    bool m_isClosed;
    SDL_Window* m_window;
    SDL_GLContext m_context;
};

Shader.cpp

#pragma once
#include "Shader.h"

std::string Shader::LoadShader(const std::string& filename)
{

    std::ifstream file;
    std::string output;
    std::string line;
    file.open(filename.c_str());
    if (file.is_open())
    {
        while (file)
        {
            std::getline(file, line);
            output.append(line + "\n");
        }
        file.close();
        return output;
    }
}

GLuint Shader::CreateShader(const std::string& text, GLenum shadertype)
{
    GLuint shader = glCreateShader(shadertype);
    const GLchar* shadersourcestrings[1];
    GLint shadersourcelengths[1];

    shadersourcestrings[0] = text.c_str();
    shadersourcelengths[0] = text.length();

    glShaderSource(shader, 1, shadersourcestrings, shadersourcelengths);
    glCompileShader(shader);
    return shader;
}

void Shader::Bind()
{
    glUseProgram(m_program);
}


Shader::Shader(const std::string& filename)
{
    m_program = glCreateProgram();
    m_shaders[0] = CreateShader(LoadShader(filename + ".shade_v"), GL_VERTEX_SHADER);
    m_shaders[1] = CreateShader(LoadShader(filename + ".shade_f"), GL_FRAGMENT_SHADER);

    for (unsigned int i = 0; NUMOFSHADERS; i++)
    {
        glAttachShader(m_program, m_shaders[i]);  <~(breaks here)
    };

    glBindAttribLocation(m_program, 0, "position");
    glLinkProgram(m_program);
}

Shader::~Shader()
{
    for (unsigned int i = 0; NUMOFSHADERS; i++)
    {
        glDetachShader(m_program, m_shaders[i]);
        glDeleteShader(m_shaders[i]);
    }

    glDeleteProgram(m_program);
}

Shader.h

#pragma once
#include <iostream>
#include <fstream>
#include <string>
#include <glew.h>


class Shader
{
public:
    const static unsigned int NUMOFSHADERS = 2;

    GLuint m_program;
    GLuint m_shaders[NUMOFSHADERS];

    void Bind();
    static std::string LoadShader(const std::string& filename);
    static GLuint CreateShader(const std::string& text, GLenum shadertype);
    Shader(const std::string& filename);
    virtual ~Shader();
};

basicshader.shade_v

#version 120

void main()
{
    gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}

basicshader.shade_f

#version 120

attribute vec3 position;

void main()
{
    gl_position = vec4(postion, 1.0);
}

【问题讨论】:

  • 看在上帝的份上,请stop reading files line by line! 人们为什么要这样做?
  • 这会帮助我找到我的解决方案,还是你只是用我的语法表达个人意见?我不介意阅读,但我仍然是一个初学者,而且对于提到的一些事情有点难以理解,所以如果它不完全“相关”,我宁愿不要浪费我的时间。如果是我有点需要你解释一下(如果这不是问题),否则我仍然会被卡住。

标签: c++ visual-studio opengl


【解决方案1】:

一个问题是,如果LoadShader 无法打开文件,它会返回垃圾,因为它从末尾掉了下来,没有返回任何东西(这会导致未定义的行为)。这可能会导致您遇到的问题。

如果您编译时警告已达到最大值 (/W4),您将收到一条警告(“并非所有控制路径都返回值”,或类似的内容)。

【讨论】:

  • 看来这是问题所在。谢谢,现在我只需要弄清楚如何解决它。
猜你喜欢
  • 1970-01-01
  • 2020-02-05
  • 2011-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-10
相关资源
最近更新 更多