2010-03-31 2 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; 
} 

:

여기 내 매우 간단한 코드입니까? 도움이된다면, 나는 Atom Aspire One에서 원자 프로세서와 최신 Intel Ubuntu를 실행하는 통합 Intel 비디오를 사용하여이 작업을 수행하려고합니다. 매우 강력하지는 않지만 다시 한번 말하지만 이것은 매우 간단한 쉐이더입니다. 좀 봐 주셔서 감사합니다.

+1

드라이버에서 GL 버전과 GLSL 확장 기능을 지원하는 것은 무엇입니까? GMA 950에서 '#version 140'은 낙관적 인 것일 수 있습니다. – genpfault

+1

글쎄, 나는 내가 opengl 1.40을 가지고 있다고 생각한다. 나는 glxinfo를 않았다 | 더 나는 이 의 OpenGL 버전 문자열 참조 : 1.4 메사는 7.6 서버 GLX 버전 문자열 : 1.2 클라이언트 GLX 버전 문자열 : 1.4 GLX 버전 : 확장에 관해서는 1.2 , 나는 GLX의 무리를 볼 확장 기능을 제공하지만 GLSL은 지원하지 않습니다. 내 컴퓨터에서 GLSL이 지원되지 않는다는 뜻입니까? –

+1

예, OpenGL 1.4에는 GLSL 셰이더가 지원되지 않습니다. 사양 확인 : http://www.opengl.org/registry/doc/glspec21.20061201.pdf – genpfault

답변

2

처음 시작한 사람이라면 느린 OpenGL 2.1을 지원해야하는 Mesa 소프트웨어 렌더러를 사용하면 더 나을 것입니다.

7

나는이 문제가 바로 그 문제라고 생각합니다. C++ 컴파일러는 문자열 연결을 수행 후, 쉐이더 소스 코드의 시작은 다음과 같이 표시됩니다

"#version 140uniform float t;" 

나는 "140uniform는"숫자의 그 아이디어를 맞지 않기 때문에 그것이 불평 확신합니다.

관련 문제