Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
den_droid
6 / 7 / 1
Регистрация: 18.05.2015
Сообщений: 191
1

OpenGL обновление сцены

29.05.2017, 11:25. Просмотров 834. Ответов 2
Метки нет (Все метки)

Столкнулся со следующей проблемой: при попытке нарисовать что-либо на OpenGL после его первой прорисовке ничего не рисуется. Пробовал и glSurfaceView.requestRender() и glSurfaceView.invalidate() - без толку. С чем может связана быть данная проблема? Привожу пример класса:
Кликните здесь для просмотра всего текста
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
package danielbernar.opengl.test.OpenGLTools;
 
import android.content.Context;
import android.opengl.GLSurfaceView.Renderer;
 
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
 
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
 
import static android.opengl.GLES20.GL_COLOR_BUFFER_BIT;
import static android.opengl.GLES20.GL_FLOAT;
import static android.opengl.GLES20.GL_FRAGMENT_SHADER;
import static android.opengl.GLES20.GL_TRIANGLES;
import static android.opengl.GLES20.GL_POINTS;
import static android.opengl.GLES20.GL_VERTEX_SHADER;
import static android.opengl.GLES20.GL_DEPTH_TEST;
import static android.opengl.GLES20.GL_DEPTH_BUFFER_BIT;
import static android.opengl.GLES20.glClear;
import static android.opengl.GLES20.glClearColor;
import static android.opengl.GLES20.glDrawArrays;
import static android.opengl.GLES20.glEnableVertexAttribArray;
import static android.opengl.GLES20.glGetAttribLocation;
import static android.opengl.GLES20.glGetUniformLocation;
import static android.opengl.GLES20.glUniform4f;
import static android.opengl.GLES20.glUseProgram;
import static android.opengl.GLES20.glVertexAttribPointer;
import static android.opengl.GLES20.glViewport;
import static android.opengl.GLES20.glUniformMatrix4fv;
import static android.opengl.GLES20.glEnable;
import android.*;
import android.opengl.*;
import java.util.*;
 
public class OpenGLRenderer implements Renderer {
    private Context context;
    private int programId;
    private FloatBuffer vertexData;
    private int uColorLocation;
    private int uMatrixLocation;
    private int aPositionLocation;
    //String vertex_shader = "attribute vec4 a_Position; void main() { gl_Position = a_Position; gl_PointSize = 5.0; }"; // 2D
    String vertex_shader = "attribute vec4 a_Position; uniform mat4 u_Matrix; void main() { gl_Position = u_Matrix * a_Position; gl_PointSize = 1.0; }"; // 3D
    String fragment_shader = "precision mediump float; uniform vec4 u_Color; void main() { gl_FragColor = u_Color; }";
    
    static final int GL_COORDINATES_COUNT = 3; // XYZ
 
    private float[] mProjectionMatrix = new float[16];
    private float[] vertices = new float[0];
    int trngCount = 0;
 
    public OpenGLRenderer(Context context) {
        this.context = context;
        prepareData();
    }
 
    @Override
    public void onSurfaceCreated(GL10 arg0, EGLConfig arg1) {
        glClearColor(1f, 1f, 1f, 1f);
        glEnable(GL_DEPTH_TEST);
        int vertexShaderId = ShaderUtils.createShader(GL_VERTEX_SHADER, vertex_shader);
        int fragmentShaderId = ShaderUtils.createShader(GL_FRAGMENT_SHADER, fragment_shader);
        programId = ShaderUtils.createProgram(vertexShaderId, fragmentShaderId);
        glUseProgram(programId);
        bindData();
    }
 
    @Override
    public void onSurfaceChanged(GL10 arg0, int width, int height) {
        glViewport(0, 0, width, height);
        bindMatrix(width, height);
        System.out.println(System.currentTimeMillis() + ": OpenGL onSurfaceChanged(GL10 arg0, int width, int height)");
    }
 
    public void addTrng(float x1, float y1, float z1, float x2, float y2, float z2, float x3, float y3, float z3) {
        float[] tmpVert = new float[vertices.length + 3*3]; // 3 вершины и 3 координаты
        System.arraycopy(vertices, 0, tmpVert, 0, vertices.length);
        int verl = vertices.length;
        tmpVert[verl] = x1;
        tmpVert[verl+1] = y1;
        tmpVert[verl+2] = z1;
        tmpVert[verl+3] = x2;
        tmpVert[verl+4] = y2;
        tmpVert[verl+5] = z2;
        tmpVert[verl+6] = x3;
        tmpVert[verl+7] = y3;
        tmpVert[verl+8] = z3;
        vertices = tmpVert;
        trngCount++;
    }
    public void addRect(float x1, float y1, float z1, float x2, float y2, float z2) {
        addTrng(x1, y1, z1, x1, y2, z1, x2, y2, z2);
        addTrng(x1, y1, z1, x2, y1, z2, x2, y2, z2);
    }
    
