Форум программистов, компьютерный форум CyberForum.ru

Инициализация OpenGL ES - Android

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
Ieroglif
 Аватар для Ieroglif
18 / 18 / 1
Регистрация: 23.06.2011
Сообщений: 237
16.02.2014, 21:02     Инициализация OpenGL ES #1
Вечер добрый, товарищи. Пытаюсь инициализировать область GLSurfaceView в части экрана. Как-то не очень выходит.
Подскажите?
Код:

main.java
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package ru.project.exampleproject;
 
import android.os.Bundle;
import android.app.Activity;
import android.opengl.GLSurfaceView;
 
public class MainActivity extends Activity {
 
GLSurfaceView myScen = new MyScene(this);
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        myScen.setRenderer(new MyRender());
        setContentView(R.layout.main);
    }
}
main.xml
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
 
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:orientation="vertical" >
        <ru.project.exampleproject.MyScene
             android:id="@+id/3dscene"
             android:layout_width="fill_parent"
            android:layout_height="fill_parent"/>
            
    </LinearLayout>
 
    <LinearLayout
        android:id="@+id/patr_for_change"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:orientation="horizontal" >
 
        <LinearLayout
            android:id="@+id/down_part"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="8"
            android:orientation="horizontal">
        </LinearLayout>
 
        <LinearLayout
            android:id="@+id/up_part"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="2"
            android:orientation="horizontal">
        </LinearLayout>
        
    </LinearLayout>
 
</LinearLayout>
Класс GLSurfaseView
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package ru.project.exampleproject;
 
import android.opengl.GLSurfaceView;
import android.content.Context;
 
public class MyScene extends GLSurfaceView {
    
    public MyScene(Context context) 
    {
        super(context);
        
    }
    
    
    
    public void onResume() 
    {
    super.onPause();
    super.onResume();
    }
    
    public void onPause() 
    {
    super.onPause();
    super.onPause();
    }
}
Некотрый Renderer (взят из статьи)
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package ru.project.exampleproject;
 
import android.opengl.GLSurfaceView.Renderer;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.annotation.SuppressLint;
import android.opengl.GLU;
 
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.util.ArrayList;
 
public class MyRender implements Renderer
{
    boolean drawBl = false;
    private FloatBuffer lineVB;
    GL10 glLocal;
    int countVertex;
    
    public int screenHeight;
    
    @Override
    public void onDrawFrame(GL10 gl) {          
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
 
        gl.glMatrixMode(GL10.GL_MODELVIEW);
        gl.glLoadIdentity();   // reset the matrix to its default state
        
        // When using GL_MODELVIEW, you must set the view point
        GLU.gluLookAt(gl, 0, 0, -5, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
        
        if(true == drawBl)
        {
            gl.glColor4f(0.63671875f, 0.76953125f, 0.22265625f, 0.0f);
            gl.glVertexPointer(3, GL10.GL_FLOAT, 0, lineVB);
            gl.glDrawArrays(GL10.GL_LINES, 0, countVertex);
        }
    }
 
    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        gl.glViewport(0, 0, width, height);
        
        gl.glMatrixMode(GL10.GL_PROJECTION);        // set matrix to projection mode
        gl.glLoadIdentity();
        gl.glOrthof(0, -width,  0, height, 3, 7);
        gl.glMatrixMode(GL10.GL_MODELVIEW);
        
        screenHeight = height;
    }
 
    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        
        glLocal = gl;
        
        gl.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    }
}
Ну и манифест:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="ru.project.exampleproject"
    android:versionCode="1"
    android:versionName="1.0" >
 
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />
 
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="ru.project.exampleproject.MainActivity"
            android:screenOrientation="landscape" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="ru.project.exampleproject.StartActivity"
            android:label="@string/title_activity_start" >
        </activity>
    </application>
 
</manifest>
Добавлено через 1 минуту
В частности интересует праивильно ли реализованы onResume() и onPause()?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.02.2014, 21:02     Инициализация OpenGL ES
Посмотрите здесь:

Android OpenGL (Android)
Android OpenGL 1.1 Android
OpenGL ES AndroidNDK Android
OpenGL ES Android
Android OpenGL
Android Кривые в OpenGL SE 1.0
Android Текстура OpenGL es 2
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,488
16.02.2014, 22:07     Инициализация OpenGL ES #2
Мой Вам совет - не выкладывайте ВСЕ ваши исходники на форум! Это совсем НЕ интересное чтиво... Вы бы еще опечатку попросили бы найти...

Кажется НЕ ПРАВИЛЬНО!
По крайней мере такого никогда не встречал:
Java
1
2
3
4
5
6
7
8
9
10
11
12
public void onResume() 
    {
    super.onPause();
    super.onResume();
    }
    
    public void onPause() 
    {
//??? Дважды?
    super.onPause();
    super.onPause();
    }
В примерах гугла видел исходники простой програмки рисующей крутящийся (пальцем) разноцветный кубик... Поищите его. Там не плохо все описано...
Ieroglif
 Аватар для Ieroglif
