2013-10-05 2 views
0

hi im для написания простой проверки ошибок шейдера в C для проверки ошибок при компиляции и времени ссылки. im, имея большую проблему с работой функции glShaderSource(). Сначала создаю место для кода с помощью malloc(codelength * sizeof(char)), затем я присоединяю источник к созданному объекту шейдера с помощью этой строки glShaderSource(shader, 1, (const char **) &code, NULL);. Я верю, что проблема связана с этой линией. ive даже попытался изменить NULL на длину кода, но безрезультатно. когда я пытаюсь получить информацию о шейдере, он возвращает нулевое значение glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &compileloglength); и нулевое значение glGetShaderiv(shaders[0], GL_COMPILE_STATUS, &compileloglength);, пожалуйста, сообщите мне, чтобы я проверил шейдерную проверку ошибок, если он имеет соответствующий код, потому что мне нравится делать небольшие проекты, подобные этим.написания шейдерной проверки ошибок в C

+0

Я думаю, что вы должны фактически выделять (длина кодов + 1) * sizeof (char). OpenGL анализирует шейдерные строки как строки C (когда длина равна 0, в любом случае), она прекращается при первом пустом символе, поскольку вы выделяете достаточно места для хранения шейдера, а не шейдера + нулевой ограничитель, это может быть вопрос. В противном случае вам нужно выделить массив целых чисел, который хранит длину каждой строки шейдера и передает это значение для последнего параметра. –

+0

Вы вызываете 'glCompileShader()' перед вызовами 'glGetShaderiv()'? – genpfault

ответ

0

Вы вызываете glShaderSource, чтобы предоставить исходный код для вашего шейдера. Так, например,

char *source = 
"varying vec2 texCoordVarying;" 
"uniform sampler2D texture;" 
"" 
"void main()" 
"{" 
    "gl_FragColor = texture2D(texture, texCoordVarying);" 
"}"; 

glShaderSource(shader, 1, &source, NULL); 

Ваше описание предполагает, вы создаете пространство для источника, ничего не вкладывая в него, а затем предлагают, что незаполненное пространство для OpenGL? Если это так, то, вероятно, ваш malloc, вероятно, даст вам пустую строку. Это не создаст ошибок сборки, потому что пустая строка является допустимым шейдером, она просто ничего не делает. Вероятно, вы допустили ошибку в glLinkProgram за то, что не смогли предоставить подходящие main() s.

+0

im чтение шейдеров из файла в кусочную память, выделенную malloc. я вижу фактический код, поэтому он правильно записывает в память, но, похоже, не работает на моем glShaderSoure(). – sandbucket

+0

ya i null прокомментировал это. я замечаю, что это похоже на другую проблему, которую я заметил некоторое время назад, если бы я объявлял шейдеры, подобные char vshader [] = {"#version 430 core ..."}; любое исправление к этому? – sandbucket

2

Просто убедитесь, что у вас есть действующий контекст OpenGL? Для тех функций, которые вы используете для работы, необходим контекст OpenGL с поддержкой GLSL.

Если вы хотите выполнить статическую проверку GLSL без создания контекста OpenGL, вы можете использовать автономный компилятор GLSL проекта Mesa.

+0

ya, что было проблемой datenwolf, спасибо – sandbucket

Смежные вопросы