#android #opengl-es #glsl #opengl-es-2.0
#Android #opengl-es #glsl #opengl-es-2.0
Вопрос:
Я пытаюсь реализовать некоторые шейдеры из онлайн-учебников (lighthouse3d.com ) в моем движке OpenGL ES 2.0.
Проблема в том, что по какой-то причине ЛЮБЫЕ переменные, объявленные в области main(), приводят к сбою всего шейдера. например, это сбой:
void main(){
vec4 color;
gl_FragColor = vec4(1.0, 0.5, 0.5, 1.0);
}
но это работает отлично:
void main(){
//vec4 color;
gl_FragColor = vec4(1.0, 0.5, 0.5, 1.0);
}
То же самое происходит с моими вершинными шейдерами.(РЕДАКТИРОВАТЬ: nvm, похоже, происходит только с фрагментными шейдерами) Единственный способ использовать любой тип непостоянного значения — это использовать атрибуты, вариации, формы и т. Д. например, это работает так, как вы ожидаете:
uniform sampler2D texture;
varying lowp vec4 fragcol;
varying lowp vec2 texco;
void main(){
gl_FragColor = fragcol * texture2D(texture, texco);
}
Кроме того, у меня чертовски много проблем с поиском документации или ресурсов конкретно о GLSL ES (или как там называется эта версия). Все, что я смог найти, это: http://old.siggraph.org/publications/2006cn/course16/KhronosSpecs/ESLanguageSpec1.10.11.pdf
Это все, что я смог найти, связанное с объявлениями переменных:
[snip] Типов по умолчанию не существует. Все объявления переменных и функций должны иметь объявленный тип и, необязательно, квалификаторы. Переменная объявляется путем указания ее типа, за которым следует одно или несколько имен, разделенных запятыми.[снип]
И это именно то, что я сделал:
объявленный тип: vec4
за которым следует одно или несколько имен: цвет;
vec4 color
Я невежественен
РЕДАКТИРОВАТЬ: GLES20.glGetError() выдает ошибку 1282
Комментарии:
1. Какой компилятор / реализацию вы используете?
2. упс! Я знал, что что-то забыл. Я разрабатываю на Android, используя Android development kit.. Я должен обновить свой пост
Ответ №1:
GLSL ES отличается от традиционного GLSL тем, что для указания полного типа требуются модификаторы точности. Вы пробовали, например:
void main(){
lowp vec4 color;
gl_FragColor = vec4(1.0, 0.5, 0.5, 1.0);
}
Вы также можете добавить что-то подобное в начало исходного файла:
precision highp float;
Чтобы установить точность по умолчанию, чтобы вы могли опустить ее позже.
Чтобы получить подробную информацию об ошибке при компиляции GLSL, вы можете использовать glGetProgramInfoLog
(с помощью glGetProgramiv
). Большинство реализаций GL возвращают значимую ошибку и номер строки. Я, к сожалению, отстал от Java, но на C вы могли бы сделать:
glCompileShader(shader);
// check whether compilation was successful; if not
// then dump the log to the console
GLint status;
glGetShaderiv(shader, GL_COMPILE_STATUS, amp;status);
if(!status)
{
GLint logLength;
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, amp;logLength);
if (logLength > 0)
{
GLchar *log = (GLchar *)malloc(logLength);
glGetShaderInfoLog(shader, logLength, amp;logLength, log);
printf("Shader compile log:n%s", log);
free(log);
}
}
Комментарии:
1. «[Ошибка шейдера] Ошибка ссылки: фрагмент шейдера не был успешно скомпилирован». >_> не очень полезное РЕДАКТИРОВАНИЕ: журналы были неудачными, поэтому я попытался добавить модификатор точности, и это сработало! Я думаю, что битовую информацию должно было быть легче найти. Спасибо за помощь
2. @AlexRamallo Это легче найти, если вы изучаете ресурсы OpenGL ES и не пытаетесь копировать примеры GL для рабочего стола 1 на 1, поскольку это, очевидно, работает не всегда.