gpt4 book ai didi

c++ - OpenGL 和 SDL '#version required and missing' 但在调试中工作

转载 作者:行者123 更新时间:2023-11-28 02:35:45 24 4
gpt4 key购买 nike

我对 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

就像字面意思一样,我只是反复点击构建按钮,它是否显示一条或另一条消息似乎完全随机。好吧,这很奇怪,但更奇怪的是,当我在 Debug模式下运行它时(即我设置了一个断点并单步执行所有操作)它完美地工作,没有明显的原因。

所以,我得出的结论是我用内存做了一些愚蠢的事情,但无论如何这里是相关的代码(问你是否想看更多):

读取文件功能

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);

如果需要,您可以看到着色器,但它们有效(因为片段着色器在 Debug模式下显示正确的颜色)所以我认为它们是问题所在。

我在 OSX 上使用 SDL2、OpenGL v3.2、GLSL v1.50 和 Xcode 4(是的,如果你明白我的意思,我做了文本文件的事情)。

很抱歉发布了很多代码 - 如果有人对如何调试 Xcode 中的内存泄漏有任何提示可能会有所帮助,但无论如何还是要感谢 :)

最佳答案

一旦读取字符串导致 vSource 引用已删除的内存(和未定义的行为),您就会丢弃这些字符串,而不是在您需要 时将源保留为 std::string char* 保持有效:

std::string vSource = readFile("vertexShader.gl");
char* vSourcecharp = vSource.c_str();
// Read fragment shader
std::string fSource = readFile("fragmentShader.gl");
char* fSourcecharp = fSource.c_str();


GLuint vs = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vs, 1, &vSourcecharp, NULL);
glCompileShader(vs);

关于c++ - OpenGL 和 SDL '#version required and missing' 但在调试中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27528886/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com