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

Программирование Android

Войти
Регистрация
Восстановить пароль
 
contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 596
#1

NDK некорректно загружаются данные в шейдер - Android

10.02.2015, 17:20. Просмотров 267. Ответов 4
Метки нет (Все метки)

Здравствуйте!
Имеется java-функция, которая прекрасно работает
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private void tileRender(EasyTexture texture, int programHandler) {
        int textureStartHandler = GLES20.glGetUniformLocation(programHandler, "uv0");
        GLES20.glUniform2fv(textureStartHandler, 1,
                new float[] {texture.getLeftBound(), texture.getTopBound()}, 0);
 
        int textureEndHandler = GLES20.glGetUniformLocation(programHandler, "uv1");
        GLES20.glUniform2fv(textureEndHandler, 1,
                new float[] {texture.getRightBound(), texture.getBottomBound()}, 0);
 
        int tileCountHandler = GLES20.glGetUniformLocation(programHandler, "vTileCount");
        if(tileCountHandler != -1)
            GLES20.glUniform2fv(tileCountHandler, 1,
                    new float[]{texture.getScaleX(), texture.getScaleY()}, 0);
    }


Мне нужен ее C++ аналог, написал так
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
JNIEXPORT void JNICALL Java_com_contedevel_lastlegend_core_render_EasyRenderer_tileRender
  (JNIEnv *, jclass, jfloat left, jfloat top, jfloat right, jfloat bottom, jfloat scaleX, jfloat scaleY, jint hProgram) {
    int hTextureStart = glGetUniformLocation(hProgram, "uv0");
    float uv0[2] = {(float)left, (float)right};
    glUniform2fv(hTextureStart, 1, (GLfloat *)uv0);
 
    float uv1[2] = {(float)right, (float)bottom};
    int hTextureEnd = glGetUniformLocation(hProgram, "uv1");
    glUniform2fv(hTextureEnd, 1, (GLfloat *)uv1);
 
    int hTileCount = glGetUniformLocation(hProgram, "vTileCount");
    
    if(hTileCount == -1)
        return;
 
    float tileCount[2] = {(float)scaleX, (float)scaleY};
    glUniform2fv(hTileCount, 1, (GLfloat *)tileCount);
}


Шейдер такой
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
precision mediump float;
 
uniform sampler2D sTexture;
uniform vec2 uv0;
uniform vec2 uv1;
uniform vec2 vTileCount;
 
varying vec2 vTextureCoordinates;
 
void main( void ) {
     vec2 delta = uv1 - uv0;
     vec2 uv = delta * vTextureCoordinates * vTileCount;
     vec2 tile = mod(floor(uv / delta), vec2(2, 2));
 
     uv = mod(uv, delta);
     vec2 uvInverse = delta - uv;
     uv = mix(uv, uvInverse, ceil(tile / vec2(2, 2))) + uv0;
 
     gl_FragColor = texture2D(sTexture, uv);
}


Что не так с C++ функцией? Такое чувство, что glUniform2fv берёт только первое значение из массива...

Добавлено через 11 минут
P.S. Из java в C++-функцию данные передаются корректно, проверял, т.е. проблема именно в передаче данных в OpenGL
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.02.2015, 17:20     NDK некорректно загружаются данные в шейдер
Посмотрите здесь:

Android Android NDK
Android NDK и SDK
Android Android NDK
Android SDK or NDK
Подключить NDK Android
NDK C vs C++ и примеры Android
Использование NDK Android
Android Где скачать NDK?
Android Чтение файла из ndk
Android TCP клиент в NDK
Работа с камерой и NDK Android
AS и Ndk Android

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
EVP
320 / 242 / 43
Регистрация: 14.12.2010
Сообщений: 462
10.02.2015, 19:17     NDK некорректно загружаются данные в шейдер #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от contedevel Посмотреть сообщение
Что не так с C++ функцией? Такое чувство, что glUniform2fv берёт только первое значение из массива...
4-ая строчка:
C++
1
float uv0[2] = {(float)left, (float)top};
Если пишешь без отладки, так и будет.
Лучше приложение собрать под Win32 и портировать готовое в Android.
Без отладки не получится написать что-то сложное.
contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 596
10.02.2015, 19:22  [ТС]     NDK некорректно загружаются данные в шейдер #3
Цитата Сообщение от EVP Посмотреть сообщение
4-ая строчка:
Так а что не так-то? Я с C++ на Вы.

Добавлено через 3 минуты
Цитата Сообщение от EVP Посмотреть сообщение
Лучше приложение собрать под Win32 и портировать готовое в Android.
Да, так проблем не было, пока первая ошибка, причем мне не понятная... А под Linux собирать, я и там так же напишу)
EVP
320 / 242 / 43
Регистрация: 14.12.2010
Сообщений: 462
10.02.2015, 19:29     NDK некорректно загружаются данные в шейдер #4
Цитата Сообщение от contedevel Посмотреть сообщение
Так а что не так-то? Я с C++ на Вы.
Я привёл исправленную строчку, а у тебя неправильная в C++ варианте -- второй параметр смотри.
Невнимательность - очень страшный и коварный враг, который подкрадывается незаметно...
contedevel
57 / 55 / 8
Регистрация: 07.10.2012
Сообщений: 596
10.02.2015, 19:31  [ТС]     NDK некорректно загружаются данные в шейдер #5
Цитата Сообщение от EVP Посмотреть сообщение
Я привёл исправленную строчку, а у тебя неправильная в C++ варианте -- второй параметр смотри.
Невнимательность - очень страшный и коварный враг, который подкрадывается незаметно...
Вай, даже не заметил Спасибо Вам за помощь!
Yandex
Объявления
10.02.2015, 19:31     NDK некорректно загружаются данные в шейдер
Ответ Создать тему
Опции темы

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