C++ OpenGL与当前代码的崩溃(从书本中开始)

C++ OpenGL与当前代码的崩溃(从书本中开始),c++,opengl,glsl,glfw,C++,Opengl,Glsl,Glfw,我正在尝试创建一个简单的着色器程序(4.4)。但无论我做什么,我的窗户总是看起来很白,永远在加载。。。所以我的问题是,当我试图从我的两个文件(与main.cpp位于同一目录)加载任何内容时,我的程序似乎崩溃了 代码运行正常,没有明显问题: #include <GL\glew.h> #include <GLFW\glfw3.h> #include <iostream> #include <fstream> #include <string>

我正在尝试创建一个简单的着色器程序(4.4)。但无论我做什么,我的窗户总是看起来很白,永远在加载。。。所以我的问题是,当我试图从我的两个文件(与main.cpp位于同一目录)加载任何内容时,我的程序似乎崩溃了

代码运行正常,没有明显问题:

#include <GL\glew.h>
#include <GLFW\glfw3.h>
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

#define numVAOs 1

GLuint renderingProgram;
GLuint vao[numVAOs];

void printShaderLog(GLuint shader) {
    int len = 0;
    int chWrittn = 0;
    char* log;
    glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &len);

    if (len > 0) {
        log = (char*)malloc(len);
        glGetShaderInfoLog(shader, len, &chWrittn, log);
        cout << "Shader Info Log: " << log << endl;
        free(log);
    }
}

void printProgramLog(int prog) {
    int len = 0;
    int chrWrittn = 0;
    char* log;
    glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &len);

    if (len > 0) {
        log = (char*)malloc(len);
        glGetProgramInfoLog(prog, len, &chrWrittn, log);
        cout << "Program Info Log: " << log << endl;
        free(log);
    }
}

bool checkOpenGLError() {
    bool foundError = false;
    int glErr = glGetError();
    while (glErr != GL_NO_ERROR) {
        cout << "glError: " << glErr << endl;
        foundError = true;
        glErr = glGetError();
    }
    return foundError;
}

string readShaderSource(const char* filePath) {
    string content;
    ifstream fileStream(filePath, ios::in);
    string line = "";

    while (!fileStream.eof()) {
        getline(fileStream, line);
        content.append(line + "\n");
    }
    fileStream.close();
    return content;
}

GLuint createShaderProgram() {
    GLint vertCompiled;
    GLint fragCompiled;
    GLint linked;
    //const char* vshaderSource =
    //  "#version 430    \n"
    //  "void main(void) \n"
    //  "{gl_Position = vec4(0.0, 0.0, 0.0, 1.0);}";
    //
    //const char* fshaderSource =
    //  "#version 430    \n"
    //  "out vec4 color; \n"
    //  "void main(void) \n"
    //  "{ if (gl_FragCoord.x > 300) color = vec4(1.0, 0.0, 0.0, 1.0); else color = vec4(0.0, 0.0, 
    1.0, 1.0);}";

    string vertShader = readShaderSource("vshader.glsl");
    string fragShader = readShaderSource("fshader.glsl");
    cout << vertShader << endl;
    cout << fragShader << endl;

    const char* vertShaderSrc = vertShader.c_str();
    const char* fragShaderSrc = fragShader.c_str();


    GLuint vShader = glCreateShader(GL_VERTEX_SHADER);
    GLuint fShader = glCreateShader(GL_FRAGMENT_SHADER);

    glShaderSource(vShader, 1, &vertShaderSrc, NULL);

    glShaderSource(fShader, 1, &fragShaderSrc, NULL);
    glCompileShader(vShader);
    checkOpenGLError();
    glGetShaderiv(vShader, GL_COMPILE_STATUS, &vertCompiled);

    if (vertCompiled != 1) {
        cout << "vertex compilation failed" << endl;
        printShaderLog(vShader);
    }

    glCompileShader(fShader);
    checkOpenGLError();
    glGetShaderiv(fShader, GL_COMPILE_STATUS, &fragCompiled);

    if (fragCompiled != 1) {
        cout << "fragment compilation failed" << endl;
        printShaderLog(fShader);
    }
    GLuint vfProgram = glCreateProgram();
    glAttachShader(vfProgram, vShader);
    glAttachShader(vfProgram, fShader);
    glLinkProgram(vfProgram);
    checkOpenGLError();
    glGetProgramiv(vfProgram, GL_LINK_STATUS, &linked);

    if (linked != 1) {
        cout << "linking failed" << endl;
        printProgramLog(vfProgram);
    }

    return vfProgram;
}