    public void draw() {
        prepareData();
    }
    
    private void prepareData() {
        vertexData = ByteBuffer.allocateDirect(vertices.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer();
        vertexData.put(vertices);
    }
 
    private void bindData() {
        uColorLocation = glGetUniformLocation(programId, "u_Color");
        aPositionLocation = glGetAttribLocation(programId, "a_Position");
        vertexData.position(0);
        glVertexAttribPointer(aPositionLocation, GL_COORDINATES_COUNT, GL_FLOAT, false, 0, vertexData);
        glEnableVertexAttribArray(aPositionLocation);
        
        // матрица
        uMatrixLocation = glGetUniformLocation(programId, "u_Matrix");
    }
 
    private void bindMatrix(int width, int height) {
        float left = 0;
        float right = width;
        float bottom = height;
        float top = 0;
        float near = 1.0f;
        float far = 8.0f;
        
        Matrix.frustumM(mProjectionMatrix, 0, left, right, bottom, top, near, far);
        glUniformMatrix4fv(uMatrixLocation, 1, false, mProjectionMatrix, 0);
    }
    
    @Override
    public void onDrawFrame(GL10 arg0) {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 2: очищаем буффер глубины
        glUniform4f(uColorLocation, 0.0f, 0.0f, 0.0f, 1.0f);
        for (int i = 0; i<trngCount; i++) {
            glDrawArrays(GL_TRIANGLES, i*3, 3);
        }
    }
}


И отрисовка в MainActivity:
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
final OpenGLRenderer oglr = new OpenGLRenderer(this);
        oglr.addTrng(0, 0, -1, 50, 50, -1, 0, 50, -1);
        oglr.addRect(100, 100, -1, 400, 400, -1);
        for (int i = 0; i<1000; i++) {
            int x = new Random().nextInt(1920);
            int y = new Random().nextInt(1080);
            oglr.addRect(x, y, -1, x+100, y+100, -1); // все отлично рисует
        }
        oglr.draw();
        final GLSurfaceView glSurfaceView = new GLSurfaceView(this);
        glSurfaceView.setEGLContextClientVersion(2); 
        glSurfaceView.setRenderer(oglr);
        setContentView(glSurfaceView);
        glSurfaceView.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View p1) {
                    int x = new Random().nextInt(1920);
                    int y = new Random().nextInt(1080);
                    oglr.addRect(x, y, -1, x+100, y+100, -1); // ни в какую
                    oglr.draw();
                    glSurfaceView.requestRender();
                    glSurfaceView.invalidate();
                }
            });
Буду очень благодарен за помощь
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.05.2017, 11:25
Ответы с готовыми решениями:

OpenGL ES 2.0: Асинхронная подгрузка сцены
Здравствуйте! Никак не могу разобраться, как на Android в OpenGL ES 2.0...

Создание сцены в OpenGL
Помогите создать сцену в OpenGL, только начал изучать вижуал си и OpenGL и...

Сохранение сцены OpenGL в bmp
Доброго времени суток. Передо мной стоит такая задача: Имеется некоторая...

обновление сцены
при нажатии правой кнопкой кораблик меняет совою ориентацию (сверху исходное...

Обновление OpenGL для запуска игры
проблемы с OpenGL...не могу запустить гаму..нужен OpenGL 1.4 а где его достать...

2
vxg
Модератор
3278 / 2075 / 327
Регистрация: 13.01.2012
Сообщений: 8,055
30.05.2017, 07:26 2
Лучший ответ Сообщение было отмечено den_droid как решение

Решение

den_droid, посмотрите работающий пример тут Вращение фигуры в SurfaceView
1
den_droid
6 / 7 / 1
Регистрация: 18.05.2015
Сообщений: 191
30.05.2017, 12:16  [ТС] 3
vxg, спасибо огромное! Буду разбираться!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2017, 12:16

Perl + OpenGL Как избавиться от повторного подключения библиотеки OpenGL в модулях
Доброго времени суток! Сегодня решил заняться программированием на языке...

Чем отличаются готовые сборки Qt под Win + MSVC с OpenGL и без OpenGL?
Ну вопрос собственно в том, что мне не очень понятно, что же в сборке кьюте без...

OpenGL Ваша текущая конфигурация рабочего стола не поддерживает OpenGL Аппаратное ускорение.
всем здрасте ) скачал opengl extensions viewer решил проверить драйверы на...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru