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

时间:2013-07-04 09:59:40

标签: macos opengl sdl

我正在使用互联网上的一个例子,作者说它有效,而且它看起来很合法。

所以,我下载了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使用着色器时。它无法编译,并给出类似的错误(我道歉,我现在没有错误):错误0:2语法错误语法错误

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

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修复)。

1 个答案:

答案 0 :(得分:0)

您错误地使用了fread()

而不是

fread(buf, length, 1, fptr); 

应该是

fread(buf, 1, length, fptr); 

这可能不是问题,因为我可以看到你的读取函数没有任何错误,但仍然更喜欢使用库函数。

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