GLSL 错误:无法预处理源。我该如何解决这个问题?

Posted

技术标签:

【中文标题】GLSL 错误:无法预处理源。我该如何解决这个问题?【英文标题】:GLSL Error: failed to preprocess the source. How can I troubleshoot this? 【发布时间】:2010-03-31 18:17:45 【问题描述】:

我正在尝试学习使用 OpenGL 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;

我哪里错了?如果有帮助,我会尝试在 Acer Aspire One 上执行此操作,该 Aspire One 配备 atom 处理器和集成英特尔视频,运行最新的 Ubuntu。它不是很强大,但话又说回来,这是一个非常简单的着色器。非常感谢您的观看!

【问题讨论】:

驱动程序说它支持哪些 GL 版本和 GLSL 扩展?在 GMA 950 上,您的 #version 140 可能...乐观。 好吧,我想我有 openGL 1.40。我做了一个 glxinfo|more,我看到 OpenGL 版本字符串:1.4 Mesa 7.6 服务器 glx 版本字符串:1.2 客户端 glx 版本字符串:1.4 GLX 版本:1.2 至于扩展,我看到一堆 GLX 扩展,但其中没有一个带有 GLSL。这是否意味着我的计算机不支持 GLSL? 是的,OpenGL 1.4 不支持 GLSL 着色器。检查规格:opengl.org/registry/doc/glspec21.20061201.pdf 感谢 genpfault。我感谢您的帮助。看起来我将不得不在我的另一台支持 OpenGL 2.0 的机器上玩这个。它只是不如我的小笔记本电脑那么便携。再次感谢! 就像我在答案中所说,您可以在上网本上使用 Mesa 软件渲染器,它只会比硬件实现慢。 【参考方案1】:

我怀疑这是一个非常基本的问题,你正在寻找它。在 C++ 编译器进行字符串连接后,着色器源代码的开头将如下所示:

"#version 140uniform float t;"

我很确定它在抱怨,因为“140uniform”不符合它的数字概念。

【讨论】:

【参考方案2】:

如果您刚刚开始,您最好使用Mesa 软件渲染器,它应该提供完整的(虽然速度很慢)OpenGL 2.1 支持。

【讨论】:

以上是关于GLSL 错误:无法预处理源。我该如何解决这个问题?的主要内容,如果未能解决你的问题,请参考以下文章

我该如何解决这个错误无法打开 SSL LIbrary

我该如何解决这个问题:未捕获的类型错误:无法读取 javascript 中未定义的属性“toString”

我的 GLSL 着色器程序链接正常,但是当我尝试使用它时出错——我该如何调试它?

ERR_HTTP_HEADERS_SENT - Express:标头在发送到客户端后无法设置,我该如何解决这个错误?

我该如何解决这个错误?我正在使用 mariadb10

CloudFront 到 EC2 源返回 502 错误。我该如何调查?