2010-03-31 31 views
2

我在學習使用OpenGL GLSL着色器。我寫了一個非常簡單的程序來簡單地創建着色器並編譯它。但是,無論何時進入編譯步驟,我都會收到錯誤:GLSL錯誤:無法預處理源。我如何解決這個問題?

錯誤:預處理器錯誤 錯誤:無法預處理源。

這裏是我的代碼非常簡單:

#include <GL/gl.h> 
#include <GL/glu.h> 
#include <GL/glut.h> 
#include <GL/glext.h> 
#include <time.h> 
#include <stdio.h> 
#include <iostream> 
#include <stdlib.h> 
using namespace std; 

const int screenWidth = 640; 
const int screenHeight = 480; 

const GLchar* gravity_shader[] = { 
    "#version 140" 
    "uniform float t;" 
    "uniform mat4 MVP;" 
    "in vec4 pos;" 
    "in vec4 vel;" 
    "const vec4 g = vec4(0.0, 0.0, -9.80, 0.0);" 

    "void main() {" 
    " vec4 position = pos;" 
    " position += t*vel + t*t*g;" 

    " gl_Position = MVP * position;" 
    "}" 
}; 

double pointX = (double)screenWidth/2.0; 
double pointY = (double)screenWidth/2.0; 

void initShader() { 
    GLuint shader = glCreateShader(GL_VERTEX_SHADER); 
    glShaderSource(shader, 1, gravity_shader, NULL); 
    glCompileShader(shader); 
    GLint compiled = true; 
    glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled); 
    if(!compiled) { 
     GLint length; 
     GLchar* log; 
     glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &length); 
     log = (GLchar*)malloc(length); 
     glGetShaderInfoLog(shader, length, &length, log); 
     std::cout << log <<std::endl; 
     free(log); 
    } 

    exit(0); 
} 

bool myInit() { 
    initShader(); 
    glClearColor(1.0f, 1.0f, 1.0f, 0.0f); 
    glColor3f(0.0f, 0.0f, 0.0f); 
    glPointSize(1.0); 
    glLineWidth(1.0f); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D(0.0, (GLdouble) screenWidth, 0.0, (GLdouble) screenHeight); 
    glEnable(GL_DEPTH_TEST); 

    return true; 
} 

int main(int argc, char** argv) { 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); 
    glutInitWindowSize(screenWidth, screenHeight); 
    glutInitWindowPosition(100, 150); 
    glutCreateWindow("Mouse Interaction Display"); 

    myInit(); 
    glutMainLoop(); 

    return 0; 
} 

我要去哪裏錯了?如果有幫助,我試圖在一臺配備原子處理器的宏碁Aspire One上運行最新的Ubuntu,並集成英特爾視頻。這不是很強大,但是再次,這是一個非常簡單的着色器。非常感謝您參觀!

+1

驅動程序說它支持哪種GL版本和GLSL擴展?在GMA 950上,你的'#version 140'可能會......樂觀。 – genpfault 2010-03-31 18:27:55

+1

嗯,我想我有openGL 1.40。 我做了glxinfo |更多,我看到 OpenGL的版本字符串:1.4梅薩7.6 服務器GLX版本字符串:1.2 客戶GLX版本字符串:1.4 GLX版本:1.2 至於擴展,我看到一堆GLX的擴展名,但沒有使用GLSL。這是否意味着我的電腦不支持GLSL? – 2010-03-31 18:52:33

+1

是的,OpenGL 1.4沒有GLSL着色器支持。檢查規範:http://www.opengl.org/registry/doc/glspec21.20061201.pdf – genpfault 2010-03-31 19:42:08

回答

2

如果您剛開始使用軟件渲染器,可能會更好,它可以提供完整(儘管很慢)的OpenGL 2.1支持。

7

我懷疑這是那些基本的問題之一,你正在尋找它。 C++編譯器做字符串連接後,你的着色器的源代碼開頭將是這樣的:

"#version 140uniform float t;" 

我敢肯定它的抱怨,因爲「140uniform」不適合它的一些想法。