OpenGL查询GL_COMPILE_STATUS返回错误的值

时间:2017-05-31 02:56:04

标签: c++ opengl compilation shader

我遇到编译GLSL代码的问题。当我尝试打印是否使用glGetShaderiv()正确编译了着色器时,我的程序有时会输出错误的结果。例如,使用此着色器(test.vert):

#version 410

void main()
{

}

并使用以下代码:

#include <GL\glew.h>
#include <GLFW\glfw3.h>

#include <iostream>
#include <fstream>
#include <string>

int main() {
    glfwInit();
    GLFWwindow* window = glfwCreateWindow(200, 200, "OpenGL", nullptr, nullptr);
    glfwMakeContextCurrent(window);

    glewInit();

    std::string fileText = "";
    std::string textBuffer = "";
    std::ifstream fileStream{ "test.vert" };
    while (fileStream.good()) {
        getline(fileStream, textBuffer);
        fileText += textBuffer;
    }

    GLuint vertShaderID = glCreateShader(GL_VERTEX_SHADER);
    const char* vertShaderText = fileText.c_str();
    glShaderSource(vertShaderID, 1, &vertShaderText, NULL);
    glCompileShader(vertShaderID);

    GLint vertCompiled;
    glGetShaderiv(vertShaderID, GL_COMPILE_STATUS, &vertCompiled);
    if (vertCompiled != GL_TRUE) {
        std::cerr << "vert shader did not compile." << std::endl;
    }

    glfwTerminate();

    system("PAUSE");

    return 0;
}

程序输出着色器没有编译,虽然我相信它应该有。我已经测试了许多其他着色器程序,例如通过随机放置&#39; a&#39;或者着色器代码中单词中间的另一个字母,我仍然得到不正确的输出(此测试没有错误输出)。

我也尝试打印出&#39; fileText&#39;的价值。它是正确的(与test.vert相同)。我做错了什么?

我使用的是64位Windows系统,支持的OpenGL版本是4.40。

1 个答案:

答案 0 :(得分:3)

getline剪掉\n。这意味着您的整个文件不会有任何换行符。这一切都在一条线上,因此看起来像这样:

#version 410 void main() { }

那不是合法的GLSL。

请逐行停止阅读文件。如果您想阅读整个文件,请read the entire file