Page 1 of 1

GL_lines verschwinden/flackern beim Drehen der Kamera auf Android mit OpenGl ES 2.0

Posted: 02 Feb 2025, 10:03
by Anonymous
In meiner Android -Anwendung verwende ich OpenGL ES 2.0 und muss ein Netz in der Mitte der Szene zeigen. Ich habe auch eine Kamera, die sich um das Szenenzentrum umgedreht werden kann. < /p>

Ich render Gitter mit GL_LINES und einfachem Shader -Programm. < /p>

Auf einigen Geräten, die ich habe, funktioniert alles einwandfrei, aber auf einem Gerät (insbesondere Galaxy Note 10.1 2014 Edition) habe ich ein Problem, wenn Gitterlinien verschwinden /flackern, wenn die Kamera ist Dreht, d. H. An einigen Kamerawinkeln sind die Linien nicht sichtbar. Alt = "Bildbeschreibung hier eingeben" src = "https://i.static.net/ji1i9.gif"/>

Und hier ist, wie es funktionieren sollte:



Was mir aufgefallen ist, ist, dass es so aussieht, als würden Linien in einigen Kamerawinkeln anfangen, wenn ihre Endpunkte (oder Startpunkte, nicht sicher) hinter der Nähe der Kameraebene in der Nähe von Frustum auftreten (d. H. Hinter der Kamera ). Es gibt also kein Flackern, wenn die Kamera das Netz von oben ansieht, und kein Flackern, wenn die Kamera von zwei von vier Seiten oder von weit entfernt aussieht. Lösung oder mögliche Ursache für dieses Problem für ein paar Tage, fand aber bisher nichts. Also habe ich beschlossen, Sie Leute zu fragen. Ich würde mich über Hilfe, Vorschläge freuen. Vielleicht könnte jemand mit OpenGL -Erfahrung erraten, was aus dieser Beschreibung ein Problem verursacht. oder etc? Aber ich habe keine Möglichkeit, dies zu überprüfen. Ich habe nur drei Android -Geräte in meinen Händen, und es reicht wahrscheinlich nicht aus, um so ein Schluss zu ziehen. < /p>

Es funktioniert gut auf dem alten Galaxy Tab 10.1 und auf dem Lenovo P780 -Telefon. 1600),
Also denke ich auch, dass es vielleicht nicht darauf zurückzuführen ist, dass der Gerätetreiber /der GPU -Treiber, sondern vielleicht eine hohe Auflösung ist? < /p>

Andere Geometrie (gefüllte Polygone nicht Linien) rendern gut. < /p>

Hier ist mein Code. >
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>

Zeichnungszeilen: < /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>

Hier ist mein Shader -Code (Entschuldigung für ein solches Format =)): < /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>

Hier ist eine minimale App, um das Problem zu reproduzieren (warten Sie, bis das Gitter vollständig dreht): < /p>

Kompilierte apk < /p < /p >

Quellcode < /p>

Ich bin mir nicht sicher, ob er wirklich hilft, da es Gerätespezifische ist, aber ich werde auch Ihr Feedback zu schätzen wissen Falls Sie auf anderen Geräten das gleiche Problem haben. Oder wenn Sie ein anderes hochauflösendes Gerät haben, das dieses Problem nicht hat. < /p>

Und hier ist zufällige Dinge, die ich versucht habe zu sehen, ob es sich auf das Problem auswirkt (aber kein Glück, gleiches Ergebnis) bisher: < /p>
< BR />
[*] Deaktivieren /Aktivieren Sie GL_CULL_FACE < /li>
Setzen Sie die Glline -Width auf 1F oder andere Werte explizit. Anstelle von Gldrawarrays
[*] Ändern Sie die Kamera frustum ZNEAR (von 0,1f bis 100f)
Frustum ZFAR (von 10f zu sehr großen Werten)
Vec3 in VEC4 für die Aposition im Shader -Code ändern (und ohne konvertieren mit .xyz) < /li>
Verwenden von GL_line_strip - Um zu sehen, was passieren wird, verschwinden die Zeilen immer noch < /< / li>
Verwenden von GL_Triangle_strip usw. - Polygone verschwinden nicht, also Problem speziell mit Linien, aber ich brauche Zeilen < /li>
< /ul>

< P> Ich habe dieses Artefakt auch bemerkt, als ich Beispiele vorbereitete:

< /p>

Es erscheint und verschwindet dann sehr schnell, wenn die Kamera gedreht wird und die Linien flackern. < /P>