使用 SDL2 和 xcode 4.6。我设法创建了一个 OpenGL 3.2 核心上下文。但是不能使用 glsl 1.50

Posted

技术标签:

【中文标题】使用 SDL2 和 xcode 4.6。我设法创建了一个 OpenGL 3.2 核心上下文。但是不能使用 glsl 1.50【英文标题】:Using SDL2 and xcode 4.6. I manage to create a OpenGL 3.2 core context. BUT can not use glsl 1.50 【发布时间】:2013-07-04 09:59:39 【问题描述】:

我使用了一个来自互联网的例子,作者说它有效,而且在我看来是合法的。

所以,我下载了 SDL2 并在调试中构建了框架。我创建了一个常规的 Opengl 2.1 应用程序来检查 SDL 是否正确构建并且我可以对其进行调试。

然后我创建了一个 OpenGL 3.2 核心上下文,我检查了主要版本是 3,次要版本是 2(调用 GlGetIntegerv)。

我也用过这条线:

SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);

我再次确认固定管道调用现在没有用了。到目前为止,一切顺利。

问题是当我尝试使用 glsl 1.50 的着色器时。它无法编译,并给出一些类似的错误(我很抱歉,我现在没有前面的错误):ERROR 0:2 syntax error syntax error

着色器加载代码如下所示:

char* filetobuf(char *file)

    FILE *fptr;
    long length;
    char *buf;

    fptr = fopen(file, "rb"); /* Open file for reading */
    if (!fptr) /* Return NULL on failure */
        return NULL;
    fseek(fptr, 0, SEEK_END); /* Seek to the end of the file */
    length = ftell(fptr); /* Find out how many bytes into the file we are */
    buf = (char*)malloc(length+1); /* Allocate a buffer for the entire length of the file and a null terminator */
    fseek(fptr, 0, SEEK_SET); /* Go back to the beginning of the file */
    fread(buf, length, 1, fptr); /* Read the contents of the file in to the buffer */
    fclose(fptr); /* Close the file */
    buf[length] = 0; /* Null terminator */

    return buf; /* Return the buffer */

和着色器:

vertex shader
#version 150 core
 
uniform mat4 viewMatrix, projMatrix;
 
in vec4 position;
in vec3 color;
 
out vec3 Color;
 
void main()

    Color = color;
    gl_Position = projMatrix * viewMatrix * position ;


fragment shader:
#version 150 core
 
in vec3 Color;
out vec4 outputF;
 
void main()

    outputF = vec4(Color,1.0);

如果我不使用 3.2 核心上下文,我会得到“不支持的版本”。但不是现在,所以错误一定是别的东西。

有什么线索吗?

更新 确实,读取着色器文件有些问题,因为我刚刚创建了一个 const char * 并在其中编写了整个着色器并将引用传递给 glShaderSource() 并且它现在可以工作了。有趣的是,我仍然不明白 filetobuf() 有什么问题(我应用了 Armin 修复程序)。

【问题讨论】:

您能否更具体地说明错误,错误发生在哪一行,如果您删除代码的某些部分,它会消失吗? 我一回到家就会用更多信息更新此案例,并可以尝试您建议的修复方法。谢谢 您是否检查了着色器中的非法(非 ascii)字符?如果您从网页复制着色器,它们可能是其中的一些 unicode 字符(使用 printf 或 NSLog 检查)。如果您在 OsX 系统上尝试导入 Foundations 框架并使用 NSString stringWithContentsOfFile:encoding:NSASCIIStringEncoding 【参考方案1】:

您错误地使用了fread()。

代替

fread(buf, length, 1, fptr); 

应该是

fread(buf, 1, length, fptr); 

这可能不是问题,据我所知,您的读取函数没有任何错误,但仍然最好按照预期使用库函数。

不过,我不确定您的代码的第二部分。发布更具描述性的错误消息会有所帮助。

【讨论】:

有趣的是,观察某些人如何通过指出他人身上最微不足道的错误来迅速减少错误,从而使他们对自己感觉更好。 Armin:我犯了一个错误,删除了我的错误答案。而且我指出,您的回答也没有任何实质性价值,不是为了感觉更好,而是为了让您也可以做出适当的调整。顺便说一句:我没有投票(你的回答还没有投票)。 拜托,不要打架 :) 在我回家之前我无法检查这个修复 所以,正如我在帖子更新中所说,解决方案是将整个着色器放在 const char * 中。这证明 filetobuf() 有问题,但我不明白是什么。 Armin,即使您的解决方法是正确的,也不能解决问题。它必须是别的东西。感谢您的帮助!

以上是关于使用 SDL2 和 xcode 4.6。我设法创建了一个 OpenGL 3.2 核心上下文。但是不能使用 glsl 1.50的主要内容,如果未能解决你的问题,请参考以下文章

由 xcode 4.6 与 xcode 5.0 创建时,iOS 应用程序在 iOS 7.0 设备上的行为不同

Xcode:可执行文件找不到 SDL2.framework

Xcode 4.6 不能正确识别 Xcode 5.0 创建的项目的链接框架

Xcode 命令行工具 (XCode 4.6) 从终端运行单元测试

Xcode 4.6 开发 iOS 3.1 [关闭]

使用 SDL 2 运行应用程序时 Xcode 5 崩溃