2013-03-13 14 views
0

我嘗試設置簡單質地: FP:裝載紋理的#Version 130錯誤引起的 「版本 '130' 不支持」

uniform sampler2D colorMap; 

out vec4 vFragColor; 
smooth in vec2 vVaryingTexCoords; 


void main(void) 
    { 
    vFragColor = texture(colorMap, vVaryingTexCoords.st); 
    } 

VB:

#version 130 

in vec4 vVertex; 
in vec2 vTexCoords; 

smooth out vec2 vVaryingTexCoords; 

void main(void) 
    { 
    vVaryingTexCoords = vTexCoords; 
    gl_Position = vVertex; 
    } 

這裏是一個代碼到負荷:

#ifdef linux 
#include <cstdlib> 
#endif 
#ifdef __APPLE__ 
#if IPHONE 
#include <OpenGLES/ES2/gl.h> 
#include <OpenGLES/ES2/glext.h> 
#define OPENGL_ES 
#else 
//#include "GL/glew.h" 
#import <OpenGL/glext.h> 
#include <OpenGL/gl3.h>  // Apple OpenGL haders (version depends on OS X SDK version) 
#endif 
#include <unistd.h> 
#endif 
GLuint gltLoadShaderPairWithAttributes(const char *szVertexProg, const char *szFragmentProg, ...) 
    { 
    // Temporary Shader objects 
    GLuint hVertexShader; 
    GLuint hFragmentShader; 
    GLuint hReturn = 0; 
    GLint testVal; 

    // Create shader objects 
    hVertexShader = glCreateShader(GL_VERTEX_SHADER); 
    hFragmentShader = glCreateShader(GL_FRAGMENT_SHADER); 

    // Load them. If fail clean up and return null 
    // Vertex Program 
    if(gltLoadShaderFile(szVertexProg, hVertexShader) == false) 
     { 
     glDeleteShader(hVertexShader); 
     glDeleteShader(hFragmentShader); 
     fprintf(stderr, "The shader at %s could ot be found.\n", szVertexProg); 
     return (GLuint)NULL; 
     } 

    // Fragment Program 
    if(gltLoadShaderFile(szFragmentProg, hFragmentShader) == false) 
     { 
     glDeleteShader(hVertexShader); 
     glDeleteShader(hFragmentShader); 
     fprintf(stderr,"The shader at %s could not be found.\n", szFragmentProg); 
     return (GLuint)NULL; 
     } 

    // Compile them both 
    glCompileShader(hVertexShader); 
    glCompileShader(hFragmentShader); 

    // Check for errors in vertex shader 
    glGetShaderiv(hVertexShader, GL_COMPILE_STATUS, &testVal); 
    if(testVal == GL_FALSE) 
     { 
     char infoLog[1024]; 
     glGetShaderInfoLog(hVertexShader, 1024, NULL, infoLog); 
     fprintf(stderr, "The shader at %s failed to compile with the following error:\n%s\n", szVertexProg, infoLog); 
     glDeleteShader(hVertexShader); 
     glDeleteShader(hFragmentShader); 
     return (GLuint)NULL; 
     } 

    // Check for errors in fragment shader 
    glGetShaderiv(hFragmentShader, GL_COMPILE_STATUS, &testVal); 
    if(testVal == GL_FALSE) 
     { 
     char infoLog[1024]; 
     glGetShaderInfoLog(hFragmentShader, 1024, NULL, infoLog); 
     fprintf(stderr, "The shader at %s failed to compile with the following error:\n%s\n", szFragmentProg, infoLog); 
     glDeleteShader(hVertexShader); 
     glDeleteShader(hFragmentShader); 
     return (GLuint)NULL; 
     } 

    // Create the final program object, and attach the shaders 
    hReturn = glCreateProgram(); 
    glAttachShader(hReturn, hVertexShader); 
    glAttachShader(hReturn, hFragmentShader); 


    // Now, we need to bind the attribute names to their specific locations 
    // List of attributes 
    va_list attributeList; 
    va_start(attributeList, szFragmentProg); 

    // Iterate over this argument list 
    char *szNextArg; 
    int iArgCount = va_arg(attributeList, int); // Number of attributes 
    for(int i = 0; i < iArgCount; i++) 
     { 
     int index = va_arg(attributeList, int); 
     szNextArg = va_arg(attributeList, char*); 
     glBindAttribLocation(hReturn, index, szNextArg); 
     } 
    va_end(attributeList); 

    // Attempt to link  
    glLinkProgram(hReturn); 

    // These are no longer needed 
    glDeleteShader(hVertexShader); 
    glDeleteShader(hFragmentShader); 

    // Make sure link worked too 
    glGetProgramiv(hReturn, GL_LINK_STATUS, &testVal); 
    if(testVal == GL_FALSE) 
     { 
     char infoLog[1024]; 
     glGetProgramInfoLog(hReturn, 1024, NULL, infoLog); 
     fprintf(stderr,"The programs %s and %s failed to link with the following errors:\n%s\n", 
      szVertexProg, szFragmentProg, infoLog); 
     glDeleteProgram(hReturn); 
     return (GLuint)NULL; 
     } 

    // All done, return our ready to use shader program 
    return hReturn; 
    } 

這裏是一個輸出:

ERROR: 0:5: '' : version '130' is not supported ERROR: 0:10: 'smooth' : syntax error syntax error

我在哪裏錯了。我在過去的OSX版本,它必須支持1.5和GLSL 3.2 GL遵循官方OpenGL的描述:

https://developer.apple.com/graphicsimaging/opengl/capabilities/index.html

,但是當我通過OpenGL的extention觀衆檢查,它看起來像1.2版本只支持。我是否需要任何後門方式來啓用glsl 1.3支持?

enter image description here

+0

什麼是vb?你的意思是「頂點着色器」? – 2013-03-13 12:14:25

+0

是的,當然,這是頂點着色器 – user170317 2013-03-13 15:18:03

回答

1

OpenGL的版本3.2只需要能夠編譯GLSL版本1.40和1.50。在Windows上,大多數OpenGL實現將接受各種各樣的着色語言版本,在MacOSX上,您將不得不堅持所需的內容。

+0

根據:https://developer.apple.com/graphicsimaging/opengl/capabilities/index.html 10.8版本支持高達1.5 glsl版本... – user170317 2013-03-13 15:13:35

+0

@ user170317:我不知道在那張圖上看不到。它只是說「1.50」。它不會說「1.10到1.50」。 – 2013-03-14 00:42:28