18 / 18 / 1
Регистрация: 23.06.2011
Сообщений: 237
17.02.2014, 08:11  [ТС]     Инициализация OpenGL ES #3
Изменю вопрос. Как установить отображение GLSurfaceView только в определённой части экрана? Предположим, у меня экран разделён 2мя разметками с одинаковыми размерами. Я хочу, чтобы рисование производилось лишь в одной.

Код подобного типа устанавливает GLSurfaceView на весь экран:

Java
1
2
3
4
5
6
7
8
9
10
private MyScene mGLSurfaceView;
    
 
    @Override
    public void onCreate(Bundle savedInstanceState)
{
                super.onCreate(savedInstanceState);
               
                mGLSurfaceView = new MyScene(this);
}
ASDFD12
31 / 31 / 5
Регистрация: 15.09.2012
Сообщений: 408
17.02.2014, 13:20     Инициализация OpenGL ES #4
нужно задать область просмотра
Java
1
gl.glViewport(0, 0, glGraphics.getWidth()/2, glGraphics.getHeight()/2); // прорисовка на полэкрана
Ieroglif
 Аватар для Ieroglif
18 / 18 / 1
Регистрация: 23.06.2011
Сообщений: 237
17.02.2014, 13:53  [ТС]     Инициализация OpenGL ES #5
Наверно, я не совсем понятно выразился: меня интересует как поместить (зарегестрировать) мой GLSurfaceView в определённый layout. В таком случае, я так понимаю, он должен автоматически отображаться лмшь в его пределах.?
ASDFD12
31 / 31 / 5
Регистрация: 15.09.2012
Сообщений: 408
17.02.2014, 13:58     Инициализация OpenGL ES #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Ieroglif Посмотреть сообщение
Наверно, я не совсем понятно выразился: меня интересует как поместить (зарегестрировать) мой GLSurfaceView в определённый layout. В таком случае, я так понимаю, он должен автоматически отображаться лмшь в его пределах.?
Java
1
2
 RelativeLayout layout_new= new RelativeLayout(this);
 layout_new.addView(new Class_extends_GLSurfaceView() );
Ieroglif
 Аватар для Ieroglif
18 / 18 / 1
Регистрация: 23.06.2011
Сообщений: 237
17.02.2014, 14:07  [ТС]     Инициализация OpenGL ES #7
О. Дело сдвинулось с мёртвой точки! Во всяком случае, не выкидывает исключения! Спасибо!
ASDFD12
31 / 31 / 5
Регистрация: 15.09.2012
Сообщений: 408
17.02.2014, 14:09     Инициализация OpenGL ES #8
Дерзай)))
Ieroglif
 Аватар для Ieroglif
18 / 18 / 1
Регистрация: 23.06.2011
Сообщений: 237
17.02.2014, 14:36  [ТС]     Инициализация OpenGL ES #9
Чёрт. Кажется, я поспешил с восторгами.

Java
1
2
RelativeLayout layout_new= new RelativeLayout(this);
 layout_new.addView(new Class_extends_GLSurfaceView() );
Насколько я понимаю, тут программно создаётся разметка и к ней прибавляется представление.
Т.е. разметка автоматом идёт на всю активность?

А есть ли возможность присоединить полученное представление к уже существующей разметке. Попробовал нечто по типу:
Java
1
2
LinearLayout layout_new= (LinearLayout) findViewById(R.id.forgl);
                layout_new.addView(mGLSurfaceView);
В эмуляторе вылет.
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,488
17.02.2014, 16:07     Инициализация OpenGL ES #10
Цитата Сообщение от Ieroglif Посмотреть сообщение
есть ли возможность присоединить полученное представление к уже существующей разметке. Попробовал нечто по типу
У меня не вылетает...

Java
1
2
3
mGLSurfaceView = new Class_extends_GLSurfaceView();
LinearLayout layout_new= (LinearLayout) findViewById(R.id.forgl);
layout_new.addView(mGLSurfaceView);
Ieroglif
 Аватар для Ieroglif
18 / 18 / 1
Регистрация: 23.06.2011
Сообщений: 237
17.02.2014, 17:14  [ТС]     Инициализация OpenGL ES #11
Tester64, если не сложно, покажите скрин и файлы проекта.
Ieroglif
 Аватар для Ieroglif
18 / 18 / 1
Регистрация: 23.06.2011
Сообщений: 237
17.02.2014, 17:24  [ТС]     Инициализация OpenGL ES #12
Вот такая вот фигня появляется:
Миниатюры
Инициализация OpenGL ES  
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,488
17.02.2014, 21:12     Инициализация OpenGL ES #13
Цитата Сообщение от Ieroglif Посмотреть сообщение
если не сложно
сложно! У меня класс (аналогичный Вашему MyScene) занимается отрисовкой целой сцены ("графы"). Но воткнуть его я могу в любую часть экрана. И создать могу либо прямо перед подклюением к нужному LinearLayout либо заранее. Например при старте программы передав в него кучу дополнительных параметров. А потом только подключить его при создании формы в которой ее нужно отрисовать...

Советую еще почитать лог с ошибкой, которую отправляет Вам ваша программа перед смертью...