void init(GLFWwindow* window) {
    renderingProgram = createShaderProgram();
    glGenVertexArrays(numVAOs, vao);
    glBindVertexArray(vao[0]);
}
void display(GLFWwindow* window, double currentTime) {
    glUseProgram(renderingProgram);
    glPointSize(230.0f);
    glDrawArrays(GL_POINTS, 0, 1);
}
int main(void) {
    if (!glfwInit()) { exit(EXIT_FAILURE); }
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    GLFWwindow* window = glfwCreateWindow(600, 600, "Chapter2 - program1", NULL, NULL);
    glfwMakeContextCurrent(window);
    if (glewInit() != GLEW_OK) { exit(EXIT_FAILURE); }
    glfwSwapInterval(1);
    init(window);
    while (!glfwWindowShouldClose(window)) {
        display(window, glfwGetTime());
        glfwSwapBuffers(window);
        glfwPollEvents();
    }
    glfwDestroyWindow(window);
    glfwTerminate();
    exit(EXIT_SUCCESS);
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
#定义numVAOs 1
GLuint渲染程序;
GLuint vao[numVAOs];
void printShaderLog(GLuint着色器){
int len=0;
int chWrittn=0;
字符*日志;
glGetShaderiv(着色器、GL\u INFO\u LOG\u LENGTH和len);
如果(len>0){
log=(char*)malloc(len);
glGetShaderInfoLog(着色器、len和chWrittn、log);

cout正如@derhass指出的,您缺少了一个
glClear()
(废弃了着色器加载程序):

//g++main.cpp`pkg-config--cflags--libs-glew-glfw3`
#包括
#包括
#包括
无效检查状态(GLuint obj、bool isShader)
{

GLint status=GL_FALSE,log[1正如@derhass指出的,您缺少一个
glClear()
(禁用着色器加载程序):

//g++main.cpp`pkg-config--cflags--libs-glew-glfw3`
#包括
#包括
#包括
无效检查状态(GLuint obj、bool isShader)
{

GLint status=GL_FALSE,log[1主循环中缺少这两行代码。第一行设置“环境”或“背景”的颜色。第二行在每帧之前清除屏幕和深度缓冲区

glClearColor(0,0,0,1);


glClear(GL\u COLOR\u BUFFER\u BIT | GL\u DEPTH\u BUFFER\u BIT)
主循环中缺少这两行代码。第一行设置“环境”或“背景”的颜色。第二行在每帧之前清除屏幕和深度缓冲区

glClearColor(0,0,0,1);



glClear(GL_颜色_缓冲区_位| GL_深度_缓冲区_位)

你从来都不会使用gall
glfwSwapBuffers
,所以无论你渲染什么都不会出现。你也从来不会调用
glClear
,所以你的颜色缓冲区内容是没有定义的。你还试图在没有设置顶点属性数组的情况下绘制一个点。@derhass
glfwSwapBuffers
实际上被调用:)哇,你怎么做的我错过了吗?不管怎样,这段代码仍然非常缺乏。正如我所说的,我对这段代码非常陌生,那么它是什么,它在代码@derhass中缺少了这么多,因为我只是想知道如何才能做得更好,或者我需要知道的是,你永远不会gall
glfwSwapBuffers
,所以无论你渲染什么都不会出现。你也永远不会计算l
glClear
所以你的颜色缓冲区内容仍然没有定义。你还试图在没有设置顶点属性数组的情况下画一个点。@derhass
glfwSwapBuffers
实际上被调用:)哇,我怎么会错过这个呢?不管怎样,这个代码仍然非常缺乏。所以正如我所说的,我对这个非常陌生,那是什么呢t在代码@derhass中缺少太多内容,因为我只是想知道如何才能做得更好,或者我需要了解他们什么。感谢您的回答和解释这些行的作用。遗憾的是,我的代码仍然不会显示任何内容,仍然只是在加载一个白色屏幕。@ThobiasLarsen代码本身看起来很好,有可能吗您的程序找不到着色器文件?这会导致类似您的问题,如果您使用的是visual studio,则应将工作目录设置为$(ProjectDir)。谢谢你的推荐,但很遗憾,它被设置为projectDir。因此,读取文件时可能仍然存在问题,但我不知道如何读取。可能是我将文件放置在错误的位置或其他地方?@ThobiasLarsen projectDir表示包含.vcxproj文件的文件夹,如果着色器文件不在该文件夹中,请尝试将它们移动到该文件夹。您可能会我必须浏览一下你的目录才能找到它。(这不是很明显)该死的,你说得对。我把它放在一个文件夹里,所以它不工作,该死的,它现在实际运行。非常感谢。你保存了我的OpenGL学习!嘿。谢谢你的回答和解释。遗憾的是,我的代码仍然不会显示任何内容,仍然只是用一个白色屏幕加载。@ThobiasLarsen代码本身看起来很好,是吗您的程序可能找不到着色器文件?这会导致类似您的问题,如果您使用的是visual studio,则应将工作目录设置为$(ProjectDir)。谢谢你的推荐,但很遗憾,它被设置为projectDir。因此,读取文件时可能仍然存在问题,但我不知道如何读取。可能是我将文件放置在错误的位置或其他地方?@ThobiasLarsen projectDir表示包含.vcxproj文件的文件夹,如果着色器文件不在该文件夹中,请尝试将它们移动到该文件夹。您可能会我必须浏览一下你的目录才能找到它。(不是很明显)该死的,你说得对。我把它放在一个文件夹里,所以它不工作,该死的,它现在真的运行了。非常感谢你。你保存了我的OpenGL学习!
// g++ main.cpp `pkg-config --cflags --libs glew glfw3`
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>

void CheckStatus( GLuint obj, bool isShader )
{
    GLint status = GL_FALSE, log[ 1 << 11 ] = { 0 };
    ( isShader ? glGetShaderiv : glGetProgramiv )( obj, isShader ? GL_COMPILE_STATUS : GL_LINK_STATUS, &status );
    if( status == GL_TRUE ) return;
    ( isShader ? glGetShaderInfoLog : glGetProgramInfoLog )( obj, sizeof( log ), NULL, (GLchar*)log );
    std::cerr << (GLchar*)log << "\n";
    std::exit( EXIT_FAILURE );
}

void AttachShader( GLuint program, GLenum type, const char* src )
{
    GLuint shader = glCreateShader( type );
    glShaderSource( shader, 1, &src, NULL );
    glCompileShader( shader );
    CheckStatus( shader, true );
    glAttachShader( program, shader );
    glDeleteShader( shader );
}

const char* const vert = R"GLSL(
#version 430
void main()
{
    gl_Position = vec4( 0.0, 0.0, 0.0, 1.0 );
}
)GLSL";

const char* const frag = R"GLSL(
#version 430
out vec4 color;
void main()
{
    if( gl_FragCoord.x > 300 )
        color = vec4( 1.0, 0.0, 0.0, 1.0 );
    else
        color = vec4( 0.0, 0.0, 1.0, 1.0 );
}
)GLSL";

int main( int argc, char** argv )
{
    if( !glfwInit() )
    {
        exit( EXIT_FAILURE );
    }
    glfwWindowHint( GLFW_CONTEXT_VERSION_MAJOR, 4 );
    glfwWindowHint( GLFW_CONTEXT_VERSION_MINOR, 3 );
    GLFWwindow* window = glfwCreateWindow( 600, 600, "GLFW", NULL, NULL );
    glfwMakeContextCurrent(window);
    if( glewInit() != GLEW_OK )
    {
        exit( EXIT_FAILURE );
    }
    glfwSwapInterval(1);

    GLuint prog = glCreateProgram();
    AttachShader( prog, GL_VERTEX_SHADER, vert );
    AttachShader( prog, GL_FRAGMENT_SHADER, frag );
    glLinkProgram( prog );
    CheckStatus( prog, false );
    glUseProgram( prog );

    GLuint vao = 0;
    glGenVertexArrays( 1, &vao );
    glBindVertexArray( vao );

    while( !glfwWindowShouldClose( window ) )
    {
        glClearColor(0, 0, 0, 1);
        glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

        glUseProgram( prog );
        glPointSize( 230.0f );
        glDrawArrays( GL_POINTS, 0, 1 );
        glfwSwapBuffers( window );
        glfwPollEvents();
    }

    glfwDestroyWindow( window );
    glfwTerminate();
    exit( EXIT_SUCCESS );
}