Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
contedevel
57 / 55 / 13
Регистрация: 07.10.2012
Сообщений: 606
1

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

10.02.2015, 17:20. Просмотров 809. Ответов 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
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.02.2015, 17:20
Ответы с готовыми решениями:

Подключить стороннюю NDK-библиотеку к своему NDK-проекту
Пытаюсь подключить к своему (на самом деле не совсем своему) NDK-проекту...

Не загружаются данные в Firebase отдельно друг от друга
Подскажите в чем проблема. Есть 2 EditText и ImageView. Если заполнить все поля...

AS и Ndk
Здравствуйте На официальном сайте в разделе ndk почему- то описывается eclipse...

Подключить NDK
(моя 101я попытка начать работать с NDK) Чуть сдвинулся, но не хватает...

Использование NDK
Пытаюсь освоить NDK... И как всегда не хватает ЗАДАНИЙ! Не могу придумать где...

4
EVP
503 / 266 / 59
Регистрация: 14.12.2010
Сообщений: 535
10.02.2015, 19:17 2
Лучший ответ Сообщение было отмечено contedevel как решение

Решение

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

Добавлено через 3 минуты
Цитата Сообщение от EVP Посмотреть сообщение
Лучше приложение собрать под Win32 и портировать готовое в Android.
Да, так проблем не было, пока первая ошибка, причем мне не понятная... А под Linux собирать, я и там так же напишу)
0
EVP
503 / 266 / 59
Регистрация: 14.12.2010
Сообщений: 535
10.02.2015, 19:29 4
Цитата Сообщение от contedevel Посмотреть сообщение
Так а что не так-то? Я с C++ на Вы.
Я привёл исправленную строчку, а у тебя неправильная в C++ варианте -- второй параметр смотри.
Невнимательность - очень страшный и коварный враг, который подкрадывается незаметно...
1
contedevel
57 / 55 / 13
Регистрация: 07.10.2012
Сообщений: 606
10.02.2015, 19:31  [ТС] 5
Цитата Сообщение от EVP Посмотреть сообщение
Я привёл исправленную строчку, а у тебя неправильная в C++ варианте -- второй параметр смотри.
Невнимательность - очень страшный и коварный враг, который подкрадывается незаметно...
Вай, даже не заметил Спасибо Вам за помощь!
0
10.02.2015, 19:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.02.2015, 19:31

Android NDK
Здравствуйте. Хотелось бы написать пару программок на андроид, но джаву вообще...

Android NDK
Здравствуйте, форумчане. Появилось пара вопросов относительно Android NDK... ...

NDK C vs C++ и примеры
Гуру NDK! Посоветуйте! В очередной раз взялся за NDK и вдруг получилось......


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

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

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