Добавлено через 1 минуту
похвастаюсь... нарисовал программу, в которой 3 LinearLayout. В каждом крутиться своя картинка и свои обработчики нажатий. Причем 2 на канвасе, а 3й на OpenGL!
Ieroglif
 Аватар для Ieroglif
18 / 18 / 1
Регистрация: 23.06.2011
Сообщений: 237
17.02.2014, 21:23  [ТС]     Инициализация OpenGL ES #14
Круто. Но пользы никакой.
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,488
17.02.2014, 22:45     Инициализация OpenGL ES #15
Цитата Сообщение от Tester64 Посмотреть сообщение
похвастаюсь
Это я к тому что такое ВОЗМОЖНО! Осталось правильно смешать ингридиенты...

Цитата Сообщение от Tester64 Посмотреть сообщение
Советую еще почитать лог с ошибкой, которую отправляет Вам ваша программа перед смертью...
А от этого по любому должна быть польза!
Ieroglif
 Аватар для Ieroglif
18 / 18 / 1
Регистрация: 23.06.2011
Сообщений: 237
17.02.2014, 23:49  [ТС]     Инициализация OpenGL ES #16
Tester64, хорошо, давайте попробуем иначе.

Итак, есть класс.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class MyScene extends GLSurfaceView{
    //создадим ссылку для хранения экземпляра нашего класса рендерера
    private MyRender renderer; 
    // конструктор
    public MyScene (Context context) {
                // вызовем конструктор родительского класса GLSurfaceView
                super(context);
                // создадим экземпляр нашего класса MyClassRenderer
                renderer = new MyRender();
                // запускаем наш экземпляр рендерера 
                setRenderer(renderer);  
                // установим режим циклического запуска метода onDrawFrame
                // в рендерере
                setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);
    } 
}
В одной статье прочёл, что renderer лучше объявлять-создавать в GLSurfaceWiev.

Есть сам renderer:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
public class MyRender implements Renderer
{
    //todo
}
    public void onSurfaceCreated(GL10 gl, EGLConfig config)
{
       //todo
} 
    public void onDrawFrame(GL10 gl) 
{
  //todo      
}
}
И наконец, есть класс самой активности.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class MainActivity extends Activity {
    
    private MyScene mGLSurfaceView;
    
    // переопределим метод onCreate
    @Override
    public void onCreate(Bundle savedInstanceState){
                super.onCreate(savedInstanceState);
 
                mGLSurfaceView = new MyScene(this);
                LinearLayout layout_new= (LinearLayout) findViewById(R.id.forgl);
                layout_new.addView(mGLSurfaceView);
               
 
    }
 
    @Override
    protected void onPause() {
                super.onPause();
                mGLSurfaceView.onPause();
    }
 
    @Override
    protected void onResume() {
                super.onResume();
                mGLSurfaceView.onResume();
    }
}
Итак, как Вы и сказали, экземпляр мы создали практически в самом начале.
Java
1
mGLSurfaceView = new MyScene(this);
После чего прикрепили к LinearLayout-у:
Java
1
2
LinearLayout layout_new= (LinearLayout) findViewById(R.id.forgl);
                layout_new.addView(mGLSurfaceView);
Что дальше? По идее, я должен загружать созданную в xml разметку, так?

Добавлено через 3 минуты
Поправьте, если в рассуждениях что-то не так.

Добавлено через 55 секунд
Касательно логов, то первое из всего многообразия: "E/Trace(619): error opening trace file: No such file or directory (2)"
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,488
18.02.2014, 01:47     Инициализация OpenGL ES #17
Тяжело вычитывать код, но
Цитата Сообщение от Ieroglif Посмотреть сообщение
error opening trace file: No such file or directory (2
означает что сбой в чтении файла из некого каталога... А вовсе не в отрисовке сцены.

Даже не знаю чем Вам помочь... Я когда разбирал эту (OpenGL) тему начал c примера в Google Api Demos. Создал свой проект, успешно в него втянул файл CubeRenderer.java и все что его касалось... А дальше начал "перемешивать" код пока не понял принципы... На каком-то этапе захотелось добавить обычную кнопку над картинкой и научился вьюв не растягивать на весь экран, а вкладывать в LinearLayout.
Valakin
 Аватар для Valakin
430 / 96 / 15
Регистрация: 21.02.2015
Сообщений: 715
02.07.2015, 08:51     Инициализация OpenGL ES #18
Ieroglif, получилось сделать вьюшку для рисования на части экрана?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2015, 09:10     Инициализация OpenGL ES
Еще ссылки по теме:

Android Инициализация базы данных
OpenGl ES 2.0 Текстуры Android
Android Комбинирование 2D и 3D в OpenGL ES 2.0
Android Инициализация переменной
Android Динамическая инициализация ImageView

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Valakin
 Аватар для Valakin
430 / 96 / 15
Регистрация: 21.02.2015
Сообщений: 715
03.07.2015, 09:10     Инициализация OpenGL ES #19
в инете очень много противоречивых записей,

а как сделать область GLSurfaceView прозрачной?

(чтобы было видно что находится под ней)
Yandex
Объявления
03.07.2015, 09:10     Инициализация OpenGL ES
Ответ Создать тему
Опции темы

Текущее время: 07:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru