【发布时间】:2014-12-17 15:21:21
【问题描述】:
我对 C++ 相当陌生,所以现在进入这种类型的东西可能有点为时过早,但无论如何。我一直在努力在 OpenGL 和 SDL 中设置一个简单的三角形,但我已经发生了一些奇怪的事情。第一件事是,当我编译它时,我得到三个错误之一:
Line 194: ERROR: Compiled vertex shader was corrupt.
Line 156: ERROR: 0:1: '' : #version required and missing. ERROR: 0:1: '<' : syntax error syntax error
Line 126: ERROR: 0:1: '' : #version required and missing.
ERROR: 0:1: 'lour' : syntax error syntax error
就像字面意思一样,我只是反复点击构建按钮,无论它显示一个消息还是另一个消息,它似乎都是完全随机的。好的,这很奇怪,但更奇怪的是,当我在调试模式下运行它(即我设置断点并逐步执行所有操作)时,它运行良好,没有明显的原因。
所以,我得出的结论是我在内存方面做了一些愚蠢的事情,但无论如何这里是相关代码(询问您是否想看更多):
读取文件功能
std::string readFile(std::string name) {
std::ifstream t1(name.c_str());
if (t1.fail()) {
std::cout << "Error loading stream" << "\n";
}
std::stringstream buffer;
buffer << t1.rdbuf();
std::string src = buffer.str();
std::cout << src << std::endl;
return src;
}
编译着色器
const char *vSource = readFile("vertexShader.gl").c_str();
// Read fragment shader
const char *fSource = readFile("fragmentShader.gl").c_str();
GLuint vs = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vs, 1, &vSource, NULL);
glCompileShader(vs);
GLint isCompiled = 0;
glGetShaderiv(vs, GL_COMPILE_STATUS, &isCompiled);
if(isCompiled == GL_FALSE) { // ... Error stuff here...
N.B 有一个片段着色器编译位,看起来完全一样。第 126 行和第 156 行分别位于顶点着色器和片段着色器的错误部分。
链接着色器
shader_programme = glCreateProgram();
glAttachShader(shader_programme, vs);
glAttachShader(shader_programme, fs);
glLinkProgram(shader_programme);
GLint isLinked = 0;
glGetProgramiv(shader_programme, GL_LINK_STATUS, (int *)&isLinked);
if(isLinked == GL_FALSE) { // ... Error stuff ... }
glDetachShader(shader_programme, vs);
glDetachShader(shader_programme, fs);
您可以根据需要查看着色器,但它们可以工作(因为片段着色器在调试模式下显示正确的颜色)所以我不'认为它们是问题所在。
我在 OSX 上使用 SDL2、OpenGL v3.2、GLSL v1.50 和 Xcode 4(是的,如果你知道我的意思,我做了文本文件)。
很抱歉发布了很多代码 - 如果有人有任何关于如何在 Xcode 中调试内存泄漏的提示可能会有所帮助,但无论如何谢谢:)
【问题讨论】: