2

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;
}

どこが間違っていますか?それが役立つ場合は、atom プロセッサと最新の Ubuntu を実行する統合 Intel ビデオを備えた Acer Aspire One でこれを実行しようとしています。それほど強力ではありませんが、繰り返しになりますが、これは非常に単純なシェーダーです。ご覧いただきありがとうございます!

4

2 に答える 2

7

これは、あまりにも基本的な問題の 1 つであり、見過ごされがちだと思います。C++ コンパイラが文字列連結を行った後、シェーダー ソース コードの先頭は次のようになります。

"#version 140uniform float t;"

「140uniform」は数字の考えに合わないので、文句を言っていると確信しています。

于 2010-03-31T18:50:38.903 に答える
2

始めたばかりの場合は、 Mesaソフトウェアレンダラーに対して実行する方がよい場合があります。Mesaソフトウェアレンダラーは、完全な(ただし低速ですが)OpenGL2.1サポートを提供するはずです。

于 2010-03-31T18:34:08.507 に答える