GLSL Shader не будет отображать цвет из единой переменной - PullRequest
3 голосов
/ 11 февраля 2012

Я сейчас создаю приложение для Android, но столкнулся с некоторыми проблемами с шейдером, который отказывается отрисовывать.

Рассмотрим следующий фрагментный шейдер:

uniform vec4 color;
void main(){
    gl_FragColor = vec4(1.0);
}

Этот шейдер отлично работает для рисования объекта в сплошном цвете (в данном случае в белом). Унифицированный вектор color оптимизирован и не может быть найден с помощью glGetUniformLocation() (возвращает -1).

Попытка получить цвет из равномерной переменной может быть сделана так:

uniform vec4 color;
void main(){
    gl_FragColor = color;
}

Однако, когда я использую это, ничего не рендерится. Шейдер успешно создан, и glGetUniformLocation() возвращает допустимое значение (0) для цвета. Но на экране ничего не отображается, даже черный. Единственное сделанное изменение - замена vec4(1.0) на color. Этот код имеет тот же результат:

uniform vec4 color;
void main(){
    gl_FragColor = vec4(1.0)+color;
}

Странно то, что когда я пробовал шейдер в другом проекте, он работает как надо, поэтому проблема должна быть в том, что я делаю в другом месте кода.
Это мой метод рисования (имейте в виду, что он работает, когда переменная цвета отсутствует в шейдере):

GLES20.glUseProgram(colorshader);
GLES20.glUniform4f(colorIndex, 1, 1, 1, 1); //colorIndex is the result of glGetUniformLocation() called with the correct shader index and variable name.

Matrix.multiplyMM(mvpMatrix, 0, vpMatrix, 0, matrix, 0);
GLES20.glUniformMatrix4fv(matrixindex, 1, false, mvpMatrix, 0);

GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vertices);
GLES20Fix.glVertexAttribPointer(Shader.ATTRIBUTE_VERTEX, 3, GLES20.GL_FLOAT, false, 12, 0);

GLES20.glLineWidth(width);
GLES20.GL_UNSIGNED_SHORT, 0);
GLES20.glDrawArrays(GLES20.GL_LINES, 0, count);

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

Обновление:
Кажется, что использование любой унифицированной переменной, которая не является сэмплером, вызывает такое поведение в этом (и только в этом) шейдере.

Обновление 2 Используя glGetError(), верните код ошибки 502: GL_INVALID_OPERATION.

Ответы [ 2 ]

2 голосов
/ 11 февраля 2012

Хорошо, так что я наконец-то понял это после нагрузки тестирования.
В моем коде я использовал несколько шейдеров , но случайно получил только mvpMatrix -iform для одного шейдера и использовал его для каждого шейдера, что, как ни странно, работало для всех шейдеры, которые у меня были до создания этого (он получил идентификатор 0 для всех предыдущих шейдеров).
Однако с этим шейдером кажется, что мой новый vec4 получил идентификатор 0, что привело к неправильному назначению кода моими векторными данными в mvp-матрице. получение новых идентификаторов для каждого шейдера заставило программу работать.

0 голосов
/ 11 февраля 2012

цвет неинициализирован, и, скорее всего, шейдер прерывается.

...