У меня проблема с Android с OpenGL ES 3.1. Я написал приложение, которое показывает жидкость, падающую с верхней части экрана. Эта жидкость состоит из множества прозрачных частиц, но цвет с использованием альфа-смешения по-другому отображается на другом телефоне.
Цвет каждой капли определяется следующим образом:
private int particleColor = Color.argb(50, 0, 172, 231);
Каждый цвет частиц хранится в буфере:
private ByteBuffer colorBuffer = ByteBuffer.allocateDirect(MAX_PARTICLES * PARTICLE_COLOR_COUNT).order(ByteOrder.nativeOrder());
И этот буфер передается объекту OpenGL для рисования:
/**
* Binds the data to OpenGL.
* @param program as the program used for the binding.
* @param positionBuffer as the position buffer.
* @param colorBuffer as the color buffer.
*/
public void bindData(LiquidShaderProgram program, ByteBuffer positionBuffer, ByteBuffer colorBuffer){
glVertexAttribPointer(program.getPositionAttributeLocation(), POSITION_COMPONENT_COUNT, GL_FLOAT, false, POSITION_COMPONENT_COUNT * OpenGLUtils.BYTE_PER_FLOAT, positionBuffer);
glEnableVertexAttribArray(program.getPositionAttributeLocation());
glVertexAttribPointer(program.getColorAttributeLocation(), COLOR_COMPONENT_COUNT, GL_UNSIGNED_BYTE, true, COLOR_COMPONENT_COUNT, colorBuffer);
glEnableVertexAttribArray(program.getColorAttributeLocation());
}
Визуализация прекращается при вызове этой функции:
/**
* Render the liquid.
* @param particleCount as the particle count.
*/
public void draw(int particleCount) {
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDrawArrays(GL_POINTS, 0, particleCount);
glDisable(GL_BLEND);
}
Фрагмент шейдера просто нарисуйте цвет, который он получает:
precision mediump float;
varying vec4 v_Color;
void main() {
if (length(gl_PointCoord - vec2(0.5)) > 0.5) {
discard;
} else {
gl_FragColor = v_Color;
}
}
Очень хорошо работает на одном телефоне (Nexus 5X):
![Correct rendering](https://www.dropbox.com/s/vsnow2eneaine4o/ok_liquid.jpg?dl=0)
Но на другом телефоне (Galaxy S10), с точно таким же кодом, цвет не тот же:
![Incorrect rendering](https://www.dropbox.com/s/mi209kdp46nzntu/nok_liquid.jpg?dl=0)
Кто-нибудь имеет представление о способе решения этой проблемы? Я хотел бы также отобразить правильный цвет на втором телефоне.