Android Open GL Linentyp

Jhue89

Bekanntes Mitglied
Guten Morgen Zusammen,

ich habe derzeit ein bestehendes Projekt und muss durchgängige Linie in eine gestrichelte Linie ersetzen. Leider bin ich mit der Thematik OpenGL nicht besondes gut vertraut.

Ich bin eigentlich davon ausgegangen das der Linien typ einfach durch einen entsprechenden Parameter geändert werden kann. Da bin ich mir aber nicht mehr so sicher.

Im Internet gibt es einige bespiele, aber diese funktionen werden mir im Android studio nicht angeboten. Ich habe auch gelesen das OpenGL ein wenig abgespeckt wurde.

Wisst ihr da was Konkretes?

Und wie kann ich eine Gestrichelte Linie einfach zeichen?

folgende libs werden verwendet:

Java:
import android.opengl.GLES10;
import android.opengl.GLSurfaceView;
import android.opengl.GLU;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.nio.ShortBuffer;
import java.util.ArrayList;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
 

KonradN

Super-Moderator
Mitarbeiter
Fangen wir erst einmal mit paar Punkten an:

a) Deine Aussage:
folgende libs werden verwendet:
Du gibst keine Libraries an sondern benennst lediglich Packages, die Du importierst. Das ist ein großer Unterschied.

b) OpenGL ES | Android Developers
Wieso nutzt Du die Version 1.0? Du wirst kaum Android 1.0 unterstützen wollen, oder? Es macht wirklich Sinn, dass man sich überlegt, welche Android Versionen man noch unterstützen will. Ich denke alles unter Android 4.x macht keinen Sinn heutzutage ... aber selbst das ist deutlich zu niedrig.

Google hat mir jetzt eine Übersicht der Versionen von vor 3 Jahren als Treffer bei meiner Suche gebracht: Android-Versionsverteilung: Ein Drittel der Nutzer hängt an alten OS - WinFuture.de
==> Mit KitKat (4.4) als kleinste unterstützte Version hast Du vor 3 Jahren bereits 98,1% aller aktiven Android Smartphones abgedeckt. Aber das wird aktuell noch deutlich anders sein. Ich denke, dass da also ein deutlich höheres Limit Sinn macht und auch als unterste unterstützte Version Api Level 21 / Android Version 5.0 mehr als Sinn macht. Und damit hast Du dann OpenGL ES 3.1 als aktuelle Version.

c) Die gestrichelte Linie ist aber auch dann nicht direkt und einfach verfügbar. Ich habe mal ChatGPT eine Lösung erzeugen lassen, wie das über ein Shader Program funktionieren könnte. Das habe ich aber in keiner Weise ausprobiert und ich bringe das einfach einmal so zur Info für Dich für weitere Recherchen.

Shader Programm
Java:
private final String vertexShaderCode =
    "attribute vec4 vPosition;" +
    "void main() {" +
    "  gl_Position = vPosition;" +
    "}";

private final String fragmentShaderCode =
    "precision mediump float;" +
    "uniform float u_time;" +
    "uniform vec4 u_color;" +
    "void main() {" +
    "  float pattern = mod(gl_FragCoord.y + u_time * 50.0, 20.0);" +
    "  if (pattern > 10.0) {" +
    "    discard;" +
    "  } else {" +
    "    gl_FragColor = u_color;" +
    "  }" +
    "}";

Compile / Link Shaders
Java:
int vertexShader = loadShader(GLES31.GL_VERTEX_SHADER, vertexShaderCode);
int fragmentShader = loadShader(GLES31.GL_FRAGMENT_SHADER, fragmentShaderCode);

shaderProgram = GLES31.glCreateProgram();             // create empty OpenGL ES Program
GLES31.glAttachShader(shaderProgram, vertexShader);   // add the vertex shader to program
GLES31.glAttachShader(shaderProgram, fragmentShader); // add the fragment shader to program
GLES31.glLinkProgram(shaderProgram);                  // creates OpenGL ES program executables

Render Line
Java:
GLES31.glUseProgram(shaderProgram);

int positionHandle = GLES31.glGetAttribLocation(shaderProgram, "vPosition");
int colorHandle = GLES31.glGetUniformLocation(shaderProgram, "u_color");
int timeHandle = GLES31.glGetUniformLocation(shaderProgram, "u_time");

// Set the color and the time uniform in the shader
GLES31.glUniform4f(colorHandle, 1.0f, 0.0f, 0.0f, 1.0f); // red color
GLES31.glUniform1f(timeHandle, System.currentTimeMillis() / 1000.0f);

GLES31.glEnableVertexAttribArray(positionHandle);
GLES31.glVertexAttribPointer(positionHandle, COORDS_PER_VERTEX, GLES31.GL_FLOAT, false, vertexStride, vertexBuffer);

// Draw the line
GLES31.glDrawArrays(GLES31.GL_LINES, 0, vertexCount);

// Disable vertex array
GLES31.glDisableVertexAttribArray(positionHandle);

