Единые значения для хранения постоянных значений в шейдерах OpenGL ES 2.0 / 3.0 - PullRequest
0 голосов
/ 31 марта 2020

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

private final int colorLink;
private final float[] color;

public Object3D(float[] color) {
    this.color = color;
    colorLink = GLES20.glGetUniformLocation(program, "u_color");
}

public void onDrawFrame(GL10 glUnused) { 
    if(objectJustCreated) { // check will be performed anyway
        objectJustCreated = false;
        GLES20.glUniform4f(colorLink, color[0], color[1], 
            color[2], color[3]); 
        ...
    }
}

Фрагмент шейдера:

#version 300 es
uniform vec4 u_color;
out vec4 fragColor;
...
void main()
{
    ...
    fragColor = u_color * texColor;
}

Другой вариант - использовать константу:

out vec4 fragColor;
const vec4 c_color = vec4(1.0, 0.7, 0.1, 1.0);
...
void main()
{
    ...
    fragColor = c_color * texColor;
}

Но тогда понадобится создать несколько разных шейдеров с разными цветами.

Какой вариант лучше использовать с точки зрения производительности или нет большой разницы? Был бы благодарен за любой ответ / комментарий.

1 Ответ

0 голосов
/ 01 апреля 2020

Найдено в литературе. Любой параметр в шейдере, который остается неизменным для всех вершин или фрагментов, должен быть передан как единообразная переменная. Переменные, значение которых известно во время компиляции, должны быть константами, а не равномерными переменными, из соображений производительности.

...