Файл шейдера GLSL не компилируется - PullRequest
1 голос
/ 05 октября 2011

Я пишу свою первую программу с использованием OpenGL, и я дошел до того, что пытаюсь заставить ее скомпилировать мою чрезвычайно простую шейдерную программу.Я всегда получаю ошибку, что не удалось скомпилировать шейдер.Я использую следующий код для компиляции шейдера:

struct Shader
{
    const char*  filename;
    GLenum       type;
    GLchar*      source;
 };
...
static char* readShaderSource(const char* shaderFile)
{
    FILE* fp = fopen(shaderFile, "r");

    if ( fp == NULL ) { return NULL; }

    fseek(fp, 0L, SEEK_END);
    long size = ftell(fp);

    fseek(fp, 0L, SEEK_SET);
    char* buf = new char[size + 1];
    fread(buf, 1, size, fp);

    buf[size] = '\0';
    fclose(fp);

    return buf;
}
...
Shader s;
s.filename = "<name of shader file>";
s.type = GL_VERTEX_SHADER;
s.source = readShaderSource( s.filename );
GLuint shader = glCreateShader( s.type );
glShaderSource( shader, 1, (const GLchar**) &s.source, NULL );
glCompileShader( shader );

И мой источник файла шейдера выглядит следующим образом:

#version 150

in vec4 vPosition;

void main()
{
    gl_Position = vPosition;
}

Я также попытался заменить «in» на «attribute» кака также удаление строки версии.Ничего не компилируется.Примечание. Моя настоящая C-программа компилируется и запускается.Шейдерная программа, которая запускается на графическом процессоре, - это то, что не компилируется.

Я также убедился, что скачал последний драйвер моей видеокарты.У меня есть NVIDIA 8800 GTS 512;

Есть идеи, как заставить мою шейдерную программу (написанную на GLSL) компилировать?

1 Ответ

0 голосов
/ 15 ноября 2011

Как написано в комментариях, выводит ли компилятор шейдер что-либо на консоль? К моему удивлению, когда я использовал ATI, я получил сообщение о том, что шейдерная программа успешно скомпилирована, однако когда я начал использовать Nvidia, я впервые смотрел на экран, потому что ничего не получалось ... как бы ни работали шейдеры. Так, может быть, вы успешно компилируете и просто не принимаете это? И если они не работают в контексте, вы пытаетесь использовать шейдерную программу и ничего не происходит, я думаю, что вы пропустили связывание шейдера (однако, это может быть дальше в коде). У Google есть несколько хороших ответов о том, как правильно выполнять каждый шаг, вы можете сравнить свой код с этим примером . Я также сделал интерфейс для работы с шейдерами, вы можете посмотреть мой UniShader . Проекту не хватает документации на английском языке, и он в основном используется для GPGPU, но вы можете легко загрузить любой шейдер, а сам код написан с английским наименованием, поэтому он должен быть довольно удобным. Посмотрите в папке UniShader в том же ZIP для исходных кодов. Есть также несколько примеров, одна из которых называется Ukazkovy program na GPGPU, также включает в себя исходный код, так что вы можете посмотреть, как использовать эти классы ... удачи!

...