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
ответ
Вы вызываете 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.
im чтение шейдеров из файла в кусочную память, выделенную malloc. я вижу фактический код, поэтому он правильно записывает в память, но, похоже, не работает на моем glShaderSoure(). – sandbucket
ya i null прокомментировал это. я замечаю, что это похоже на другую проблему, которую я заметил некоторое время назад, если бы я объявлял шейдеры, подобные char vshader [] = {"#version 430 core ..."}; любое исправление к этому? – sandbucket
Просто убедитесь, что у вас есть действующий контекст OpenGL? Для тех функций, которые вы используете для работы, необходим контекст OpenGL с поддержкой GLSL.
Если вы хотите выполнить статическую проверку GLSL без создания контекста OpenGL, вы можете использовать автономный компилятор GLSL проекта Mesa.
ya, что было проблемой datenwolf, спасибо – sandbucket
- 1. C Функция проверки ошибок
- 2. C# Создание класса проверки ошибок?
- 3. Как изменить способ написания PHP ошибок в файле журнала ошибок?
- 4. Переключатель шейдерной программы в WebGL
- 5. Ошибки проверки против ошибок проверки
- 6. C++ Область функции проверки ошибок прямоугольника
- 7. Настройка пиксельной шейдерной однородной переменной
- 8. Представление ошибок проверки xml
- 9. Создание шейдерной программы для QGraphicsItem
- 10. Использование Nokogiri для проверки XML: поиск строки-ошибок ошибок проверки?
- 11. Ошибка проверки системы ошибок Rails
- 12. Ошибка пиксельной шейдерной ошибки компиляции
- 13. Отображение ошибок проверки Laravel
- 14. Строка проверки ошибок
- 15. Иерархия ошибок проверки достоверности
- 16. Документация ошибок проверки весны
- 17. Обработка ошибок проверки SSIS
- 18. Устранение ошибок проверки
- 19. Написание правильных ошибок проверки?
- 20. Ошибка проверки ошибок Python?
- 21. Джанго массив проверки ошибок
- 22. Класс проверки ошибок ASP.NET
- 23. python: цикл проверки ошибок
- 24. Наиболее читаемый способ написания простой условной проверки
- 25. проверки ошибок версия Rails
- 26. Игнорирование особых ошибок проверки
- 27. методы проверки ошибок malloc
- 28. JQuery форма проверки ошибок
- 29. Коды ошибок проверки пакетов
- 30. Пользовательские проверки ошибок
Я думаю, что вы должны фактически выделять (длина кодов + 1) * sizeof (char). OpenGL анализирует шейдерные строки как строки C (когда длина равна 0, в любом случае), она прекращается при первом пустом символе, поскольку вы выделяете достаточно места для хранения шейдера, а не шейдера + нулевой ограничитель, это может быть вопрос. В противном случае вам нужно выделить массив целых чисел, который хранит длину каждой строки шейдера и передает это значение для последнего параметра. –
Вы вызываете 'glCompileShader()' перед вызовами 'glGetShaderiv()'? – genpfault