我遇到编译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。
答案 0 :(得分:3)
getline
剪掉\n
。这意味着您的整个文件不会有任何换行符。这一切都在一条线上,因此看起来像这样:
#version 410 void main() { }
那不是合法的GLSL。
请逐行停止阅读文件。如果您想阅读整个文件,请read the entire file。