Aber noch einmal: Das ist 100% ChatGPT ohne weitere Prüfung. Ich habe schlicht zu lange nichts mehr mit Android gemacht um das tiefer zu bewerten und ich habe derzeit keine Lust, da jetzt noch intensiver zu testen (Zumal ich auch kein Android Smartphone mehr aktiv nutze).
 

Jhue89

Bekanntes Mitglied
Fangen wir erst einmal mit paar Punkten an:

a) Deine Aussage:

Du gibst keine Libraries an sondern benennst lediglich Packages, die Du importierst. Das ist ein großer Unterschied.

b) OpenGL ES | Android Developers
Wieso nutzt Du die Version 1.0? Du wirst kaum Android 1.0 unterstützen wollen, oder? Es macht wirklich Sinn, dass man sich überlegt, welche Android Versionen man noch unterstützen will. Ich denke alles unter Android 4.x macht keinen Sinn heutzutage ... aber selbst das ist deutlich zu niedrig.

Google hat mir jetzt eine Übersicht der Versionen von vor 3 Jahren als Treffer bei meiner Suche gebracht: Android-Versionsverteilung: Ein Drittel der Nutzer hängt an alten OS - WinFuture.de
==> Mit KitKat (4.4) als kleinste unterstützte Version hast Du vor 3 Jahren bereits 98,1% aller aktiven Android Smartphones abgedeckt. Aber das wird aktuell noch deutlich anders sein. Ich denke, dass da also ein deutlich höheres Limit Sinn macht und auch als unterste unterstützte Version Api Level 21 / Android Version 5.0 mehr als Sinn macht. Und damit hast Du dann OpenGL ES 3.1 als aktuelle Version.

c) Die gestrichelte Linie ist aber auch dann nicht direkt und einfach verfügbar. Ich habe mal ChatGPT eine Lösung erzeugen lassen, wie das über ein Shader Program funktionieren könnte. Das habe ich aber in keiner Weise ausprobiert und ich bringe das einfach einmal so zur Info für Dich für weitere Recherchen.

Shader Programm
Java:
private final String vertexShaderCode =
    "attribute vec4 vPosition;" +
    "void main() {" +
    "  gl_Position = vPosition;" +
    "}";

private final String fragmentShaderCode =
    "precision mediump float;" +
    "uniform float u_time;" +
    "uniform vec4 u_color;" +
    "void main() {" +
    "  float pattern = mod(gl_FragCoord.y + u_time * 50.0, 20.0);" +
    "  if (pattern > 10.0) {" +
    "    discard;" +
    "  } else {" +
    "    gl_FragColor = u_color;" +
    "  }" +
    "}";

Compile / Link Shaders
Java:
int vertexShader = loadShader(GLES31.GL_VERTEX_SHADER, vertexShaderCode);
int fragmentShader = loadShader(GLES31.GL_FRAGMENT_SHADER, fragmentShaderCode);

shaderProgram = GLES31.glCreateProgram();             // create empty OpenGL ES Program
GLES31.glAttachShader(shaderProgram, vertexShader);   // add the vertex shader to program
GLES31.glAttachShader(shaderProgram, fragmentShader); // add the fragment shader to program
GLES31.glLinkProgram(shaderProgram);                  // creates OpenGL ES program executables

Render Line
Java:
GLES31.glUseProgram(shaderProgram);

int positionHandle = GLES31.glGetAttribLocation(shaderProgram, "vPosition");
int colorHandle = GLES31.glGetUniformLocation(shaderProgram, "u_color");
int timeHandle = GLES31.glGetUniformLocation(shaderProgram, "u_time");

// Set the color and the time uniform in the shader
GLES31.glUniform4f(colorHandle, 1.0f, 0.0f, 0.0f, 1.0f); // red color
GLES31.glUniform1f(timeHandle, System.currentTimeMillis() / 1000.0f);

GLES31.glEnableVertexAttribArray(positionHandle);
GLES31.glVertexAttribPointer(positionHandle, COORDS_PER_VERTEX, GLES31.GL_FLOAT, false, vertexStride, vertexBuffer);

// Draw the line
GLES31.glDrawArrays(GLES31.GL_LINES, 0, vertexCount);

// Disable vertex array
GLES31.glDisableVertexAttribArray(positionHandle);

Aber noch einmal: Das ist 100% ChatGPT ohne weitere Prüfung. Ich habe schlicht zu lange nichts mehr mit Android gemacht um das tiefer zu bewerten und ich habe derzeit keine Lust, da jetzt noch intensiver zu testen (Zumal ich auch kein Android Smartphone mehr aktiv nutze).

Vielen Dank für deine Ausführliche Erklärung. Du hast natürlich recht ich sollte die Android Version mal hochziehen. Bei uns ist Minimum 4.1.
Aber wie breits gesagt handelt es sich um ein bestehendes Programm. Und ich muss gestehen ich bin da ein wenig blauäugig ran gegangen.
Du hast mir aber wichtige Infos geliefert.

Nochmals Vielen Dank!
 

Ähnliche Java Themen

Neue Themen


Oben