GL_LINES исчезает/мерцает при вращении камеры на Android с OpenGL ES 2.0Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 GL_LINES исчезает/мерцает при вращении камеры на Android с OpenGL ES 2.0

Сообщение Anonymous »

В моем приложении Android я использую OpenGL ES 2.0, и мне нужно показать сетку в центре сцены. У меня также есть камера, которая может быть повернута в центре сцены. < /p>

Я рендерирую сетку с помощью GL_LINES и простых шейдеров. < /p>

На некоторых устройствах, которые у меня есть, все работает нормально, однако на одном устройстве (в частности, Galaxy Note 10.1 2014 Edition) у меня проблемы с исчезающими /мерцающими сетчатыми линиями, когда камера. Повернуто, то есть в некоторых углах камеры линии не видны. alt = "Введите описание изображения здесь" src = "https://i.sstatic.net/ji1i9.gif"/>

И вот как это должно работать:



То, что я заметил, так это то, что выглядит так, как будто линии начинают мерцать под некоторыми углами камеры, когда их конечные точки (или точки начала, не уверены) появляются за плоскостью Frustum Camera (то есть за камерой ) Так что нет никакого мерцания, когда камера смотрит на сетку сверху, и нет мерцания, когда камера смотрит с двух из четырех сторон или издалека. < /P>

Я попытался искать Решение или возможная причина этой проблемы в течение нескольких дней, но пока ничего не нашла. Поэтому я решил спросить вас людей. Я был бы признателен за некоторую помощь, предложения. Может быть, кто -то с опытом OpenGL может догадаться, что вызывает проблему из этого описания. или и т. Д.? Но у меня нет возможности проверить это. У меня на руках только три устройства Android, и этого, вероятно, недостаточно, чтобы сделать такой вывод наверняка. < /p>

Он отлично работает на старой галактике Tab 10.1, а на телефоне Lenovo p780.
Однако Galaxy Note 10.1 - более недавнее устройство и имеет очень большое разрешение (2560 x 1600),
Итак, я также думаю, что, возможно, это не потому, что Device /Diver Driver, а может быть из -за высокого разрешения? < /p>

Другая геометрия (заполненные полигоны, а не строки), видно. < /p>

Вот мой код. >
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);

GLES20.glLineWidth(1f);

float screenRatio = (float)viewportWidth / (float)viewportHeight;

Matrix.setIdentityM(matrixProjection, 0);
MatrixHelper.perspectiveM(matrixProjection, 0, 90, screenRatio, 0.1f, 1000f);

Matrix.setIdentityM(matrixView, 0);

Matrix.translateM(matrixView, 0, 0f, 0f, -10f);

rotationAngle = rotationAngle + (10f * deltaSec);

Matrix.rotateM(matrixView, 0, 45f, 1f, 0f, 0f);
Matrix.rotateM(matrixView, 0, rotationAngle, 0f, 1f, 0f);

GLES20.glUseProgram(shaderGrid.ShaderProgramId);

GLES20.glUniformMatrix4fv(shaderGrid.vProjection, 1, false, matrixProjection, 0);
GLES20.glUniformMatrix4fv(shaderGrid.vView, 1, false, matrixView, 0);

renderGrid.Draw(shaderGrid, origin); //see code from this method below
< /code>

Линии чертежа: < /p>

GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, bufferIds[0]);
GLES20.glVertexAttribPointer(shader.aPosition, 3, GLES20.GL_FLOAT, false, 0, 0);
GLES20.glEnableVertexAttribArray(shader.aPosition);

float [] m = new float[16];

Matrix.setIdentityM(m, 0);

GLES20.glUniformMatrix4fv(shader.vModel, 1, false, m, 0);

GLES20.glDrawArrays(GLES20.GL_LINES, 0, 10 * 2 * 4);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
GLES20.glDisableVertexAttribArray(shader.aPosition);
< /code>

Вот мой код шейдера (извините за такой формат =)): < /p>

public String GetShaderFragmentCode()
{
return
"precision mediump float;" +
"void main() " +
"{" +
" gl_FragColor = vec4(0.7, 0.7, 0.7, 1.0);" +
"}";
}

public String GetShaderVertexCode()
{
return
"uniform mat4 vProjection;" +
"uniform mat4 vModel;" +
"uniform mat4 vView;" +

"attribute vec3 aPosition;" +

"void main() " +
"{" +
" gl_Position = (vProjection * vView * vModel) * vec4(aPosition.xyz, 1.0);" +
"}";
}
< /code>

Вот минимальное приложение для воспроизведения проблемы (подождите, пока сетка полностью не вращается): < /p>

Скомпилированный APK < /p >

исходный код < /p>

Я не уверен, действительно ли это поможет, потому что это специфично, но я также буду ценить ваши отзывы Если у вас будет такая же проблема на других устройствах. Или, если у вас есть другое устройство с высоким разрешением, у которого нет этой проблемы. < /p>

И вот случайные вещи, которые я пытался увидеть, повлияет ли это за проблему (но не повезло, тот же результат) до сих пор: < /p>

[*] Отключить /включить gl_cull_face < /li>
Явно установив GllineWidth на 1F или другие значения < /li>
Использовать Gldrawlements Вместо gldrawarrays
[*] Измените камеру Znear (с 0,1f до 100f)
Измените Frustum Zfar (с 10f до очень больших значений)
Измените VEC3 на VEC4 для Aposition в коде шейдера (и без преобразования с использованием .xyz) < /li>
Использование GL_LINE_STRIP - чтобы увидеть, что произойдет, строки все еще исчезают < / / li>
Использование gl_triangle_strip и т. Д. - полигоны не исчезают, поэтому проблема специально с линиями, но мне нужны строки < /li>
< /ul>

p> Я также заметил этот артефакт, когда я готовил примеры:

< /p>

Появляется, а затем очень быстро исчезает, когда камера поворачивается и мерцает линии. < /P>

Подробнее здесь: https://stackoverflow.com/questions/245 ... ngl-es-2-0
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»